瀑布流網(wǎng)站史上最強(qiáng)大的搜索神器
搞了一個(gè)晚上,終于建立了一個(gè)內(nèi)網(wǎng)穿透。和AI配合,還是得自己思考,AI配合才能搞定,不思考只依賴AI也不行。內(nèi)網(wǎng)服務(wù)器只是簡(jiǎn)單地使用了python -m http.server 8899,但是對(duì)于Gradio建立的服務(wù)器好像不行,會(huì)出問(wèn)題。
問(wèn)題背景
需求
- 將內(nèi)網(wǎng)的 Web 服務(wù)器(
http://localhost:8899
)通過(guò) SSH 隧道映射到外網(wǎng)服務(wù)器,使外網(wǎng)可以通過(guò)外網(wǎng)服務(wù)器的8080
端口訪問(wèn)內(nèi)網(wǎng)服務(wù)。
環(huán)境
- 內(nèi)網(wǎng)服務(wù)器:
- Web 服務(wù)運(yùn)行在
localhost:8899
。 - 可以訪問(wèn)外網(wǎng)服務(wù)器,但外網(wǎng)服務(wù)器無(wú)法直接訪問(wèn)內(nèi)網(wǎng)服務(wù)器(由于防火墻限制)。
- Web 服務(wù)運(yùn)行在
- 外網(wǎng)服務(wù)器:
- 外網(wǎng) IP:
47.238.40.212
。 - 需要將
8080
端口的流量通過(guò) SSH 隧道轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的8899
端口。
- 外網(wǎng) IP:
問(wèn)題分析
-
SSH 隧道未正確建立:
- 外網(wǎng)服務(wù)器的
8080
端口被sshd
監(jiān)聽(tīng),但流量未正確轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的8899
端口。 - 錯(cuò)誤日志顯示
upstream prematurely closed connection
,表明連接被提前關(guān)閉。
- 外網(wǎng)服務(wù)器的
-
Nginx 配置問(wèn)題:
- Nginx 配置正確,將請(qǐng)求轉(zhuǎn)發(fā)到
127.0.0.1:8080
,但 SSH 隧道未正常工作。
- Nginx 配置正確,將請(qǐng)求轉(zhuǎn)發(fā)到
-
客戶端服務(wù)問(wèn)題:
- 內(nèi)網(wǎng)的 Web 服務(wù)(
http://localhost:8899
)正常運(yùn)行,但未通過(guò) SSH 隧道暴露到外網(wǎng)。
- 內(nèi)網(wǎng)的 Web 服務(wù)(
解決方案
1. 配置 SSH 隧道
在內(nèi)網(wǎng)服務(wù)器上執(zhí)行以下命令:
ssh -R 8080:localhost:8899 user@47.238.40.212
- 參數(shù)說(shuō)明:
-R 8080:localhost:8899
:將外網(wǎng)服務(wù)器的8080
端口轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的8899
端口。user@47.238.40.212
:外網(wǎng)服務(wù)器的用戶名和 IP 地址。
驗(yàn)證 SSH 隧道:
- 在外網(wǎng)服務(wù)器上檢查
8080
端口是否被sshd
監(jiān)聽(tīng):
輸出示例:netstat -tuln | grep 8080
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 12345/sshd: user tcp6 0 0 ::1:8080 :::* LISTEN 12345/sshd: user
2. 配置外網(wǎng)服務(wù)器的 SSH 服務(wù)
編輯 /etc/ssh/sshd_config
:
- 確保以下配置項(xiàng)已啟用:
AllowTcpForwarding yes GatewayPorts yes
- 重啟 SSH 服務(wù)以應(yīng)用更改:
sudo systemctl restart sshd
檢查防火墻:
- 確保外網(wǎng)服務(wù)器的防火墻允許
8080
端口的流量:sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload
3. 配置 Nginx
編輯 Nginx 配置文件:
- 在外網(wǎng)服務(wù)器上編輯
/etc/nginx/nginx.conf
或/etc/nginx/conf.d/default.conf
,添加以下內(nèi)容:server {listen 80;server_name xinnian.wang;location / {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 300s;proxy_read_timeout 300s;proxy_send_timeout 300s;} }
測(cè)試 Nginx 配置:
- 檢查配置文件語(yǔ)法:
sudo nginx -t
- 重新加載 Nginx 配置:
sudo systemctl reload nginx
4. 啟動(dòng)內(nèi)網(wǎng) Web 服務(wù)
在內(nèi)網(wǎng)服務(wù)器上啟動(dòng) Web 服務(wù):
- 使用 Python 的
http.server
模塊啟動(dòng) Web 服務(wù):python -m http.server 8899
- 確保服務(wù)正常運(yùn)行,并可以通過(guò)
http://localhost:8899
訪問(wèn)。
5. 測(cè)試 SSH 隧道
在外網(wǎng)服務(wù)器上測(cè)試:
- 使用
curl
測(cè)試8080
端口:
如果 SSH 隧道正常工作,應(yīng)該返回內(nèi)網(wǎng) Web 服務(wù)的內(nèi)容。curl http://127.0.0.1:8080
通過(guò)外網(wǎng)訪問(wèn):
- 在外網(wǎng)瀏覽器中訪問(wèn)
http://47.238.40.212:8080
,確認(rèn)可以訪問(wèn)內(nèi)網(wǎng) Web 服務(wù)。
最終結(jié)果
- SSH 隧道成功建立:
- 外網(wǎng)服務(wù)器的
8080
端口通過(guò) SSH 隧道轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的8899
端口。
- 外網(wǎng)服務(wù)器的
- Nginx 配置正確:
- Nginx 將外網(wǎng)請(qǐng)求轉(zhuǎn)發(fā)到
127.0.0.1:8080
,并通過(guò) SSH 隧道傳遞到內(nèi)網(wǎng)。
- Nginx 將外網(wǎng)請(qǐng)求轉(zhuǎn)發(fā)到
- 測(cè)試成功:
- 通過(guò)
curl http://127.0.0.1:8080
和瀏覽器訪問(wèn)http://47.238.40.212:8080
,成功訪問(wèn)內(nèi)網(wǎng) Web 服務(wù)。
- 通過(guò)
后續(xù)建議
-
保持 SSH 隧道穩(wěn)定:
- 使用
autossh
或tmux
保持 SSH 隧道的穩(wěn)定性。 - 示例:
autossh -M 0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 8080:localhost:8899 user@47.238.40.212
- 使用
-
安全性:
- 使用 SSH 密鑰認(rèn)證代替密碼認(rèn)證。
- 限制允許訪問(wèn)的 IP 地址。
-
日志監(jiān)控:
- 定期檢查 Nginx 和 SSH 的日志,確保沒(méi)有異常訪問(wèn)或錯(cuò)誤。
🚀
- 定期檢查 Nginx 和 SSH 的日志,確保沒(méi)有異常訪問(wèn)或錯(cuò)誤。