frp[1] 是一個專注于內網穿透的高性能的反向代理應用,支持 TCP、UDP、HTTP、HTTPS 等多種協議。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
本文將以暴露內網 Web 服務為例,實踐 frp 的安裝部署。更多應用場景,可見 frp 示例[2]。
安裝
frp 主要由 客戶端(frpc) 和 服務端(frps) 組成,服務端通常部署在具有公網 IP 的機器上,客戶端通常部署在需要穿透的內網服務所在的機器上。
可以在 Github 的 Release[3] 頁面中下載到最新版本的客戶端和服務端二進制文件。
本文公網、內網機器都是 linux x86_64,所以選擇了 frp_0.39.0_linux_amd64.tar.gz。解壓:
$ tar xzvf frp_0.39.0_linux_amd64.tar.gz
frp_0.39.0_linux_amd64/
frp_0.39.0_linux_amd64/frps
frp_0.39.0_linux_amd64/frps_full.ini
frp_0.39.0_linux_amd64/systemd/
frp_0.39.0_linux_amd64/systemd/[email protected]
frp_0.39.0_linux_amd64/systemd/[email protected]
frp_0.39.0_linux_amd64/systemd/frpc.service
frp_0.39.0_linux_amd64/systemd/frps.service
frp_0.39.0_linux_amd64/LICENSE
frp_0.39.0_linux_amd64/frpc.ini
frp_0.39.0_linux_amd64/frpc_full.ini
frp_0.39.0_linux_amd64/frps.ini
frp_0.39.0_linux_amd64/frpc
公網
拷貝 frps 文件進公網機器,假設其 IP 為 x.x.x.x:
scp frps* [email protected]:
修改 frps.ini 文件,設置監聽 HTTP 請求端口為 8080:
cat <<-EOF > ~/frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
EOF
安裝 supervisor 進行部署,后臺長期運行:
# 安裝 supervisor
sudo apt install supervisor -y
# 添加配置
sudo -i
cat <<-EOF >> /etc/supervisor/supervisord.conf
[program:frps]
directory=/home/ubuntu
command=/home/ubuntu/frps -c /home/ubuntu/frps.ini
priority=999
autostart=true
autorestart=true
startsecs=10
startretries=3
stdout_logfile=/var/log/frps_out.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/frps_err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
environment=
nocleanup=false
EOF
exit
# 更新服務
sudo supervisorctl update all
# 查看服務
sudo supervisorctl status all
內網
拷貝 frpc 文件進內網機器,假設其 IP 為 192.168.1.100:
scp frpc* [email protected]:
修改 frpc.ini 文件,假設 frps 所在的服務器的 IP 為 x.x.x.x,local_port 為本地機器上 Web 服務監聽的端口, 綁定自定義域名為 custom_domains。
cat <<-EOF > ~/frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 8000
custom_domains = www.yourdomain.com
EOF
將 www.yourdomain.com 的域名 A 記錄解析到 IP x.x.x.x。
如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。或者可以通過修改 HTTP 請求的 Host 字段來實現同樣的效果。
簡單運行服務,進行測試:
# 運行 HTTP 服務
Python3 -m http.server 8000
# 運行 frpc 服務
./frpc -c ./frpc.ini
# 訪問測試
curl http://www.yourdomain.com:8080/
以 systemd 進行部署,后臺長期運行:
# 拷貝文件
sudo cp frpc /usr/bin/frpc
sudo mkdir -p /etc/frp
sudo cp frpc.ini /etc/frp/frpc.ini
# 添加配置(frp 給的 systemd 配置)
sudo -i
cat <<-EOF > /etc/systemd/system/frpc.service
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
EOF
exit
# 重載配置
sudo systemctl daemon-reload
# 開機啟動
sudo systemctl enable frpc.service
# 啟動服務
sudo systemctl start frpc.service
# 查看狀態
sudo systemctl status frpc.service
GoCoding 個人實踐的經驗分享,可關注公眾號!
腳注
[1] frp: https://github.com/fatedier/frp
[2] frp 示例:
https://gofrp.org/docs/examples/
[3] Release: https://github.com/fatedier/frp/releases