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 埠,或者在防火牆停用對外開放的規則。

可以參考下面指令,但我做的比較絕一點,主要調整這些項目,降低服務或防火牆規則任一項被誤啟動而帶來的風險

  1. 停用對外開放的規則
  2. 調整 HTTP 至非 80 埠的位置
  3. 停用 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