自建frp服务实现内网穿透

frp是一款内网穿透工具,在现在宽带没有公网 IP 的年代,NAS 服务器之类的,必须使用内网穿透来解决 WAN 下的访问问题。

网上有很方便的一键安装脚本,用于 VPS 上安装 frp。

关于这个 一键安装脚本 的使用可以参考这篇文章: https://www.zhihu.in/archives/261

这里主要说一下服务器以及客户端的配置:

首先是 frps.ini,这个文件一般是脚本配置后自动生成的,这里注释说明一下并稍微添加修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[common]
bind_addr = 0.0.0.0 # 可以访问frp的目标IP地址,0.0.0.0为不限制
bind_port = 5443 # tcp主要端口
kcp_bind_port = 5443 # kcp端口(使用的是udp),可以和tcp端口相同
bind_udp_port = 7001 # 打开一个udp端口,以便使用p2p等功能
dashboard_port = 6443 # web控制台访问端口,如果不打算用控制台,可以不用设置
dashboard_user = admin # web控制台的用户名,建议更改
dashboard_pwd = xxxxxxxx # web控制台的登录密码
vhost_http_port = 82 # 如果不打算在VPS上架设网站,这里可以用80端口
vhost_https_port = 444 # https的代理端口,需要证书,配置较复杂,如果VPS上不架设网站,这里可以用443端口
log_file = /dev/null # 不生成log
log_level = error
log_max_days = 3
privilege_token = xxxxxxxxxxxxxxxx # 这里是认证令牌,自用的话必须设置
privilege_allow_ports = 1-65535 # 可限制frps使用的端口范围,该范围需要在VPS的防火墙中打开
max_pool_count = 50 #自用的话50足够了
tcp_mux = true
subdomain_host = xxx.com #这里可以用A记录绑定VPS的IP

下面是关于客户端的配置,假设有一台路由器 A 以及一台位于其他位置的电脑 B,其中 A 为 24 小时开机,A 内设有 Syncthing 用来同步其他设备,并安装 sftp。

现在需要开放 A 中的 Syncthing、sftp、ssh 供 B 访问(其中 sftp 与 ssh 端口相同),需要进行的 frpc.ini 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[common]
server_addr = xxx.xxx.xxx.xxx # VPS的IP或绑定的域名
server_port = 5443
privilege_token = xxxxxxxxxxxxxxxx # 之前frps.ini中对应的令牌
protocol = kcp # 这里可以是tcp或kcp

[ssh]
type = tcp # 这里不要因为前面设置了kcp就填上kcp
local_ip = 127.0.0.1 # 因为是本机,所以这样就可以了
local_port = 22 本地路由器A的ssh端口,因为会暴露出来,建议从该设备中更改端口
remote_port = 50022 # 会打开新的VPS端口,请确定防火墙通过
use_encryption = false # 是否加密,一般不需要
use_compression = false # 是否压缩,会影响CPU使用

[sync]
type = http
local_ip = 127.0.0.1
local_port = 8384 # Syncthing的端口
use_encryption = false
use_compression = true
subdomain = sync # 这里如果不指定,将使用上面方括号内的服务名为二级域名;如果VPS中没指定subdomain_host,则这里需要用custom_domains来指定一个访问域名,该域名应当解析到VPS上

[p2p_ssh] # 这里配置的p2p是可以穿透VPS,让两台设备直接相连,这才是我想要的
type = xtcp # 会使用上面的7001端口
sk = heartnn # 这里的字符也会在电脑B中设置,类似于令牌之类的
local_ip = 127.0.0.1
local_port = 22

经过设置,可以在任意设备中输入http://sync.xxx.com:82来访问 Syncthing 的控制台,也可以用 xxx.com:50022 来访问

电脑 B 中的 frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
[common] # 与上面相同即可
server_addr = xxx.xxx.xxx.xxx
server_port = 5443
privilege_token = xxxxxxxxxxxxxxxx
protocol = kcp

[p2p_ssh_visitor] # 这里是上面对应的p2p访问者配置
type = xtcp
role = visitor # 访问者
server_name = p2p_ssh # 对应A中的服务名称
sk = heartnn
bind_addr = 127.0.0.1 # 在电脑B本地访问
bind_port = 50022 # 这里是电脑B本地端口,与其他无关

经过设置,B 与 A 可以通过 p2p 直连,heartnn 测试过 sftp 完全没问题,但 ssh 没能通过 p2p,只能过 VPS 中转,不过已经完全够用了。

坚持原创技术分享,您的支持将鼓励我继续创作!