利用frp实现内网穿透

利用frp实现内网穿透

0. 前言

出门在外,想访问家里的NAS、树莓派、文件等时,或者是想远程控制家里的电脑,我们会面临无法直接连接这些设备的问题,因为这些设备通常位于内网之中。在内网中的设备中,由于没有公网ip,所以我们在外面是无法直连上。而借助Frp这样一款优秀的内网穿透工具,这个问题可以迎刃而解。


1. 简介

frp原理图

Frp 是一个高性能的可用于内网穿透的的反向代理软件,支持 tcp, udp 协议,并为 http 和 https 协议提供了额外的能力。借助于frp这款软件,你在外面可以轻松地穿透内网,访问到内网中的服务,当然前提是你得有一台有公网ip的服务器

它的原理如上图所示,当运行在公网上的frp服务端程序收到访问请求后,会将其转发内网中的frp客户端,由frp客户端再转发至内网中的某个服务。一句话总结就是,frp可以建立起这样一个映射:<公网ip>:<公网port> --> <内网ip>:<内网port>

Frp是基于Go语言开发的,所以它的服务端和客户端能跨平台地运行在macOS、Windows、Linux和BSD等操作系统,支持x86、ARM和mips等架构处理器。


2. 入门教程

入门教程将尽量采用默认配置,以远程控制内网中的Windows电脑为例。

2.1 服务端部署

在你的有公网ip的服务器上操作,以Linux为例,处于简单示例的目的,这里均采用默认配置。

# 下载官方压缩包,根据服务器的操作系统进行选择,这里以centOS7为例
yum -y install wget && wget https://github.com/fatedier/frp/releases/download/v0.31.2/frp_0.31.2_linux_amd64.tar.gz
​
# 解压压缩包
tar -zxvf frp_0.31.2_linux_amd64.tar.gz
​
# 进入目录
cd frp_0.31.2_linux_amd64
​
# 设置后台运行frp服务端
nohup ./frps -c ./frps.ini &

完成再,我们查看日志nohup.out,有如下输出start frps success即证明运行成功。

日志

打开防火墙的7000端口即可(对于云服务器而言需要在网站面板上进行操作)。

以腾讯云服务器安全组为例

2.2 客户端部署

在内网进行客户端的部署,这里以访问内网中Windows电脑的远程桌面为例。

首先下载Windows系统的frp压缩包并解压。

修改目录下frpc.ini文件的内容。

[common]
# 请替换你自己的服务器ip地址
server_addr = x.x.x.x
# 服务器frp的端口,默认7000
server_port = 7000

[rdp]
# 协议类型,需要指定
type = tcp
# 本地ip地址,填这个就可以
local_ip = 127.0.0.1
# 内网服务的端口,这里的3389是Windows远程桌面的端口号
local_port = 3389
# 在公网服务器映射的端口号,自行设定,务必记得在公网服务器防火墙上打开这个端口
remote_port = 4578  

然后再cmd命令行中进入该解压后的目录,输入并回车(不要关闭窗口)

frpc -c frpc.ini

接下来是在Windows电脑设置开启远程桌面功能

设置远程桌面

2.3 访问

此时你的访问就很简单了,使用远程桌面软件(例如Windows自带的远程桌面,或Microsoft remote desktop,也支持macOS、Android、iOS),输入<server_addr>:<remote_port>(替换为上面的参数),就可以访问到内网中的服务。

iOS版RD Client连接效果图


3. 进阶使用

该部分按需阅读

3.1 文件组成

frp的压缩包解压后,我们可以发现这样几个文件

其中frpc是客户端可执行文件,frpc.ini是客户端配置文件,frpc_full.ini是客户端完整配置示例文件,类似地,frps开头的是服务端的文件。

3.2 身份验证

之前的入门教程中可以发现,我们没有配置任何校验身份的内容,这显然是不安全的,任何知道你公网ip的人都可以连接frp服务端软件。要设置也十分简单,服务端和客户端的 [common]节点配置一样的 token 参数。

服务端frps.ini示例

[common]
# 略去其他配置
token = 12345678

客户端frpc.ini示例

[common]
# 略去其他配置
token = 12345678

3.3 限速

目前frp仅支持客户端的限速,在配置中某一个服务节点下面增加 bandwidth_limit 字段启用此功能。

客户端frpc.ini示例

# 某个服务节点下
[some_service]
# 其他配置略,单位仅支持 MB和KB
bandwidth_limit = 1MB

3.4 P2P内网穿透

如果你的服务器带宽过小,限制体验,或者说你的服务器是按流量计费,而访问对应的内网服务需要耗费大量的流量,那么你可以尝试P2P内网穿透。P2P内网需要在两边都部署上 frpc 用于建立直接的连接,这样大量的流量就不再流经服务器,但是需要指出的是,这种穿透成功率较低,并不能穿透所有类型的 NAT 设备。

服务端frps.ini

[common]
# 在正常配置外,再添加一个udp端口
bind_udp_port = 7001

内网客户端frpc.ini配置完整示例,无需指定远程端口

# frpc.ini
[common]
# 请替换你自己的服务器ip地址
server_addr = x.x.x.x
# 服务器frp的端口,默认7000
server_port = 7000

# some_service请替换自己想要的名字
[some_service]
type = xtcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
# 端口根据服务就行修改
local_port = 22

要访问内网服务的设备上frpc.ini配置完整示例

# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[p2p_ssh_visitor]
type = xtcp
# xtcp 的访问者
role = visitor
# 要访问的 xtcp 代理的名字,自行替换
server_name = some_service
sk = abcdefg
# 绑定本地端口用于访问
bind_addr = 127.0.0.1
bind_port = 6000

欢迎大家关注我的专栏「 玩转云服务器 」,分享各种关于服务器的有趣应用。

玩转云服务器zhuanlan.zhihu.com图标

欢迎大家看我关于服务器选购和使用的回答。

我该选购哪种服务器?www.zhihu.com图标自己拥有一台服务器可以做哪些很酷的事情?www.zhihu.com图标

编辑于 09-11