通过frp实现内网穿透

之前讲过通过ngrok实现内网穿透,frp是和ngrok类似的工具,最近发现ngrok的一些不足,frp可以解决,主要有以下几点:

  1. ngrok不支持UDP穿透,这也是我更换成frp的最大原因。
  2. 映射TCP端口时不能指定服务器端口,只能接受随机分配的端口。
  3. ngrok在转发流量特别大的时候速度跟不上且不稳定,我用ngrok转发seafile网盘的流量,然后传1G以上的文件,会出现传不完就卡住失败甚至ngrok客户端出错崩溃的情况。
  4. ngrok是在编译客户端和服务器时预先成好证书,过程略烦琐,如果我有多个ngrok服务器,那么就要有多个不同的客户端可执行文件而不能通过相同的可执行文件不同的配置,这似乎不太合理。

搭建frp服务器

frp服务器可以通过docker搭建或者直接下载可执行文件
https://hub.docker.com/r/snowdreamtech/frps
https://github.com/fatedier/frp/releases
我是通过docker搭建的

1
docker run --restart=always --network host -d -v /etc/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps

可以看到需要一个配置文件frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板账号设置
dashboard_user = admin
dashboard_pwd = password
# 设置http及https协议下代理端口
vhost_http_port = 7080
vhost_https_port = 7443
# 子域名配置
subdomain_host = frp.kyo86.com
# 身份验证
token = 随意填一些字符

子域名需要配合指定*.frp.kyo86.com泛域名解析使用

客户端使用

客户端也可以通过docker或直接下载可执行文件
https://hub.docker.com/r/snowdreamtech/frpc
https://github.com/fatedier/frp/releases
有两种使用方式,一种是通过frpc.ini配置文件进行配置,一种是通过命令参数进行配置。

配置文件样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[common]
server_addr = 服务器IP
server_port = 7000
# 身份验证
token = 与服务端frps.ini中保存一致

[jenkins]
type = http
local_ip = 127.0.0.1
local_port = 8080
use_encryption = false
use_compression = false
subdomain = jenkins

[joplin]
type = tcp
local_ip = 127.0.0.1
local_port = 22300
route_port = 22300
use_encryption = false
use_compression = false

命令行的方式样例

1
2
3
frpc http -n 代理名称 -s frp服务器地址:frp服务器端口 -l 本地端口 --sd 子域名 -t TOKEN
frpc tcp -n 代理名称 -s frp服务器地址:frp服务器端口 -l 本地端口 -r 远程端口 -t TOKEN
frpc udp -n 代理名称 -s frp服务器地址:frp服务器端口 -l 本地端口 -r 远程端口 -t TOKEN