前言
最近從事第三方平臺代小程序?qū)崿F(xiàn)業(yè)務(wù)開發(fā),很多業(yè)務(wù)交互請求需要https嘹履,本地調(diào)試開發(fā)實現(xiàn)不了宙址,不可能把部署到生產(chǎn)服務(wù)器調(diào)試轴脐,那又很不方便。我參考網(wǎng)上很多教程抡砂,很多不完整大咱,不系統(tǒng)。我于是整理出完整教程當(dāng)備用注益。
專業(yè)術(shù)語
內(nèi)網(wǎng)穿透,又叫NAT穿透碴巾,是計算機(jī)用語,翻譯過來就是 你的電腦可以直接被你朋友訪問丑搔。 通常我們的電腦是無法自己被訪問的厦瓢。因為我們的電腦缺少自己的獨立的ip地址。現(xiàn)在ip稀缺啤月,電信運營商已經(jīng)不會隨便分配固定ip給個人煮仇。
通常實現(xiàn)內(nèi)網(wǎng)穿透,是通過路由器上端口映射來實現(xiàn)的谎仲。但是路由器通常不是每個人都有權(quán)限可以訪問和設(shè)置,而且可能存在多級路由器較為復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)浙垫。端口映射也無法實現(xiàn)。這就需要ngrok來實現(xiàn)了。
原理
ngrok 建立一個隧道,將主機(jī)A的http請求 傳遞給 主機(jī)B,從而實現(xiàn)內(nèi)網(wǎng)穿透夹姥。
ngrok分為client端(ngrok)和服務(wù)端(ngrokd)杉武,
實際使用中的部署如下:
圖中內(nèi)網(wǎng)主機(jī)上安裝客戶端。
公網(wǎng)主機(jī) 安裝服務(wù)端佃声。
client public 則代表 訪問你電腦的用戶或者朋友艺智。
現(xiàn)在都云時代,各種服務(wù)都能找到提供商圾亏。內(nèi)網(wǎng)穿透也是如此十拣。ngrok服務(wù)端相當(dāng)麻煩,如果你只是簡單的穿透,又不是什么敏感信息志鹃,可以找到很多 服務(wù)提供商夭问。例如https://ngrok.com/
- 下載客戶端根據(jù)你的個人電腦系統(tǒng)下載匹配的客戶端。下載地址: https://ngrok.com/download
- 啟動
./ngrok http 4444
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Session Expires 7 hours, 59 minutes
Version 2.2.8
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://ada02116.ngrok.io -> localhost:4444
Forwarding https://ada02116.ngrok.io -> localhost:4444
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
如果此時訪問 http://ada02116.ngrok.io 則等于訪問了 localhost:4444
自建ngrok服務(wù)
使用別人的服務(wù)曹铃,存在一些限制缰趋。例如不穩(wěn)定、安全問題陕见,費用昂貴等秘血。因此可能需要自己搭建ngrok服務(wù)端。
自建服務(wù)需要具備的條件:
1评甜、具備獨立ip的服務(wù)器灰粮。例如阿里云、騰訊云等忍坷。 我個人使用的阿里云ecs
2粘舟、需要域名。如果是國內(nèi)則需要備案佩研。我個人的域名是 xxxx.com
-
配置域名
增加2條A記錄,指向你的服務(wù)器柑肴。這里我配置的是 ngrok.xxxx.com 和 *.ngrok.xxxx.com
-
添加安全組。
開放3個端口旬薯。這里我選擇4443晰骑、4444、8081端口绊序。
其中4443是ngrok自身通信使用些侍。
4444 后面tcp端口轉(zhuǎn)發(fā)使用。
8081 則是http請求轉(zhuǎn)發(fā)使用政模。默認(rèn)是80 但是這里80端口我分配給nginx了岗宣。
截圖中少截圖了4444的配置。
-
安裝go(阿里云ESC服務(wù)器)
第一次照著其他教程直接apt-get install golang安裝go語言環(huán)境淋样,結(jié)果編譯的時候報錯耗式,最終使用go 1.8版本順利通過。
- 下載go安裝包并解包
wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
tar -zxvf go1.8.linux-amd64.tar.gz
- 配置環(huán)境變量
sudo vim /etc/profile
# 添加以下內(nèi)容
export GOROOT=/usr/local/go # 注意此處為解壓后文件夾的路徑
export GOPATH=$GOROOT/bin
export PATH=$PATH:$GOPATH
- 使其生效
source /etc/profile
- 查看go版本
go version
-
安裝ngrok(阿里云ESC服務(wù)器)
- 下載安裝包并解壓
wget htps://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/ngrok.tar.gz tar zxvf ngrok.tar.gz cd ngrok
- 生成簽名證書
export NGROK_DOMAIN="ngrok.xxx.com" # 此處為公網(wǎng)服務(wù)器域名(我是用的阿里云ESC服務(wù)器) 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
ngrok目錄下會生成6個新的文件
device.crt device.csr device.key
rootCA.key rootCA.pem rootCA.srl
- 替換證書
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
- 編譯服務(wù)端與客戶端口
make release-server
GOOS=linux GOARCH=386 make release-client
GOOS=linux GOARCH=amd64 make release-client
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client
GOOS=darwin GOARCH=386 make release-client
GOOS=darwin GOARCH=amd64 make release-client
GOOS=linux GOARCH=arm make release-client
編譯成功后會在bin目錄下找到ngrokd和ngrok這兩個文件。其中ngrokd 是服務(wù)端程序ngrok是客戶端程序刊咳。
- 運行服務(wù)端
./ngrokd -domain="ngrok.xxx.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
- 將ngrok拷貝到客戶端上我的是mac彪见,下載對應(yīng)darwin_amd64
scp -P 22 -r root@你的的ngrok服務(wù)器ip地址:/usr/local/ngrok/bin/darwin_amd64/ngrok ./ngrok
- 并在同級文件夾下新建config.yml文件,其中內(nèi)容如下:
server_addr: "ngrok.xxxx.com:4443"
trust_host_root_certs: false
tunnels:
webapp:
proto:
http: 8000
https: 8000
subdomain: www
tcp12345:
remote_port: 4444
proto:
tcp: 12345
- 啟動客戶端
./ngrok -config=config.yml start-all
- 穿透成功
ngrok Tunnel Status online
Version 1.7/1.7
Forwarding https://www.ngrok.xxxx.cn -> 127.0.0.1:8000
Forwarding http://www.www.ngrok.xxxx.cn -> 127.0.0.1:8000
Web Interface 127.0.0.1:4040
Conn 6 Avg Conn Time 6026.71ms HTTP Requests -------------
GET / 200 OK
GET /static/fonts/element-ico 304 Not Modified
GET /static/img/login_center_ 304 Not Modified
GET /155.js 304 Not Modified
GET /static/tinymce4.7.5/tiny 304 Not Modified
GET /app.js 200 OK
GET / 304 Not Modified
GET /favicon.ico 200 OK
GET /static/fonts/element-ico 200 OK
停止服務(wù)端和客戶端
-
網(wǎng)站配置SSL證書(https),使網(wǎng)站可以通過https訪問
我們申請的是Let's Encrypt通配符SSL證書娱挨,因為他是免費的
- 1.獲取 Certbot 客戶端
下載 Certbot 客戶端 ,并且添加可執(zhí)行權(quán)限
cd /usr/local/
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
- 2.申請通配符證書
客戶在申請Let’s Encrypt證書的時候余指,需要校驗域名的所有權(quán),證明操作者有權(quán)利為該域名申請證書跷坝,目前支持三種驗證方式:dns-01:給域名添加一個 DNS TXT 記錄酵镜。
http-01:在域名對應(yīng)的 Web 服務(wù)器下放置一個 HTTP well-known URL 資源文件。
tls-sni-01:在域名對應(yīng)的 Web 服務(wù)器下放置一個 HTTPS well-known URL 資源文件
使用Certbot客戶端申請證書方法非常的簡單柴钻,只需如下一行命令就搞定了淮韭。
- 特別注意:
申請通配符證書,只能使用 dns-01 的方式贴届。
xxx.com 請根據(jù)自己的域名自行更改靠粪。如果要.xxx.com xxx.com都可以使用需要配置 -d “.xxx.com” -d “xxx.com”。
./certbot-auto certonly -d "*.ngrok.xxx.com" -d "ngrok.xxx.com" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
-
執(zhí)行完這一步之后毫蚓,就是命令行的輸出占键,請根據(jù)提示輸入相應(yīng)內(nèi)容1534495467849643.png
執(zhí)行到上圖最后一步時,先暫時不要回車元潘。申請通配符證書是要經(jīng)過DNS認(rèn)證的畔乙,接下來需要按照提示在域名后臺添加對應(yīng)的DNS TXT記錄。
-
確認(rèn)生效后柬批,回車?yán)^續(xù)執(zhí)行,最后會輸出如下內(nèi)容:
1534495645970573.png
出現(xiàn)這個就代表成功了
3.更換證書袖订,重新編譯ngrok客戶端和服務(wù)端
cd /home/ngrok/
cp /etc/letsencrypt/live/open.yuelingnet.cn/privkey.pem /home/ngrok/assets/server/tls/snakeoil.key
cp /etc/letsencrypt/live/open.yuelingnet.cn/fullchain.pem /home/ngrok/assets/server/tls/snakeoil.crt
cp /etc/letsencrypt/live/open.yuelingnet.cn/fullchain.pem /home/ngrok/assets/client/tls/ngrokroot.crt
make release-server
GOOS=linux GOARCH=386 make release-client
GOOS=linux GOARCH=amd64 make release-client
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client
GOOS=darwin GOARCH=386 make release-client
GOOS=darwin GOARCH=amd64 make release-client
GOOS=linux GOARCH=arm make release-client
- 4.將ngrok重新拷貝到客戶端上我的是mac氮帐,下載對應(yīng)darwin_amd64
scp -P 22 -r root@你的的ngrok服務(wù)器ip地址:/usr/local/ngrok/bin/darwin_amd64/ngrok ./ngrok
- 5.再次運行服務(wù)端
./ngrokd -tlsKey="/home/ngrok//assets/server/tls/snakeoil.key" -tlsCrt="/home/ngrok/assets/server/tls/snakeoil.crt" -domain="open.yuelingnet.cn" -httpAddr=":80" -httpsAddr=":443"
- 6.啟動客戶端
./ngrok -config=config.yml start-all
最后測試可以通過https訪問。