FRP 內網穿透、反向代理

GoCoding發表於2022-02-15

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.xlocal_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 個人實踐的經驗分享,可關注公眾號!

相關文章