自建frp服务实现内网穿透

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

这里使用 clangcn一键安装脚本,用于 VPS 上安装 frp。

支持的平台:

  • Centos 6/7 32/64bit
  • Debian 6/7 32/64bit
  • Ubuntu 14 32/64bit

安装

下载脚本

1
$ wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh

修改权限

1
$ chmod 700 ./install-frps.sh

开始安装

1
$ ./install-frps.sh install

安装过程选项的说明

选项 说明 默认
download_url frp 镜像源下载地址 aliyun
bind_port frp 提供服务的端口 5443
vhost_http_port http 服务端口 80
vhost_https_port https 服务端口 443
dashboard_port frps 仪表盘端口,用于查看 frp 工作状态 6443
dashboard_user 仪表盘登录账号 admin
dashboard_pwd 仪表盘登录密码 随机
token frps 和 frpc 通讯密码 随机
max_pool_count 每个代理的连接上线 50
log_level 日志等级 info
log_max_days 日志保留天数 3
log_file 是否开启日志 enable
tcp_mux 是否开启多路复用,减少 tcp 的握手延迟 enable
kcp support 是否开启 kcp enable

注意设置安全组或者防火墙

功能命令

命令 说明
frps start 启动
frps stop 停止
frps restart 重启
frps status 当前服务状态
frps config vi 编辑配置
frps version 查看版本
install-frps.sh update 更新脚本
install-frps.sh uninstall 卸载

fprc 配置

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

首先是 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 中转,不过已经完全够用了。

坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文作者: Leo
  • 本文链接: https://xuebin.me/posts/fc2d1561.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!