其實直接在電腦上安裝 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,如果都是的話就代表設定正確,可以開心上網了。