首先藉由 VMware 很漂亮的一張圖做為封面,帶入 SSL Termination 的觀念:不像傳統上把 SSL 憑證塞在 Web Server,而是用前面的反向代理或負載平衡處理上傳解密。再來就是以往在 Docker Compose 都是由 Nginx 擔任這角色,但現在 K3s 用得多,內定是 Traefik,硬換回 Nginx 似乎有點跟不上時代,所以這邊就想來探究一番如何更新。
在邀請 Nginx 或 Traefik 這類工具大展身手前,我們得先準備一個 Web Application,再拉我們的對象來當擋箭牌。如果是常見的 Linux 發行版應該是內建 Python3 的,那就只要一行指令:
python3 -m http.server
不過我們同事大多數是微軟愛用者,那也沒關係,是開發人員吧?(不是的應該對這篇沒興趣?)有裝 DotNET 吧?有的話,也只要四行:
mkdir myProj cd myProj dotnet new web dotnet run
http.server 預設的埠號是 8000,dotnet 則是五千多的一個亂數,所以我們先驗證一下:curl localhost:8000 或者喜歡用瀏覽器?如果是 dotnet 也別忘了改埠號,到此為止若一切正常的話,那就繼續囉。
Traefik 也是跨平台的,請參考這邊
的資訊下載安裝。裝好後就是一個執行檔,可以帶參數或吃設定檔,我們先在同目錄準備簡單的 traefik.toml:
[providers.file] filename = "traefik.toml" [[entryPoints]] address = ":8080" [[http.routers]] rule = "Method(`GET`)" service = "my-service" [[http.services.my-service.loadBalancer.servers]] url = "http://localhost:8000"
執行看看,如果 8000 與 8080 的回傳結果一致,就代表我們的反向代理設成功了!再把憑證的相關檔案也放在同目錄,設定檔也要改一下:
[providers.file] filename = "traefik.toml" [[entryPoints]] address = ":443" [[http.routers]] rule = "Method(`GET`)" service = "my-service" tls = {} [[http.services.my-service.loadBalancer.servers]] url = "http://localhost:8000" [[tls.certificates]] certFile = "gss.com.tw-sha256.crt" keyFile = "gss.com.tw.key"
因為這次用的是 https 預設的 443,在 1024 以下,要 sudo 或系統管理員權限才能把 traefik 跑起來,驗證之前也要先賦予一個 FQDN,可以修改 /etc/hosts 或是 C:\Windows\System32\drivers\etc\hosts,又或者請 curl 暫時代勞一下:
curl --resolve a.gss.com.tw:443:127.0.0.1 https://a.gss.com.tw
若能得到 8000 一樣的回傳結果,就是 SSL Termination 設定成功了!再加碼一個技巧,上面的設定檔通常建議是拆成兩個:
#traefik.toml [providers.file] filename = "dynamic.toml" [[entryPoints]] address = ":443"
#dynamic.toml [[http.routers]] rule = "Method(`GET`)" service = "my-service" tls = {} [[http.services.my-service.loadBalancer.servers]] url = "http://localhost:8000" [[tls.certificates]] certFile = "gss.com.tw-sha256.crt" keyFile = "gss.com.tw.key"
這將帶來一個明顯地好處,一般來說,異動大多集中在第二個檔案,當 dynamic.toml 修改存檔後,traefik 是不須重啟立即生效的。