使用frp进行内网穿透

102 0 0 0

为什么需要内网穿透功能

从公网中访问自己的私有设备向来是一件难事儿。 自己的主力台式机、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。 试了一下几种方法:

  • 远程桌面使用TeamViewer。可用,但需要访问端也拥有TeamViewer软件,不是很方便,希望能使用Windows自带的远程桌面。且TeamViewer不易实现远程文件访问。
  • 使用蒲公英VPN软件进行组网,可用,但免费版本网络速度极慢,体验不佳,几乎无法正常使用。
  • 使用花生壳软件进行DDNS解析,可用,但同第二点所述,免费版本有带宽限制,无法实际使用。
  • 搭建frp服务器进行内网穿透,可用且推荐,可以达到不错的速度,且理论上可以开放任何想要的端口,可以实现的功能远不止远程桌面或者文件共享。

准备工作

  • 首先需要一台外网服务器作为服务端
  • 一台内网机器作为客户端
  • 客户端连接服务端,访问服务端的请求转发给客户端

frp是什么

简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。

下载frp

下载地址

服务端

下载解压后主要使用以下文件

  • frps
  • frps.ini
  • frpc
  • frpc.ini

frps开头表示服务端,frpc开头表示客户端

修改frps.ini文件

[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
  • "bind_port"表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
  • "dashboard_port"是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。
  • "token"是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
  • "dashboard_user"和"dashboard_pwd"表示打开仪表板页面登录的用户名和密码,自行设置即可。
  • "vhost_http_port"和"vhost_https_port"用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。

启动服务端

./frps -c frps.ini

看到下面日志表示启动成功

2022/04/02 04:57:39 [I] [root.go:200] frps uses config file: frps.ini
2022/04/02 04:57:39 [I] [service.go:192] frps tcp listen on 0.0.0.0:9503
2022/04/02 04:57:39 [I] [service.go:294] Dashboard listen on 0.0.0.0:9501
2022/04/02 04:57:39 [I] [root.go:209] frps started successfully

后台启动 nohup ./frps -c frps.ini &

访问服务器ip:7500就可以看到仪表板界面

客户端

修改配置

修改frpc.ini文件

[common]
server_addr = 服务器ip
server_port = 9503
token = 12345678
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 220
[mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 33060
[redis]
type = tcp
local_ip = 127.0.0.1
local_port = 6379
remote_port = 6380

其中common字段下的三项即为服务端的设置。

  • "server_addr"为服务端IP地址,填入即可。
  • "server_port"为服务器端口,填入你设置的端口号即可,如果未改变就是7000
  • "token"是你在服务器上设置的连接口令,原样填入即可。

ssh、mysql、redis字段都是自己定义的规则,自定义端口对应时格式如下

  • "[xxx]"表示一个规则名称,自己定义,便于查询即可。
  • "type"表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要请自行查询frp手册。
  • "local_port"是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。
  • "remote_port"是该条规则在服务端开放的端口号,自己填写并记录即可。

启动客户端

./frpc -c frpc.ini

看到下面日志表示启动成功

2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [mysql-1] start proxy success
2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [ssh] start proxy success
2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [mysql] start proxy success
2022/04/02 16:50:18 [I] [service.go:304] [9deda624de5b908f] login to server success, get run id [9deda624de5b908f], server udp port [0]
2022/04/02 16:50:18 [I] [proxy_manager.go:144] [9deda624de5b908f] proxy added: [ssh mysql mysql-1 redis redis-1]
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [redis] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [ssh] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [mysql-1] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [redis-1] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [mysql] start proxy success

后台启动 nohup ./frpc -c frpc.ini &

目录