Ngrok經過代理的方式實現兩個不一樣的網絡之間的通訊。一般用於實現內網與外網之間某些服務的穿透,若是要使用ngrok服務實現內外網穿透,可使用其餘人提供的ngrok服務,下載對應的客戶端進行配置便可。也能夠根據本身的須要使用本身的服務器實現ngrok公網服務,下面介紹如何本身搭建ngrok服務器。node
注意ngrok服務端程序與客戶端程序因爲會在編譯時將對應的證書編譯進去,因此一般須要成套使用,除非服務端特殊說明並提供了自身的證書文件,不然非配套的客戶端可能沒法鏈接非配套的服務端 mysql
ngrok也能夠在編譯完成後使用其餘的證書文件啓動,一樣客戶端也可使用其餘的證書而非內置的證書來連接服務端,有須要的同窗能夠自行查找資料或者看看官方文檔,這裏不進行說明 git
接下來進行服務端程序與客戶端程序的編譯與配置說明github
部署ngrok服務須要有如下條件:golang
ngrok.你的域名 *.ngrok.你的域名
(ps:這裏的ngrok前綴能夠隨意更換,只要下邊使用到域名的位置與這裏保持一致便可)編譯ngrok的可執行文件以前咱們須要先給ngrok生成一套證書,以供ngrok的服務端和客戶端進行認證,該證書能夠從證書頒發機構獲取,也能夠自行生成,在shell中執行如下命令web
export NGROK_DOMAIN=ngrok.你的域名 openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.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 rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
其中的「ngrok.你的域名」替換爲你本身設置的域名地址,這裏咱們生成好的證書在下邊會被用到。ngrok是用go語言寫的一個開源項目,因此在編譯時須要有go語言的環境,使用以下方式安裝sql
# CentOS/ReadHat yum install golang # unbuntu/debian apt install golang
以後將ngrok源碼克隆到本地,而後進入到ngrok的項目目錄,在進行編譯以前,咱們須要先用上邊生成的證書文件替換掉ngrok自身的默認證書文件shell
git clone https://github.com/inconshreveable/ngrok cd ngrok cp /上邊證書的目錄/server.key ./assets/server/tls/snakeoil.key cp /上邊證書的目錄/server.crt ./assets/server/tls/snakeoil.crt cp /上邊證書的目錄/rootCA.pem ./assets/client/tls/ngrokroot.crt
接下來執行make release-server
命令進行服務端程序的編譯工做,若是成功編譯就會在./bin目錄下會生成一個可執行文件ngrokd服務端程序vim
ps:若是未能成功編譯,能夠在./docs/SELFHOSTING.md文件中找到編譯說明
ps:編譯時須要clone其餘幾個github項目,若是沒法自動clone也能夠按照編譯時的信息手動進行克隆,克隆完成後再進行make release-server便可api
執行make release-client
來編譯ngrok的客戶端程序,若是成功編譯就會在./bin目錄下生成一個可執行文件ngrok(注意是否是ngrokd,有d的是服務端程序名稱)
接下來咱們就可使用該套服務端與客戶端進行內網穿透了,首先啓動服務端程序,推薦寫成系統服務的配置文件,這樣能夠經過systemtl來進行管理
將./bin/ngrokd文件拷貝到/usr/local/bin目錄下cp ./bin/ngrokd /usr/local/bin
,而後建立vim /etc/systemd/system/ngrokd.service
文件,將以下內容寫入其中
[Unit] Description=ngrok service After=network.target After=syslog.target [Service] Type=simple ExecStart=/usr/local/bin/ngrokd -domain=ngrok.你的域名 -log=/var/log/ngrokd.log -log-level=WARNING ExecStop=/bin/kill $MAINPID ExecReload=/bin/kill -USR1 $MAINPID Restart=always [Install] WantedBy=multi-user.target
ps:這裏的「ngrok.你的域名」替換爲你上邊爲證書設置的那個域名,域名左右必定不能帶有引號,不然沒法正確解析域名地址
ps:在啓動服務端以前必須先將日誌文件建立出來,ngrok不會自動建立該文件,若是不預先建立將沒法啓動服務 touch /var/log/ngrokd.log
而後經過systemctl start ngrokd
來啓動你的服務端進程,若是須要開機啓動能夠執行systemctl enable ngrokd
來加入開機啓動的服務列表
將咱們以前生成的./bin/ngrok客戶端下載到須要穿透內網的機器上而且拷貝到/usr/local/bin目錄下,在該機器上建立一個yaml配置文件:vim ~/.ngrok.yml
並寫入以下內容
server_addr: ngrok.你的域名.com:4443 # 這裏指定客戶端要鏈接的服務端的域名和端口號,4443是默認的監聽的端口,能夠在服務端進行更改 trust_host_root_certs: false # 這裏指定是否驗證服務端的證書,若是是從證書機構獲取的證書則能夠寫爲true,若是是本身生成的證書這裏寫爲false tunnels: # 這個配置項是你要開啓的通道的配置 ssh: # ssh是這個通道的名稱,能夠隨意命名 remote_port: 5022 # 該配置項能夠申請遠程服務器的固定端口,若是不設置該參數,每次在啓動客戶端的時候服務端都會隨機分配一個端口號 proto: # 該配置項指明該通道使用哪些協議 tcp: 22 # 該配置項指明該通道開啓本地tcp協議的22(sshd服務)端口,即將遠程的5022端口轉發到本地22端口 mysql: remote_port: 53306 proto: tcp: 3306 next: subdomain: web # 若是是啓動http的通道則能夠指定該配置項來聲明該通道監聽的子域名是什麼,在訪問時應該訪問web.ngrok.域名 proto: http: 80 api: subdomain: api proto: http: 80
最後啓動咱們的ngrok客戶端程序便可,/usr/local/bin/ngrok -log=/var/log/ngrok.log -log-level=WARNING -config=/你上邊的yml配置文件的路徑,這裏要寫絕對路徑/.ngrok.yml start-all
ps:在啓動客戶端以前必須先將日誌文件建立出來,ngrok不會自動建立該文件,若是不預先建立將沒法啓動 touch /var/log/ngrok.log
若是啓動後顯示的界面中Tunnel Status一項顯示爲online則表示鏈接成功,經過ctrl + c來關閉客戶端程序,這裏也能夠參照上邊服務端的系統配置文件將客戶端的啓動也加入系統服務
若是沒成功鏈接請檢查你的服務器防火牆是否開放了相關端口,以及你的域名是否正確添加了解析記錄