互联网上两个不同的主机进行通信首先需要知道对方 IP。根据 IP 协议,只有分配了公网IP的设备才能在互联网上通信和传输数据。而中国人口/设备众多,分配到的IPv4资源又少,因此绝大部分情况是通过路由器/交换机转换公网IP后才上网。
位于路由器/交换机后的设备一般是内网设备,分配的IP地址以 192.168/172.16/10.0 开头,属于内网 IP。要让内网设备对外提供服务,就需要进行内网穿透。
常见穿透工具包括:FRP, ZeroTier 等,本文仅介绍 FRP 的使用。
FRP(Fast Reverse Proxy)是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
基本原理:
服务端和客户端使用的都是同一份文件,只是配置文件和启动文件不同。因此只需要下载一份文件,并按类型分成两份。
下载地址:https://github.com/fatedier/frp/releases
服务器是 x86_64 架构,因此下载 linux_amd64 版本
通过命令行下载并解压:
wget -c https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz
tar -xvf frp_0.53.2_linux_amd64.tar.gz
mv frp_0.53.2_linux_amd64 frp
查看目录:
.
├── frpc
├── frpc_full.ini
├── frpc.ini
├── frps
├── frps_full.ini
├── frps.ini
└── LICENSE
这些文件分成两部分。
将两类文件分别打包
mkdir client server
mv frpc* client
mv frps* server
将 server
目录上传到公网服务器任意路径。如果需要自动启动,看下一节。如下编辑 frps.ini,参数见注释。
[common]
# frp监听的端口,默认是7000,可修改
bind_port = 7000
# frp面板端口、用户名和密码,请改成更复杂的。
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin123456
# 授权码,请改成更复杂的,这个token之后在客户端会用到
token = e10adc3949ba59abbe56e057f20f883e
# 设置HTTP及https协议下代理端口(非重要)
# vhost_http_port = 7080
# vhost_https_port = 7081
# 去除TCP速度限制
tcp_mux = false
# enable_prometheus = true
# frp日志配置
log_file = /home/frp/frp/frps.log
log_level = info
log_max_days = 3
其中授权码可以用 pwgen
命令来生成,这个授权码之后在客户端还会用到。
sudo apt install pwgen -y
pwgen -s 32 1
运行服务:
./frps -c frps.ini
记得防火墙打开云服务器的7500端口和其他所有提到的端口,这些端口可以用’,'分割,在一个规则中同时打开。然后网页输入公网IP:7500
,输入设置的账户和密码,登录后即可看到 frp 的状态。
把 frps 添加为系统服务,这一来当系统重启时,Frps 服务会自动启动,并且不需要手动再次启动。
将 frps, frps.ini
文件放到系统目录下,比如
sudo mv frps /usr/bin/ # frps 可执行文件
sudo mkdir /etc/frp
sudo mv frps.ini /etc/frp/ # 配置文件
然后新建文件:frps.service,内容如下:
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
[Install]
WantedBy=multi-user.target
这里 ExecStart
的路径要和 frps 的路径一致。
将文件复制到自启服务项:
sudo cp frps.service /usr/lib/systemd/system/
设置自启动,并启动服务
systemctl enable frps # 允许自启动
# 执行成功会提示“Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /usr/lib/systemd/system/frps.service.”
systemctl start frps # 启动客户端服务
服务端配置后,就可以配置客户端了。
将 client
目录上传到内网服务器,如下编辑 frpc.ini,参数见注释。
[common]
# 服务端公网ip、监听端口bind_port
server_addr = x.x.x.x
server_port = 7000
# 服务端的授权码
token = e10adc3949ba59abbe56e057f20f883e
# 去掉速度限制
tcp_mux = false
[ssh]
type = tcp # 这里几乎都是tcp,默认不用动
local_ip = 127.0.0.1
local_port = 22
remote_port = 2288
# [ssh] 为服务名称,下方解释:访问frp服务端的2288端口时,等同于通过中转服务器访问127.0.0.1的22端口。
# type 为连接的类型,此处为tcp
# local_ip 为中转客户端实际访问的IP
# local_port 为目标端口
# remote_port 为远程端口,记得服务端的防火墙打开这个端口
第一处 common
是公共配置,第二处 ssh
是需要映射的服务。同样地,本地执行 ./frpc -c frpc.ini
即可启动客户端。
建议使用 tmux 在后台启动服务,也可以通过docker启动服务
# docker镜像:snowdreamtech/frps
# 重启:always
# 网络模式:host
# 文件映射:/etc/frp/frps.ini:/etc/frp/frps.ini
docker run --restart=always --network host -d -v /etc/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps
回到服务器的dashboard界面,找到tcp端口,可以看到2288端口已经是online状态,即绑定成功。以上所有相当于公网IP:2288对应127.0.0.1:22
在上面的client端继续配置
[common]
# 服务端公网ip、监听端口bind_port
server_addr = x.x.x.x
server_port = 7000
# 服务端的授权码
token = e10adc3949ba59abbe56e057f20f883e
# 去掉速度限制
tcp_mux = false
[ssh]
type = tcp # 这里几乎都是tcp,默认不用动
local_ip = 127.0.0.1
local_port = 22
remote_port = 2288
[4090 server] # 服务名字,可以有空格,不能与已有服务命名重复
type = tcp
local_ip = 192.168.3.25 # 改成内网服务的ip
local_port = 6580 # 改成内网服务的port
remote_port = 8001 # 修改公网服务端的端口,记得防火墙增加该端口,可以将8000-9000端口在一个规则中全部打开作为服务使用。
随笔整理