frp 是一個專注於內網穿透的高效能的反向代理應用,支援 TCP、UDP、HTTP、HTTPS 等多種協議。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
本文將以暴露內網 Web 服務為例,實踐 frp 的安裝部署。更多應用場景,可見 frp 示例。
安裝
frp 主要由 客戶端(frpc) 和 服務端(frps) 組成,服務端通常部署在具有公網 IP 的機器上,客戶端通常部署在需要穿透的內網服務所在的機器上。
可以在 Github 的 Release 頁面中下載到最新版本的客戶端和服務端二進位制檔案。
本文公網、內網機器都是 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
公網
拷貝 frps
檔案進公網機器,假設其 IP 為 x.x.x.x
:
scp frps* ubuntu@x.x.x.x:
修改 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* ubuntu@192.168.1.100:
修改 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 個人實踐的經驗分享,可關注公眾號!