手機(jī)音樂網(wǎng)站程序源碼百度點(diǎn)擊器找名風(fēng)
使用Nginx前置代理與FRP實現(xiàn)安全內(nèi)網(wǎng)穿透
一、方案概述
本方案通過Nginx統(tǒng)一管理HTTPS證書和域名路由,FRP僅處理TCP層流量穿透,實現(xiàn):
- 多子域名共享443端口
- 證書集中管理
- 避免FRP重復(fù)處理HTTPS
- 生產(chǎn)級安全加固
二、服務(wù)端部署(FRP + Nginx)
1. FRP服務(wù)端配置(Docker版)
frps.toml
核心配置
bindAddr = "0.0.0.0"
bindPort = 7000 # FRP控制通道端口
transport.tls.force = true # 強(qiáng)制TLS加密auth.method = "token"
auth.token = "your_secure_token"# 開放Nginx轉(zhuǎn)發(fā)用的TCP端口范圍
allowPorts = [{ start = 10080, end = 10100 }]# 管理面板(可選)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin@Secure123"
Docker啟動命令
docker run -d --name frps \-p 7000:7000 \-p 7500:7500 \-p 10080-10100:10080-10100 \ # 映射開放Nginx轉(zhuǎn)發(fā)用的TCP端口范圍--network host \ # 推薦host模式避免端口映射嵌套-v /data/frp/frps.toml:/etc/frp/frps.toml \-v /data/frp/logs:/var/log/frp \snowdreamtech/frps:latest
端口映射說明:
7000
:FRP客戶端連接端口10080-10100
:Nginx反向代理轉(zhuǎn)發(fā)端口7500
:管理面板端口
2. Nginx服務(wù)端配置
證書準(zhǔn)備
mkdir -p /etc/nginx/ssl/
# 將證書放入以下路徑(需包含完整鏈)
/etc/nginx/ssl/www.loveddz.com.crt
/etc/nginx/ssl/www.loveddz.com.key
Nginx虛擬主機(jī)配置
# /etc/nginx/conf.d/frp_proxy.conf
# 主域名代理
server {listen 443 ssl;server_name www.loveddz.com;ssl_certificate /etc/nginx/ssl/www.loveddz.com.crt;ssl_certificate_key /etc/nginx/ssl/www.loveddz.com.key;location / {proxy_pass http://127.0.0.1:10080; # 轉(zhuǎn)發(fā)到FRP監(jiān)聽的端口proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}# 子域名代理示例
server {listen 443 ssl;server_name api.loveddz.com;ssl_certificate /etc/nginx/ssl/api.loveddz.com.crt;ssl_certificate_key /etc/nginx/ssl/api.loveddz.com.key;location / {proxy_pass http://127.0.0.1:10081;proxy_set_header Host $host;}
}
Docker啟動Nginx
docker run -d --name nginx \--network host \ # 與frps共享網(wǎng)絡(luò)命名空間-v /etc/nginx/conf.d:/etc/nginx/conf.d \-v /etc/nginx/ssl:/etc/nginx/ssl \nginx:latest
三、客戶端配置(FRP TCP模式)
frpc.toml
示例
# ========================
# 全局配置
# ========================
serverAddr = "114.113.112.111" # FRP服務(wù)器IP
serverPort = 7000 # 與服務(wù)端bindPort一致
auth.method = "token"
auth.token = "your_secure_token" # 與服務(wù)端auth.token一致
transport.tls.enable = true # 啟用TLS加密傳輸(必須與服務(wù)端一致)# ========================
# 代理配置(TCP模式)
# ========================# 代理1:主域名 www.loveddz.com→ 本地8088
[[proxies]]
name = "web_tcp"
type = "tcp" # 必須為tcp模式(由Nginx處理HTTPS)
localIP = "127.0.0.1"
localPort = 8088 # 本地服務(wù)端口
remotePort = 10080 # 對應(yīng)Nginx的proxy_pass端口# 代理2:子域名 api.loveddz.com→ 本地8089
[[proxies]]
name = "api_tcp"
type = "tcp"
localPort = 8089
remotePort = 10081 # Nginx中配置的另一個proxy_pass端口
四、安全加固建議
-
防火墻規(guī)則
# 僅開放必要端口 ufw allow 443,7000,7500,10080:10081/tcp
-
Nginx安全頭
add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header Content-Security-Policy "default-src 'self'";
-
FRP日志監(jiān)控
# 實時監(jiān)控異常連接 tail -f /data/frp/logs/frps.log | grep -E 'failed|error'
五、驗證與調(diào)試
-
檢查服務(wù)連通性
curl -vk https://www.loveddz.com curl -vk https://api.loveddz.com
-
端口占用檢查
ss -tulnp | grep -E '7000|7500|10080'
-
Nginx日志分析
docker logs -f nginx | grep "10080"
六、常見問題解決
問題現(xiàn)象 | 解決方案 |
---|---|
Nginx報502 Bad Gateway | 檢查FRP客戶端是否運(yùn)行,且localPort 與本地服務(wù)一致 |
HTTPS證書錯誤 | 確保證書包含完整鏈,且域名與server_name 完全匹配 |
FRP連接超時 | 檢查服務(wù)端防火墻/安全組是否放行7000 端口 |
七、方案優(yōu)勢
- 證書集中管理:無需在FRP中配置證書
- 性能優(yōu)化:Nginx處理HTTPS卸載,降低FRP負(fù)擔(dān)
- 擴(kuò)展性強(qiáng):新增子域名只需修改Nginx配置,無需重啟FRP
部署效果:
通過 https://www.loveddz.com
訪問本地8088端口服務(wù),https://api.loveddz.com
訪問8089端口服務(wù),所有HTTPS加密由Nginx統(tǒng)一處理。