參照 http://www.hackliu.com/?p=363
使用ngrok進行內(nèi)網(wǎng)穿透
前提必需品:
- 有公網(wǎng)ip的服務(wù)器
- 域名
域名解析情況:
*.ngrok.wangzhaojin.top --> 106.14.146.125
ngrok.wangzhaojin.top --> 106.14.146.125
ngrok分為客戶端和服務(wù)端, 服務(wù)端放到公網(wǎng)服務(wù)器上, 客戶端放到自己的電腦上
1. 服務(wù)端操作(公網(wǎng)服務(wù)器)
1.1 安裝環(huán)境
-
基礎(chǔ)環(huán)境
yum update yum install gcc -y yum install git -y
安裝go語言, 不要使用yum安裝, 使用源碼或二進制包安裝, 安裝完成以后配置GOPATH, GPROOT什么的
1.2 ngrok安裝
-
獲取軟件包
git clone https://github.com/inconshreveable/ngrok.git
-
生成證書
cd ngrok export NGROK_DOMAIN="ngrok.wangzhaojin.top" #修改成自己的二級域名 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 device.key 2048 openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
-
將新生成的證書替換跨跨,1. 執(zhí)行下面命令后 “y” 回車 一行一行執(zhí)行代碼僵腺!
cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
-
編譯生成ngrokd
make release-server 報錯1:沒有g(shù)o-bindata 將GOPATH目錄下的bin/go-bindata復(fù)制到ngrok/bin/下,若沒有bin則mkdir 如果GOPATH目錄下也沒有, 百度安裝go-bindata 不要使用yum或apt安裝, 要用go get裝 還有什么deps亂七八糟的報錯, 只會是一下三個原因 1. go環(huán)境沒配好 2. 所下載的資源被墻 3. 重新克隆軟件包, 重新生成證書再編譯 生成的ngrokd文件則為服務(wù)端,所在位置可能在以下兩處 1. ngrok/bin/下 2. GOPATH目錄/bin/下 取決于你有沒有cp go-bindata文件, 若有, 則在1下
1.3 啟動服務(wù)端
./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" \
-tlsCrt="assets/server/tls/snakeoil.crt" \
-domain="ngrok.wangzhaojin.top" \
-httpAddr=":80" \
-httpsAddr=":8082" \
-tunnelAddr=":443"
命令過長, 手動換行的
參數(shù)介紹:
tlsCrt 證書位置
domain 你自己的二級域名
httpAddr 監(jiān)聽的公網(wǎng)http請求的端口
httpsAddr監(jiān)聽的公網(wǎng)https請求的端口
tunnelAddr 隧道的端口,即與客戶端通信的端口
到這一步就能通過http://ngrok.wangzhaojin.top:80
和https://ngrok.wangzhaojin.top:443
訪問ngrok提供的轉(zhuǎn)發(fā)服務(wù)了
如圖所示顯示 Tunnel ngrok.wangzhaojin.top not found
則服務(wù)器啟動成功
1.3.1 systemctl接管
由1.3啟動的服務(wù)端無法后臺運行, 且啟動, 關(guān)閉. 重啟不方便
由systemctl接管后可以通過以下命令管理
systemctl start ngrok
啟動
systemctl stop ngrok
關(guān)閉
systemctl restart ngrok
重啟
systemctl status ngrok
查看運行狀態(tài)
注意路徑
vi /etc/systemd/system/ngrok.service
[Unit]
Description=ngrok
After=network.target
[Service]
ExecStart=/root/ngrok/bin/ngrokd -tlsKey=/root/ngrok/assets/server/tls/snakeoil.key -tlsCrt=/root/ngrok/assets/server/tls/snakeoil.crt -domain=ngrok.wangzhaojin.top -httpAddr=:80 -httpsAddr=:8082 -tunnelAddr=:443
[Install]
WantedBy=multi-user.target
1.4 編譯客戶端
make release-client
編譯之后的文件位置同服務(wù)端一樣, 文件名為ngrok
這一步看網(wǎng)上的教程需要設(shè)置客戶端的參數(shù), 不同系統(tǒng)編譯成不同客戶端
如下
win 平臺 64 位系統(tǒng):GOOS=windows GOARCH=amd64 make release-client
Linux 平臺 32 位系統(tǒng):GOOS=linux GOARCH=386 make release-client
Linux 平臺 64 位系統(tǒng):GOOS=linux GOARCH=amd64 make release-client
Windows 平臺 32 位系統(tǒng):GOOS=windows GOARCH=386 make release-client
Windows 平臺 64 位系統(tǒng):GOOS=windows GOARCH=amd64 make release-client
MAC 平臺 32 位系統(tǒng):GOOS=darwin GOARCH=386 make release-client
MAC 平臺 64 位系統(tǒng):GOOS=darwin GOARCH=amd64 make release-client
ARM 平臺:GOOS=linux GOARCH=arm make release-client
我的服務(wù)端和客戶端都是linux_64平臺, 這樣編譯之后:
客戶端在centos7上顯示版本1.7,可以使用
客戶端在Ubuntu16.04上顯示版本1.6,一直報證書錯誤, 很迷
所以我說直接make release-client, 不加前面的參數(shù)
2. 客戶端操作(內(nèi)網(wǎng)服務(wù)器)
2.1 將服務(wù)端生成的ngrok客戶端, 放到內(nèi)網(wǎng)服務(wù)器上
客戶端軟件放上去之后可能沒有執(zhí)行權(quán)限
[root@wzj ~]# ll
-rw-r--r-- 1 root root 10779349 7月 17 14:08 ngrok
[root@wzj ~]# chmod 777 ngrok
[root@wzj ~]# ll
-rwxrwxrwx 1 root root 10779349 7月 17 14:08 ngrok
執(zhí)行chmod 777 ngrok
即可
2.2 在同級目錄下新建一個配置文件
vi ngrok.cfg
server_addr: "ngrok.wangzhaojin.top:443"
trust_host_root_certs: false
注意:
1.域名換成自己的
2.這里的server_addr前面的域名與生成ssl證書以及啟動服務(wù)端指定的domain一致
3.server_addr后面的端口與啟動服務(wù)端時的指定的tunnelAddr一致
2.3 啟動客戶端
ngrok -config=ngrok.cfg -subdomain=v1 80
參數(shù)介紹:
subdomain為子域名的前綴,例如我們之前一直用的是ngrok.wangzhaojin.top
這樣項目啟動后地址就為v1.ngrok.wangzhaojin.top
80: 本地項目啟動的端口
可能會報一下錯誤
[root@wzj ~]# ngrok -config=ngrok.cfg -subdomain=v1 80
-bash: /usr/bin/ngrok: 沒有那個文件或目錄
解決:
[root@wzj ~]# ln ngrok /usr/bin/
2.3.1 systemctl接管
vi /etc/systemd/system/ngrok.service
[Unit]
Description=ngrok
After=network.target
[Service]
ExecStart=/root/ngrok -subdomain=zs 5000
[Install]
WantedBy=multi-user.target
啟動成功以后會顯示status online
如下圖
此時就可以在瀏覽器通過http://v1.ngrok.wangzhaojin.top來訪問內(nèi)網(wǎng)的項目了如下圖
這里是因為我本地沒有跑在80端口的項目, 如果啟動了nginx就會有welcome to nginx 如圖
好吧, 我的nginx還沒配好, 懶得配了, 反正ngrok是能用了
結(jié)語
搭了很久才搭出來, 圖中各種報錯, 最后把軟件源碼全部刪了, 最后有clone一次就莫名其妙的好了
發(fā)現(xiàn)是編譯的時候加了那個GOOS和GOARCH, 搭好之后有個驚為天人的發(fā)現(xiàn), 原來ssh隧道一行命令就搞定了
原來一行命令就能搞定
遠程服務(wù)器(公網(wǎng)服務(wù)器)修改ssh配置文件
修改一下配置文件
vim /etc/ssh/sshd_config
添加一行
GatewayPorts yes
重啟sshd服務(wù)
systemctl restart sshd
在本機(內(nèi)網(wǎng)服務(wù)器)執(zhí)行如下命令
ssh -f -N -R 10003:localhost:80 root@106.14.146.125
解釋:
將公網(wǎng)的106.14.146.125:10003端口請求轉(zhuǎn)發(fā)到本機的80端口
因為ssh會經(jīng)常自動斷開連接, 所以我將密碼作為命令的參數(shù)
將命令寫入腳本, 定時執(zhí)行
wzj@wzj-dev:/home/ubuntu$ cat autocontent.sh
sshpass -p [password] ssh -f -N -R 10003:localhost:80 root@106.14.146.125
3. 補充socket映射
3.1 配置
vi /root/.ngrok
server_addr: ngrok.wangzhaojin.top:443
trust_host_root_certs: false
tunnels:
vnc:
remote_port: 4900
proto:
tcp: 4900
3.2 啟動
/root/ngrok start vnc
3.3 systemctl 接管
vi /etc/systemd/system/ngrok.service
[Unit]
Description=ngrok
After=network.target
[Service]
ExecStart=/root/ngrok start vnc
[Install]
WantedBy=multi-user.target