前言
随着網際網路的發展,無論是web服務還是移動APP越來越多的都內建了第三方支付(支付寶、微信、銀聯)。通常作為服務提供方,支付成功以後都會有一個後端回調URL來通知是否調用者是否支付成功,這個URL必須是公網環境,并且可以被通路到。然而在實際開發測試環境中,我們一般都是在内網開發,是以說對于支付測試是一件比較麻煩的事情。
内網穿透
這時候,我們就需要内網穿透服務來解決第三方服務無法回調的問題了,下面我們來稍微盤點那些流行的内網穿透技術。
Ngrok
ngrok 是一個反向代理,通過在公共的端點和本地運作的 Web 伺服器之間建立一個安全的通道。ngrok 可捕獲和分析所有通道上的流量,便于後期分析和重放(百度百科)。
- 優點:使用友善,Docker容器化,配置簡單,各平台支援,也可以自己搭建伺服器
- 缺點:ngrok 是一個開源程式,官網服務在國外,國内通路國外速度慢。1.7+以後不再開源,收費才是持續發展的動力
國内也有相應的ngrok服務 natapp、frp、nat123端口映射、内網通、花生殼等等,這裡就不一個個介紹了,有興趣的可以自行谷歌,畢竟今天的主角是Ngrok。
下面一張圖我們來了解一下Ngrok的穿透流程:
環境說明
雲伺服器Linux(centos7.4)、Nginx、Docker、hteen/ngrok Docker鏡像,備案域名一枚
安裝說明
這裡省去了Docker安裝說明,請自行安裝Docker。
擷取ngrok鏡像:
docker pull hteen/ngrok
啟動
- 我們需要挂載宿機目錄(E.g /data/ngrok)到容器的/myfiles目錄
- 第一次運作,它将會在/data/ngrok目錄下生成二進制檔案和CA憑證
sudo docker run --rm -it -e DOMAIN="ngrok.52itstyle.com" -v /data/ngrok:/myfiles hteen/ngrok /bin/sh /build.sh
安裝成功會出現以下提示(省略中間過程):
Generating RSA private key, 2048 bit long modulus
.............................+++
.............................+++
e is 65537 (0x10001)
Generating RSA private key, 2048 bit long modulus
...............................+++
...............................+++
go get -tags 'release' -d -v ngrok/...
go install -tags 'release' ngrok/main/ngrok
build ok !
用戶端和服務端生成在/data/ngrok/bin目錄下:
bin/ngrokd 服務端
bin/ngrok linux用戶端
bin/darwin_amd64/ngrok osx用戶端
bin/windows_amd64/ngrok.exe windows用戶端
啟動Ngrok server
由于ngrok預設使用80和443端口,這裡我們使用Nginx服務做轉發,通過端口映射的方式通路Docker容器(參考docker-compose.yml配置)。
docker run -idt --name ngrok-server \
-v /data/ngrok:/myfiles \
-p 8082:80 \
-p 4432:443 \
-p 4443:4443 \
-e DOMAIN='ngrok.52itstyle.com' hteen/ngrok /bin/sh /server.sh
啟動之後需要在nginx.conf 添加兩條反向代理配置(HTTPS請求自行配置):
server {
listen 80;
server_name ngrok.52itstyle.cn *.ngrok.52itstyle.com;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8082;
}
}
配置DNS解析
服務啟動後,要想正常運作,我們還需要添加兩條A記錄到雲伺服器(替換成自己的IP位址):
啟動Ngrok client
首先從data/ngrok/bin目錄下載下傳各個環境下的用戶端。
windows 環境
首先建立一個ngrok.cfg配置檔案:
server_addr: "ngrok.52itstyle.com:4443"
trust_host_root_certs: false
使用cmd指令切換到對應的目錄下,然後執行以下指令:
ngrok.exe -config ngrok.cfg -subdomain doc 192.168.1.125:4999
如果出現以下界面,說明安裝成功:
ngrok
Linux 環境
奇了個怪怪,linux下運作一直報以下錯誤,然并不清楚什麼原因,有知道的小夥伴還望告知:
-bash: ./ngrok: /lib/ld-musl-x86_64.so.1: bad ELF interpreter: 沒有那個檔案或目錄
注意事項
- 防火牆需要開放4443端口,否則是無法連接配接成功的
- 微信二維碼支付回調是需要域名認證的(背景隻能錄入一個URL),這個有點坑!!!