# inlets - 內網通外網測試 金流服務 or Bot 神器

在串接 金流服務 或是要接受 Bot 回傳的 webhook 都會遇到一個問題,就是不能在 localhost 收到 webhook ,之前有分享過有幾個服務跟工具可以內網通外網把 localhost 跟虛擬主機連在一起

那這次介紹 inlets (opens new window) 這個使用 Golang 開發的 open source 的工具可以內網通外網,只要你有一台虛擬主機就可以安裝來用。

院長有一台 Linode 的虛擬主機(我的推薦連結 (opens new window)),所以我是安裝 inlets 在虛擬主機上,Mac 筆電就是開發環境,上面跑 web 應用程式。

當我要測試金流服務時就會用 inlets 來把金流服務給的 webhook 從虛擬主機轉回我的筆電

# 安裝方式

安裝方式 (opens new window)非常簡單

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 或是金流服務就可以大大增加開發的效率

贊助商連結
(adsbygoogle = window.adsbygoogle || []).push({});