利用frp实现内网穿透

FRP 工具介绍

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。可能听说过花生壳的读者对此比较熟悉,就是提供一种通道,让位于外网的用户访问位于局域网内的机器提供的服务。

另一个ngrok,1.0版本是开源的,但2.0就不再开源了,所以,我们这里利用的是开源的frp.

官网地址: https://github.com/fatedier/frp
提供了详细的中文文档。

前提

需要拥有一个位于公网的VPS或者ECS,笔者这里用的是腾讯云。

服务器端

下载release版,解压,编辑frps.ini文件:

1
2
3
4
[common]
server_addr = x.x.x.x #这里写你的公网VPS的IP地址
bind_port = 7000 #这里写服务器提供的端口
vhost_http_port = 7001 #这里是服务器对外提供http服务的端口

然后启动:

1
./frps -c frps.ini

服务器显示:
server

客户端(局域网服务器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = x.x.x.x #这里写你的公网VPS的IP地址
server_port = 7000 #这里要与服务器端的一致

[web]
type = http
local_port = 80
custom_domains = www.yy.com #公网访问的地址

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

然后启动服务:

1
./frpc -c ./frpc.ini

客户端输出:
client

测试

在客户端启动一个简单的web服务:

1
python -m SimpleHTTPServer 80

在公网访问:www.yy.com 就能看到你内网的提供的web服务了。

ssh穿透访问

想要用ssh的方式穿透访问到LAN的主机,可以使用如下的命令:

1
ssh -oPort=6000 username@x.x.x.x

把frp设置成服务

利用systemd可以轻松地把frp设置成系统服务,在/etc/systemd/system中新建一个frps.service文件

1
2
3
4
5
6
7
8
9
10

[Unit]
Description=frps daemon

[Service]
Type=simple
ExecStart=/home/ubuntu/frp/frp_0.17.0_linux_amd64/frps -c /home/ubuntu/frp/frp_0.17.0_linux_amd64/frps.ini

[Install]
WantedBy=multi-user.target

然后启动改服务

1
2
systemctl daemon-reload
systemctl enable frps

之后就可以利用system start\stop\restart等命令来管理服务了

安全的连接设置

虽然我们现在可以利用frp穿透访问了,但是我们的服务器端口是暴漏在公网上的,任何知道端口的人都可以连接,这显然不是我们希望的,给端口的访问设置一个认证的机制就是十分必要了。认证的方法是在配置文件中加入如下配置:

1
2
3
[common]
....
token = Mixoo_Frp_1234

这里是0.17版,0.10版本以后的auth_token和privilege_token 经测试均已失效。另外,建议对服务端和客户端的版本保持一致。

dashboard

frp也支持在web中监控流量的访问,配置如下:

1
2
3
4
dashboard_port = 7500
# dashboard's username and password are both optional,if not set, default is admin.
dashboard_user = xxxx
dashboard_pwd = xxxxx

然后访问你的服务地址就可以了:http://yourwebservice:port/

dashboard

你的支持我的动力