為什麼要用
至於為什麼要用內網穿透技術,網上一大堆,也有很多收費的網站進行內網穿透,比如花生殼等等。
這裡我們選擇的是一個開源項目ngrok來自己搭建開源內網穿透環境,以下伺服器和用戶端都是在ubuntu下編譯使用.
編譯
- 安裝編譯環境
由於Ngrok採用Go語言編寫,因此需要下載 Go,可以直接下載編譯的的包來使用。
- 擷取源碼
git clone https://github.com/inconshreveable/ngrok.git ngrok
- 產生key
NGROK_DOMAIN="xxx.com"openssl genrsa -out base.key 2048openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pemopenssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csropenssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crtcp base.pem assets/client/tls/ngrokroot.crt
最好在伺服器上產生以上Key,當時不清楚在用戶端產生了這些Key在服務端一直提示公私密金鑰對不上。
- 編譯
sudo make release-server release-client
直接使用apt-get install golang安裝的go環境好像是版本太舊了,是1.6的,當前最新的版本是1.11 所以需要第1步安裝go環境。
如果一切正常,ngrok/bin 目錄下應該有 ngrok、ngrokd 兩個可執行檔。ngrokd是服務端軟體,ngrok是用戶端軟體
服務端
運行服務端程式
sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="xxx.com" -httpAddr=":9081" -httpsAddr=":9082"
到這一步,ngrok 服務已經跑起來了,可以通過螢幕上顯示的日誌查看更多資訊。httpAddr、httpsAddr 分別是 ngrok 用來轉寄 http、https 服務的連接埠,可以隨意指定。ngrokd 還會開一個 4443 連接埠用來跟用戶端通訊(可通過 -tunnelAddr=":xxx" 指定),如果你配置了iptables 規則或者其他安全規則,需要允許存取這三個連接埠上的 TCP 協議。
在這裡我使用的是<b>supervisor</b>來管理進程的,很簡單。在這裡就不介紹了
與Nginx結合
由於我的伺服器的80連接埠被其他服務佔用了,無法使用80連接埠來使用ngrok,本來想使用80連接埠來進行轉寄,但是一時沒配合,因此使用nginx的80連接埠來進行連接埠跳轉。
nginx設定檔如下
upstream ngrok { server 127.0.0.1:9081; keepalive 64;}server { listen 80; server_name "*.pub.xxx.com"; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host:9081; proxy_set_header X-Nginx-Proxy true; proxy_set_header Connection ""; proxy_pass http://ngrok ; }}
由於使用了網域名稱,因此在網域名稱解析處時需要配置成泛解析,這裡我使用的<b>*.pub</b>來泛解析網域名稱,採用泛解析之後針對多個用戶端時可以不需要再單獨去配置不同的網域名稱解析
用戶端
Ngrok用戶端設定檔
server_addr: "xxx.com:4443"trust_host_root_certs: falsetunnels: http: subdomain: "test.pub" proto: http: "9091" ssh: remote_port: 3322 proto: tcp: "22"
用戶端啟動命令:
啟動http ngrok -config ngrok.conf start http
啟動ssh ngrok -config ngrok.conf start ssh
如果啟動ssh,那麼遠端連接埠3322也要在安全規則中啟用。
那麼可以在外網使用ssh 穿透時內網了。我覺得這個有時比teamviewer方便一些,畢竟有一些是伺服器無法使用teamviewer用戶端
連上之後在控制台輸出
Tunnel Status onlineVersionForwarding……
如果沒有連上或者伺服器斷開 online會顯示成reconnecting