Mikrotik RouterOS 是我近年閒暇時間用來折騰自己 (!?) 的設備,本來一直都是單純使用它的 Winbox 工具來管理及設定, 但因為最近手上的 RouterOS 設備有增生現象,為了提升便利性,決定啟動 Web 管理介面。
RouterOS 的 Web 管理介面如一般所知,有支援 HTTP (www) 及HTTPS (www-ssl) ,但以現今的資安基本常識,正常都只會選擇啟動 HTTPS,但系統預設並沒有預載任何憑證,故無可掛載給 HTTPS 使用;因此啟動 HTTPS 後連線,只會看到像下面的錯誤訊息。
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Details
Unsupported protocol
The client and server don't support a common SSL protocol version or cipher suite.
還好,從 RouterOS 7.0 開始,想將 Let's Encrypt 憑證掛入使用,變得簡單許多,也可解決系統預設沒有自簽憑證的問題。
想完成這目標的前置準備如下
- 已有 完整網域名稱指向到 RouterOS 設備上
- RouterOS 至少為 7
- 對外啟動 HTTP 80 埠管理介面
官方文件寫的,就是要 TCP 80 埠
設定網域名稱指向到 RouterOS 設備
這裡就不多提,有很多方式可以完成。如果沒有自有網域或固定 IP,可以寫指令批次使用 No-IP 或其他免費的動態 DNS 服務。另一種更簡單快速是,用免費內建的 IP \ Cloud,只是取得的 DNS 名稱不是一般人可以快速記得的。
RouterOS 至少為 7 以上
使用 Winbox 時,可以快速在工具標題列檢查目前版本。如果版本還是 6.x,到 System \ Packages,點擊 Check For Updates,以後續可使用 enable-ssl-certificate 指令。
強烈建議升級前,先備份目前設定及已存的指令。印象我之前從 6 升級到 7,部分指令及排程設定不明原因遺失,還好透過之前寫的備份指令及定期執行,快速將設定補回。
對外開啟 HTTP 80 埠管理介面
這段包含了系統管理服務埠及防火牆設定。
系統管理服務埠 - IP \ Service,使用 Terminal 方式執行指令,以啟動 HTTP 80 埠管理介面
/ip service set www port=80 /ip service enable www
GUI 操作範例參考如下
防火牆新增對外開放規則 - IP \ Firewall \ Filter Rule
增加防火牆規則,以對外開放 HTTP 80 埠
/ip firewall/filter/add chain=input action=accept protocol=tcp in-interface-list=WAN src-port="" dst-port=80 log=yes comment="HTTP 80 for LetsEncrypt Cert Only" place-before=0
UI 設定方式參考如下。請另外注意,透過 UI 新增的規則,預設會在最後一條,可能會因為阻擋條件及規則順序關係,導致無法生效,請視情況自行拖曳位置調整順序。用前面的指令範例,則已經設定放到最前面。
建議勾選 log,這樣誰來敲 HTTP 80 埠,都會被記錄到。
使用 enable-ssl-certificate 指令取得憑證
完成上述前置工作後,就可以使用 enable-ssl-certificate 指令,直接與 Let's Encrypt 服務溝通,取得憑證並自動掛入。
請注意,dns-name 的值如範例的 myown.domain.com,必須是已經可解析到 RouterOS 的對外服務 IP,也就是 Let's Encrypt 要能回過來找到你的 RouterOS 設備及溝通。
/certificate enable-ssl-certificate dns-name=myown.domain.com
執行過程如下圖
如果前面準備工作不足,可能會遇到像這樣的錯誤訊息
啟動 HTTPS 服務
成功取得憑證後,用下面指令啟動 HTTPS ( www-ssl) 服務,後續就可以用 HTTPS 方式連線到 Web 管理介面。
/ip/service/enable www-ssl
若透過 UI 在 IP \ Service 啟動 HTTPS,可以看到 Certificate 欄位出現對應名稱
在 Systm \ Certificate 也能看到憑證的完整資訊
請注意,雖然已經完成 Let's Encrypt 憑證的取得,但此時 HTTP 80 埠仍是對外開著的狀態,代表沒事就很容易引來全球的關心 (!?) ;以我自己的標準來說,開啟 80 埠更是不允許的事情。
如沒有使用必要,請關閉 HTTP 80 埠,或者在防火牆停用對外開放的規則。
可以參考下面指令,但我做的比較絕一點,主要調整這些項目,降低服務或防火牆規則任一項被誤啟動而帶來的風險
- 停用對外開放的規則
- 調整 HTTP 至非 80 埠的位置
- 停用 HTTP
/ip firewall/filter/disable number=0 /ip service/set www port=10080 /ip service/disable www
執行過程如下圖
第一條指令中,防火牆規則的 number 值請對應該規則的現況位置
最後,可考慮將上述申請及停用的動作指令,整合到 Script (System \ Scripts) 並排程 (System \ Scheduler) 執行,就能自動化定期更新憑證了。
參考資料
MikroTik Doc - Certificates - Let's Encrypt certificates
MikroTik Doc - Filter
MikroTik Doc - Cloud
Dynamic DNS - No-IP
發佈留言