# 使用Ngrok實現(xiàn)內(nèi)網(wǎng)穿透服務(wù)
tags: 網(wǎng)絡(luò) Linux ngrok
ngrok是什么瀑凝?
ngrok是一個能夠?qū)崿F(xiàn)不能直接與外網(wǎng)溝通的設(shè)備,通過外網(wǎng)服務(wù)器的轉(zhuǎn)發(fā)實現(xiàn)自我服務(wù)器化的軟件杏慰,也就是不需要通過路由器的端口映射,就能實現(xiàn)內(nèi)網(wǎng)設(shè)備向外網(wǎng)暴露端口的軟件。
實現(xiàn)ngrok服務(wù)需要什么液样?
需要一個能夠提供服務(wù)的外網(wǎng)服務(wù)器铐达,并運行ngrok服務(wù)端岖赋,它將默認監(jiān)聽4443端口,當(dāng)內(nèi)網(wǎng)的機器運行ngrok客戶端并連接上服務(wù)器時瓮孙,將通過4443端口進行轉(zhuǎn)發(fā)設(shè)置唐断,并按設(shè)定將指定的端口的數(shù)據(jù)動作與服務(wù)器進行轉(zhuǎn)發(fā)。協(xié)議上它支持http,https,tcp協(xié)議
如何搭建自己的ngrok服務(wù)器
最新版ngrok目前僅由官方提供技術(shù)支持和服務(wù)器杭抠,開源的ngrok代碼只支持到1.7版本脸甘,只有自己編譯的ngrok才能在自己的服務(wù)器上提供內(nèi)網(wǎng)穿透服務(wù)。ngrok使用GO語言編寫偏灿,可以自己配置實現(xiàn)交叉編譯丹诀,全平臺通用
一. 軟件的編譯
以下動作發(fā)生在debian 8.2 x86平臺
1. 編譯安裝GO
建議安裝1.4版本平臺,由于軟件開發(fā)時間問題,新版本的GO可能會出現(xiàn)編譯問題
下載GO1.4
# pwd
# ~/Software
# apt-get install gcc cmake
# wget http://www.golangtc.com/static/go/1.4/go1.4.linux-386.tar.gz
# tar xvf http://www.golangtc.com/static/go/1.4/go1.4.linux-386.tar.gz
配置編譯環(huán)境
# export GOROOT=$HOME/software/go
# export PATH=$PATH:$GOROOT/bin
編譯&檢查
# cd go/src/
# ./all.bash
編譯完成后~/go/bin中的go就是我們的二進制go程序
2. 編譯安裝ngrok
下載ngrok
# cd ~/software
# git clone https://github.com/inconshreveable/ngrok.git ngrok
# cd ngrok
配置ssl證書信息
# NGROK_DOMAIN="moonwalker.me"
注意域名換成你自己的
# openssl genrsa -out base.key 2048
# openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
# openssl genrsa -out server.key 2048
# openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
# openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt
將生成的證書文件拷貝到指定位置铆遭,替代默認證書
# cp base.pem assets/client/tls/ngrokroot.crt
# cp server.crt assets/server/tls/snakeoil.crt
# cp server.key assets/server/tls/snakeoil.key
編譯生成服務(wù)端和客戶端
# make release-server release-client
編譯出的程序會放在ngrok/bin/下硝桩,ngrok為客戶端程序,ngrokd為服務(wù)器程序枚荣。注意這個服務(wù)端和客戶端只適合你用于編譯的機器的所屬平臺上運行碗脊,例如使用x86構(gòu)架的主機編譯無法在arm構(gòu)架上運行,需要后面的交叉編譯
3. 啟動Ngrok服務(wù)
# ./ngrokd -domain="ngrok.moonwaker.me" -httpAddr=":8080" -httpsAddr=":8081" -tunnelAddr=":4443"
使用netstat -tunlp
可以看到服務(wù)器已經(jīng)做好端口監(jiān)聽棍弄,并且已經(jīng)將兩個協(xié)議的轉(zhuǎn)發(fā)端口做了監(jiān)聽望薄,當(dāng)然三個參數(shù)的端口都是默認好的,這里寫出來是為了方便修改呼畸。
4. 運行客戶端
如果是同樣平臺的機器可以直接將ngrok復(fù)制走運行痕支,如果是想在樹莓派等arm平臺上要配置交叉編譯再編譯一次
配置編譯平臺
# cd ~/software/go/src
# GOOS=linux
# GOARCH=arm
# ./make.bash
通過上面的命令配置好go編譯器的交叉編譯選項,然后重新編譯
# cd ~/software/ngrok/src
# make release-server release-client
寫一個配置文件ngrok.cfg蛮原,基礎(chǔ)的配置如下
server_addr: ngrok.moonwalker.me:4443
trust_host_root_certs: false
這里已經(jīng)可以通過命令
# ./ngrok -subdomain ngrok -proto=http -config=ngrok.cfg 80
直接將80端口轉(zhuǎn)發(fā)到服務(wù)器端的8081端口卧须,并且協(xié)議走的是http
當(dāng)然也可以對其它端口進行tcp轉(zhuǎn)發(fā),比如轉(zhuǎn)發(fā)22端口
# ./ngrok -proto=tcp -config ngrok.cfg 22
ngrok會隨意選擇一個端口對本機的22端口進行轉(zhuǎn)發(fā)
如果想一次性轉(zhuǎn)發(fā)多個端口或者想指定遠程的對應(yīng)端口儒陨,需要完善ngrok.cfg
server_addr: ngrok.moonwalker.me:4443
trust_host_root_certs: false
tunnels:
ssh:
remote_port: 1122
proto:
tcp: 22
ss:
emote_port: 8388
proto:
tcp: 8388
ftp:
remote_port: 20
proto:
tcp: 20
ftp2:
remote_port: 21
proto:
tcp: 21
http:
subdomain: www
proto:
http: 80
https: 192.168.1.4:443
特別需要注意的是配置文件為YAML語法花嘶,所有縮進都要使用空格,不能夠使用tab
而且可以看出不但可以轉(zhuǎn)發(fā)本機的端口蹦漠,亦可以轉(zhuǎn)發(fā)其它內(nèi)網(wǎng)設(shè)備
啟動特定的轉(zhuǎn)發(fā)tunnel
# ./ngrok -config ngrok.cfg start ssh ss
當(dāng)然也可以將所有配置全部轉(zhuǎn)發(fā)
# ./ngrok -config ngrok.cfg start-all