RouterOS 連上 Cloudflare WARP 的方式

其實直接在電腦上安裝 Cloudflare WARP 客戶端會比較省事,但是個人有 RouterOS 上的 DNS Server 需求(因為我有些 DNS Record 只有經過我的 Router 上的 DNS Server 才解析得到),所以就必須想辦法在 RouterOS 上實現連上 Cloudflare WARP 的方法。

還好 Cloudflare WARP 背後的連線方式是 WireGuard,剛好 RouterOS 7 以後原生支援 WireGuard,我們就用它來連線。

向 Cloudflare 取得 WARP 的連線資訊

首先,你需要 wgcf 這個第三方工具才有辦法產生出 Cloudflare WARP 的 WireGuard 組態資訊,這邊不說明安裝步驟。

安裝好 wgcf 之後,你可以先向 Cloudflare 註冊目前的電腦:

wgcf register

選擇 YES 之後應該就會產生 wgcf-account.toml 檔案。

之後,要透過註冊資訊產生出 WireGuard 連線資訊:

wgcf generate

這樣就會產生 wgcf-profile.conf 檔案,待會設定會用到它。

在 RouterOS 上建立 WireGuard 設定

接著就是進入到 RouterOS 後台做設定,我建議這邊使用 WinBox 可以避免掉 WebFig 的一些問題(例如 IP Route 頁面的 bug)。

首先進入 WireGuard 頁面新增一個 Interface ,名稱可自訂,基本上只要填 Private Key 和 MTU 就好,其他都不用動:

接著填寫 Peer,這邊可以根據 wgcf-profile.conf 的內容進行填寫,不過 Endpoint 我選擇取得 engage.cloudflareclient.com 的真實 IP(如果有看一些中國翻牆文章會知道其實 Cloudflare 有一小段網域都是 Endpoint,我是 ping 出哪個 IP 就用哪個) :

最後,進入 Interfaces -> Interface List 新增一個 Member,把剛剛新增的 WireGuard Interface 加入到 WAN 裡面:

設定 IPv4 路由以及防火牆

因為 WireGuard 主要連線還是走 IPv4,所以必須用流量標記的方式,才有辦法讓 WireGuard 確保連線的同時也能夠把其他連線通通導向 WireGuard 的 Interface 上。

首先,先至 IP -> Addresses 上新增 Cloudflare WARP 內部網路的 IP 位置,並且指定 Interface 為 WireGuard,IP 位置的部份跟 wgcf-profile.conf 的內容大致相同,但這邊須使用 /24 而非 /32:

接著至 Routing -> Tables 裡面,新增一個 Routing table,之後做流量標記的時候會用到,FIB 選項記得勾選:

接著是 IP -> Routes 的設定,由於要將所有流量導向 Cloudflare WARP,因此 Dst. Address 設定為 0.0.0.0/0,Gateway 必須選擇剛剛新建的 WireGuard interface,Distance 必須設為 1 或更小(或是看你原本的 Gateway 的 Distance 是多少直接減一也可以),Routing Table 則是選擇剛剛新增的 Table 名稱:

接著進入 IP -> Firewall -> NAT 設定,預設來說應該會有一組 Out. Interface List 為 WAN 的 Masquerade 設定,如果有的話就不用動它。如果沒有,那你就要手動新增,內容如下:

  • 在 General 頁面,Chain 為 srcnat,Out. Interface List 為 WAN
  • 在 Action 頁面,Action 為 masquerade

正確設定的話,應該會長這個樣子(請忽略已經呈現灰色停用狀態的設定):

緊接著在 Firewall 視窗內切換至 Mangle 的頁面,新增一條設定。首先 General Chain 必須設定為 prerouting ,Src. 和 Dst. Address 必須設定為你自己內部網路的 IP 位置(這邊以 192.168.1.0/24 為例),記得 Dst. Address 前面的驚嘆號必須點出來,表示「對所有來源為 192.168.1.0/24,但目的地非 192.168.1.0/24 的封包做處理」:

接著切換至 Action 頁面,Action 須選擇 mark routing,New Routing Mark 則必須選擇剛剛新增的 Routing table,最後記得把 Passthrough 取消,就可以新增這個設定了:

最後切換到 Filter Rules,把 Fasttrack 的設定給停用,否則 Mangle 規則會失效:

這樣一來 IPv4 部份就設定完成。

IPv6 走 Cloudflare WARP

Cloudflare WARP 連上後,不管你的原本的網路有沒有 IPv6 連線能力,你都可以瀏覽 IPv6 網站,因為 Cloudflare WARP 有給予 IPv6 連線能力。

不過 Cloudflare WARP 只給我們一個 IPv6 地址,這邊必須使用 NAT66 來處理。老實說 IPv6 地址多到實在不需要用到 NAT66,沒辦法,畢竟 Cloudflare 大概也不會預期到我們會這樣用。

首先不免俗的還是要新增 Address,至 IPv6 -> Addresses 下新增。首先先新增 wgcf 裡面給的 IPv6 地址(2606 開頭),Interface 指向 WireGuard 的 Interface,記得 Advertise 要取消勾選:

因為會用到 NAT66,必須宣告一個類似於 IPv4 的 Private Address 的東東,這邊再新增一組地址,以 fd00 為開頭,此類地址為唯一區域地址(Unique Local Address,ULA),並且要對 Bridge 上所有 Interface 做 advertise(不然沒人知道):

緊接著查看 IPv6 -> ND 裡面應該有一組 Interface 為 Bridge 的設定,如果沒有的話可以照下圖的設定新增:

接著一樣要設定 Routing,至 IPv6 -> Routes 內新增一組 Dst. Address 為 ::/0 ,Interface 為 WireGuard interface 的設定,其他設定可以不用動:

接著去 IPv6 -> Firewall -> NAT 設定 NAT66。首先新增一組設定,General 內 Chain 為 srcnat,Out Interface 為 WireGuard 的 Interface:

接著切到 Action 頁面,Action 為 src nat,To Address 填寫 WireGuard 設定檔當中 2606 開頭的地址,然後按下 OK 新增:

最後去 IPv6 -> Settings 把 Disable IPv6 取消勾選就大功告成:

收工與測試

當一切都設定好之後,去 test-ipv6.com 測試一下看看 IPv4 和 IPv6 是否都有跑出來,且服務商為 Cloudflare,如果都是的話就代表設定正確,可以開心上網了。

參考資料

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *