1. 程式人生 > >使用反向代理(Nginx)和隧道轉發(SSH)實現內網埠對映

使用反向代理(Nginx)和隧道轉發(SSH)實現內網埠對映

實現內網與公網的對映方式有很多很多,如Ngrok、花生殼、NATAPP等,這些服務要麼要收費,要麼上不支援Mac,要麼網速比較慢,要麼沒有埠保持等,總之各種不爽,於是便琢磨如何自己搭建一個內外網埠對映服務,在網上找到搭建Ngrok的教程試了一遍,感覺還是比較麻煩。更糟糕的是:如果想做微信本地開發,需要佔用一個重要的埠:80,或者https的443埠,(不要問為什麼,因為微信自定義開發介面只支援這兩種埠),這其中還測試過frp,但同樣也存在端口占用問題。這樣看來確實沒有一個用著特別舒服的工具。

繼續翻看教程和文件,始終相信計算機的問題一定可以通過程式解決問題,於是終於找到了一個比較完美的解決方案,方案如下:

所需環境:外網伺服器(安裝Nginx服務),sshd服務(這個應該都有),域名(沒有也可以,使用ip來訪問)

先介紹一下原理:
- 反向代理:使用Nginx將請求代理到伺服器的其他埠,讓其他程式能監聽此埠並做相應的處理。
- 隧道轉發:即SSH隧道,一般我們使用它來遠端連線或sftp檔案傳輸,當然他還有埠轉發的功能。SSH隧道是一種把一種網路協議封裝進另外一種網路協議進行傳輸的技術,因為ssh隧道通常會繫結一個本地埠,所有發向這個埠的資料包,都會被加密並透明地傳輸到遠端系統,這也是埠轉發這一名字的由來。

具體步驟如下:

伺服器配置

  1. 修改Nginx配置,新增一個虛擬主機(目的就是可以共享80埠),並將請求轉發到其他埠,本次測試使用的是7000埠,詳細配置如下:
server {
          listen 80;
          server_name ngrok.ianhe.me;
          access_log /data/wwwlogs/ngrok.ianhe.me_nginx.log combined;
   location / {
           proxy_pass http://127.0.0.1:7000;
 }
}

這裡監聽伺服器的80埠,並將請求轉發到7000埠,注意如果填的是域名的話需要去作域名解析操作,配置很簡單,儲存配置並重啟nginx服務即可。

  1. 修改sshd配置,位置為/etc/ssh/sshd_config,將GatewayPorts
    設定為yes即可,這一步也比較簡單,儲存並重啟sshd服務。

客戶端

執行ssh連線.

ssh -R 7000:localhost:8080 <user>@<remote_ip>

7000為伺服器監聽的埠,8080為本地埠,localhost就不需要解釋了,user代表ssh連線使用者,remote_ip代表遠端主機ip。
直接用ssh連線的話,斷開之後埠對映就沒有了,這時可以使用autossh,當然,為了更方便還可以寫成指令碼檔案:

#!/usr/bin/expect -f
  set user ihelin
  set host x.x.x.x
  set password xxxxxx

  spawn autossh -M 5678 -NR :7000:localhost:8080 $user@$host
  expect "*password*"
  send "$password\r"
  interact
  expect eof

然後再寫一個執行指令碼:

#!/bin/zsh
expect -f  ~/.ssh/shell/autongrok

最後可以建一個軟連線或指定一個別名方便執行,連線成功後可以檢視伺服器端口占用情況:

Paste_Image.png

出現如上則說明連線成功,然後通過瀏覽器訪問公網URL或者ip訪問即可轉向本地8080埠。以上!