# inlets - 內網通外網測試 金流服務 or Bot 神器
在串接 金流服務 或是要接受 Bot 回傳的 webhook 都會遇到一個問題,就是不能在 localhost 收到 webhook ,之前有分享過有幾個服務跟工具可以內網通外網把 localhost 跟虛擬主機連在一起
那這次介紹 inlets (opens new window) 這個使用 Golang 開發的 open source 的工具可以內網通外網,只要你有一台虛擬主機就可以安裝來用。
院長有一台 Linode 的虛擬主機(我的推薦連結 (opens new window)),所以我是安裝 inlets 在虛擬主機上,Mac 筆電就是開發環境,上面跑 web 應用程式。
當我要測試金流服務時就會用 inlets 來把金流服務給的 webhook 從虛擬主機轉回我的筆電
WARNING
2023-05-15 更新:目前作者已經將 inlets 這個 git repo 刪除了,我有 fork 一份在我自己的帳號下面,有興趣的朋友可以到這個 git repo (opens new window) 下載並自己 build binary 出來。
# 安裝方式
server 上安裝可以用 curl + sh 就會安裝好了
# Install to local directory
curl -sLS https://get.inlets.dev | sh
# Install to /usr/local/bin/
curl -sLS https://get.inlets.dev | sudo sh
在 Mac 上可以用 brew 安裝
brew install inlets
# 啟用 inlets 啟動 tunnel 內網通外網
首先在 server 上啟動 inlets
export token=$(head -c 16 /dev/urandom | shasum | cut -d" " -f1)
inlets server --port=8090 --token="$token"
會輸出下面的結果
2020/05/11 20:28:36 Server token: "b351626665fce66aaba0867b1971212bcd5d2c05"
2020/05/11 20:28:36 Listening on :8000
這時 inlets server 就已經啟動了,同時監聽 port 8000,token 是 Mac 用來連上 inlets 用的,可以透過 token 保護連線
# client 連上 tunnel
接著筆電用下面的指令連上 inlets server 同時把 request 轉到 port 3000
inlets client --remote=your_id:8000 --upstream=http://127.0.0.1:8080 --token b351626665fce66aaba0867b1971212bcd5d2c05
會輸出下面的結果,表示已經接上
2020/05/21 21:21:47 Upstream: => http://127.0.0.1:8080
2020/05/21 21:21:47 Token: "b351626665fce66aaba0867b1971212bcd5d2c05"
map[Authorization:[Bearer b351626665fce66aaba0867b1971212bcd5d2c05] X-Inlets-Id:[37d546dafe57455abbb19925ef5cc046] X-Inlets-Upstream:[=http://127.0.0.1:8080]]
INFO[0000] Connecting to proxy url="ws://your_id:8000/tunnel"
inlets server 則會輸出這樣的訊息表示有 client 連上來
INFO[867191] Handling backend connection request [37d546dafe57455abbb19925ef5cc046]
這時就可以用瀏覽器開啟 http://your_id:8000
,開啟後就可以看到 localhost web 應用程式的結果了
# 搭配 Caddy 直上 SSL
一般來說開發 web 金流串接,金流公司會要求要用 SSL 連線收 webhook ,這時可以搭配 Caddy 做一個 SSL 的 reverse proxy 。
Caddy 是一個用 Go 開發的 web server ,最大的特色就是內建方便的機制可以快速地申請 Let’s Encrypt 的 SSL 憑證
# 準備一個網域
首先要準備一個網域,如果沒有網域的話,可以去買一個,這邊院長推薦使用 Gandi (opens new window) 的網域註冊服務
接著再把網域指定到 server 的 IP 就可以了
# 安裝與啟動 Caddy
接著安裝 Caddy
git clone "https://github.com/caddyserver/caddy.git"
cd caddy/cmd/caddy/
go build
安裝好後,就可以啟動 Caddy server ,啟動 Caddy server 要搭配一個 caddy file
範例的 caddy file 如下,基本上很簡單就是一個 reverse proxy
your_domain
proxy / 127.0.0.1:8000 {
transparent
}
proxy /tunnel 127.0.0.1:8000 {
transparent
websocket
}
啟動 Caddy
caddy -conf Caddyfile.your_domain
接著就會看到啟動的訊息,同時也會去 Let's encrypt 申請 SSL 憑證
Activating privacy features... 2020/05/22 16:49:57 [INFO] [yout_domain] acme: Obtaining bundled SAN certificate
2020/05/22 16:49:59 [INFO] [yout_domain] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/4740073383
2020/05/22 16:49:59 [INFO] [yout_domain] acme: Could not find solver for: tls-alpn-01
2020/05/22 16:49:59 [INFO] [yout_domain] acme: use http-01 solver
2020/05/22 16:49:59 [INFO] [yout_domain] acme: Trying to solve HTTP-01
2020/05/22 16:49:59 [INFO] [yout_domain] Served key authentication
2020/05/22 16:49:59 [INFO] [yout_domain] Served key authentication
2020/05/22 16:49:59 [INFO] [yout_domain] Served key authentication
2020/05/22 16:50:00 [INFO] [yout_domain] Served key authentication
2020/05/22 16:50:05 [INFO] [yout_domain] The server validated our request
2020/05/22 16:50:05 [INFO] [yout_domain] acme: Validations succeeded; requesting certificates
2020/05/22 16:50:07 [INFO] [yout_domain] Server responded with a certificate.
done.
Serving HTTPS on port 443
https://yout_domain
Serving HTTP on port 80
http://yout_domain
啟動完 Caddy 就已經是一個 reverse proxy 會把 https://yout_domain 的 request 轉到 http://127.0.0.1:8000 ,同時因為 inlets 也是在啟動的狀態,所以又會把 request 轉到 localhost 來。
如此一來就完成 inlets + caddy SSL 內網通外網的機制,這樣在開發 Bot 或是金流服務就可以大大增加開發的效率