Ngrok內網穿透部署實例

Ngrok服務端與客戶端部署

Ngrok經過代理的方式實現兩個不一樣的網絡之間的通訊。一般用於實現內網與外網之間某些服務的穿透,若是要使用ngrok服務實現內外網穿透,可使用其餘人提供的ngrok服務,下載對應的客戶端進行配置便可。也能夠根據本身的須要使用本身的服務器實現ngrok公網服務,下面介紹如何本身搭建ngrok服務器。node

注意ngrok服務端程序與客戶端程序因爲會在編譯時將對應的證書編譯進去,因此一般須要成套使用,除非服務端特殊說明並提供了自身的證書文件,不然非配套的客戶端可能沒法鏈接非配套的服務端 mysql

ngrok也能夠在編譯完成後使用其餘的證書文件啓動,一樣客戶端也可使用其餘的證書而非內置的證書來連接服務端,有須要的同窗能夠自行查找資料或者看看官方文檔,這裏不進行說明 git

接下來進行服務端程序與客戶端程序的編譯與配置說明github

編譯服務端程序

部署ngrok服務須要有如下條件:golang

  • 擁有公網固定ip的服務器(必定要注意該服務器的防火牆是否開放了端口,ngrok可能會隨機使用一些比較大的端口號,或者也能夠指定固定的端口號同時加入防火牆規則)
  • 一個域名,國內域名也無需備案
  • 爲域名添加兩個A類型的解析記錄指向你的服務器ip: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來關閉客戶端程序,這裏也能夠參照上邊服務端的系統配置文件將客戶端的啓動也加入系統服務

若是沒成功鏈接請檢查你的服務器防火牆是否開放了相關端口,以及你的域名是否正確添加了解析記錄

相關文章
相關標籤/搜索