使用場景:主要內網的應用程序,想被公網看到和訪問。如最簡單的我們自己在內網(本地網建一個網站),但又因我們沒有域名和固定的外網IP,這個時候我們可以藉助於花生殼,netapp之類的都可以讓我們的站點通過外網訪問。
下面環境說明:
有一臺 10網段的(A類)內網機器 ,在外層加了個防火牆,只允許內網訪問外網。不允許外網直接訪問內網中的應用。
ngrok需要一個服務器端和一個客戶端程序。
準備條件:
1.經國家工信icp備案的域名 如: ngrok.yun.com 。
2.有一臺啊裏雲主機(公網主機),且有固定IP,如: 47.xx.xx.107 。
3.將 ngrok.yun.com 解釋到 47.xx.xx.107 這個主機ip
將 *.ngrok.yun.com 也解釋到 47.xx.xx.107 這個主機ip
4.在雲主機上安裝 對應操作系統的ngrok服務端程序並以後臺方式運行。(儘量保證開機自啓,程序不掛吧)
5.在需要被訪問的內網機上安裝一個ngrok客戶端程序。然後進行啓動。
生成ngrok的服務端和客戶端程序。如果不想自己編譯啊。就下個NATAPP吧。
下面我用centos 7 進行編譯 生成的過程。
官網:https://ngrok.com/
源碼:https://github.com/inconshreveable/ngrok
yum install git
yum install golang
git clone https://github.com/inconshreveable/ngrok.git
我的路徑:/opt/ngrok/source/ngrok
2.根據域名生成相關的證書。
cd /opt/ngrok/certs
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 90000 -subj "/CN=fcs.xxx.com" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=fcs.xxx.com" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -out server.crt -days 50000
然後考證書
cp server.crt /opt/ngrok/source/ngrok/assets/server/tls/snakeoil.crt
cp server.key /opt/ngrok/source/ngrok/assets/server/tls/snakeoil.key
cp base.pem /opt/ngrok/source/ngrok/assets/client/tls/ngrokroot.crt
3.進行編譯.
cd /opt/ngrok/source/ngrok
編繹服務端。
make release-server
編譯客戶端和服務端。
########################32 位###########################
#win服務端
GOOS=windows GOARCH=386 make release-server
#win客戶端
GOOS=windows GOARCH=386 make release-client
#linux服務端
GOOS=linux GOARCH=386 make release-server
#linux客戶端
GOOS=linux GOARCH=386 make release-client
#mac 服務端
GOOS=darwin GOARCH=386 make release-server
#mac 客戶端
GOOS=darwin GOARCH=386 make release-client
########################64 位###########################
#win服務端
GOOS=windows GOARCH=amd64 make release-server
#win客戶端
GOOS=windows GOARCH=amd64 make release-client
#linux服務端
GOOS=linux GOARCH=amd64 make release-server
#linux客戶端
GOOS=linux GOARCH=amd64 make release-client
#mac 服務端
GOOS=darwin GOARCH=amd64 make release-server
#mac 客戶端
GOOS=darwin GOARCH=amd64 make release-client
最後都輸出到 /opt/ngrok/sourc/ngrok/bin目錄下。
4.啓動服務端,把編譯出來的ngrokd 複製到啊裏雲主機上(因爲我本來說是在這臺主機上編譯的,所以就不用考了)。
如果不能後臺啓動:yum install screen
然後執行 screen -S 取個名。 如 (ngrokkeeplive)
然後cd到/opt/ngrok/source/ngrok執行:
./bin/ngrokd -tlsKey="/opt/ngrok/certs/server.key"
-tlsCrt="/opt/ngrok/certs/server.crt" -domain="fcs.xxx.com"
-httpAddr=":7070" -httpsAddr=":7071" -tunnelAddr=":7443"
> ngrok.log &
domain: 這個一定要注意不要填錯,就是ICP備案那個。
httpAddr爲 http協議的,不填時,默認爲80端口
httpsAddr爲https 不填時,默認爲443端口
tunnelAddr 爲客戶端連接上來的通道監聽端口。
注意我這裏用7070,7071,7443等,因爲我本機上其它程序佔用了 80,443,同樣要記得在啊裏雲上要打開這些端口哦。
5.將不同操作系統的客戶端考到對應的內網機上運行。
在ngrok客戶端相同目錄下。新建一個ngrok.cfg。注意啊一定是cfg後綴文件,在windows上有時候隱藏了後綴,看起來像cfg,實際上是txt。這樣運行的時候,會報錯。
寫的時候注意是yml格式的文件。
server_addr: "fcs.xxx.com:7443"
trust_host_root_certs: false
tunnels:
socket:
remote_port: 5077
proto:
tcp: 5077
cmd下然後執行(windows) D:\ng\ngrok -config=ngrok.cfg start socket
remote_port 這個爲映射的端口。設這個之後,如果連接上服務端口,這個端口就會在服務端被監聽。因此這裏的端口對應的在啊裏雲上也要打開。
proto中的tcp對應的端口,是內網中默認當前客戶端所在機器已經監聽的端口。
如:tcp: "192.168.4.88:8090" 即將啊裏雲讓機上的5077映射到內網192.168.4.88:8090這個地址上。
然後你用socket工具訪問 fcs.xxx.com:5077 時實際上會被ngrok轉發給 192.168.4.88:8090這個地址。從而實現訪問內網。