frp[1] 是一個(gè)專注于內(nèi)網(wǎng)穿透的高性能的反向代理應(yīng)用,支持 TCP、UDP、HTTP、HTTPS 等多種協(xié)議。可以將內(nèi)網(wǎng)服務(wù)以安全、便捷的方式通過(guò)具有公網(wǎng) IP 節(jié)點(diǎn)的中轉(zhuǎn)暴露到公網(wǎng)。
本文將以暴露內(nèi)網(wǎng) Web 服務(wù)為例,實(shí)踐 frp 的安裝部署。更多應(yīng)用場(chǎng)景,可見(jiàn) frp 示例[2]。
安裝
frp 主要由 客戶端(frpc) 和 服務(wù)端(frps) 組成,服務(wù)端通常部署在具有公網(wǎng) IP 的機(jī)器上,客戶端通常部署在需要穿透的內(nèi)網(wǎng)服務(wù)所在的機(jī)器上。
可以在 Github 的 Release[3] 頁(yè)面中下載到最新版本的客戶端和服務(wù)端二進(jìn)制文件。
本文公網(wǎng)、內(nèi)網(wǎng)機(jī)器都是 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/frpc@.service
frp_0.39.0_linux_amd64/systemd/frps@.service
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
公網(wǎng)
拷貝 frps 文件進(jìn)公網(wǎng)機(jī)器,假設(shè)其 IP 為 x.x.x.x:
scp frps* ubuntu@x.x.x.x:
修改 frps.ini 文件,設(shè)置監(jiān)聽(tīng) HTTP 請(qǐng)求端口為 8080:
cat <<-EOF > ~/frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
EOF
安裝 supervisor 進(jìn)行部署,后臺(tái)長(zhǎng)期運(yùn)行:
# 安裝 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
# 更新服務(wù)
sudo supervisorctl update all
# 查看服務(wù)
sudo supervisorctl status all
內(nèi)網(wǎng)
拷貝 frpc 文件進(jìn)內(nèi)網(wǎng)機(jī)器,假設(shè)其 IP 為 192.168.1.100:
scp frpc* ubuntu@192.168.1.100:
修改 frpc.ini 文件,假設(shè) frps 所在的服務(wù)器的 IP 為 x.x.x.x,local_port 為本地機(jī)器上 Web 服務(wù)監(jiān)聽(tīng)的端口, 綁定自定義域名為 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。
如果服務(wù)器已經(jīng)有對(duì)應(yīng)的域名,也可以將 CNAME 記錄解析到服務(wù)器原先的域名。或者可以通過(guò)修改 HTTP 請(qǐng)求的 Host 字段來(lái)實(shí)現(xiàn)同樣的效果。
簡(jiǎn)單運(yùn)行服務(wù),進(jìn)行測(cè)試:
# 運(yùn)行 HTTP 服務(wù)
Python3 -m http.server 8000
# 運(yùn)行 frpc 服務(wù)
./frpc -c ./frpc.ini
# 訪問(wèn)測(cè)試
curl http://www.yourdomain.com:8080/
以 systemd 進(jìn)行部署,后臺(tái)長(zhǎng)期運(yùn)行:
# 拷貝文件
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
# 開(kāi)機(jī)啟動(dòng)
sudo systemctl enable frpc.service
# 啟動(dòng)服務(wù)
sudo systemctl start frpc.service
# 查看狀態(tài)
sudo systemctl status frpc.service
GoCoding 個(gè)人實(shí)踐的經(jīng)驗(yàn)分享,可關(guān)注公眾號(hào)!
腳注
[1] frp: https://github.com/fatedier/frp
[2] frp 示例:
https://gofrp.org/docs/examples/
[3] Release: https://github.com/fatedier/frp/releases