支援的平台

routerd 以跨 OS 為前提設計。 各平台所使用的主機端機制因 OS 而異。 本頁明確列出 routerd 在各平台使用的 OS 功能。 套用前,請先確認產生的檔案與執行時期的擁有範圍。
Linux (Ubuntu / Debian)
以使用 systemd 的 Linux 為主要目標。
發布安裝程式的預設安裝位置為 /usr/local 之下。
展開 Linux 用的發布封存檔後,執行 sudo ./install.sh。
安裝程式可透過 apt-get、dnf、pacman 之一安裝執行時期套件。
routerd 在 Linux 上使用的 OS 功能如下。
- systemd unit
/run/routerd與/var/lib/routerd(執行時期與持久狀態)- dnsmasq(DHCPv4 / DHCPv6 / DHCP relay / RA)
- nftables(封包過濾 + NAT)
- conntrack(連線觀測)
- iproute2(介面 + 路由)
- pppd / rp-pppoe(PPPoE)
- WireGuard、Tailscale、strongSwan、radvd
即使在 Ubuntu 上,也不預設套件已預先安裝。
初次準備時,install.sh 會安裝實用的預設套件組合。
持續的宣告式管理請透過 Package 資源宣告相依關係。
參考套件清單如下。
| 分類 | 套件 |
|---|---|
| Runtime | dnsmasq-base, nftables, conntrack, iproute2, ppp, wireguard-tools, tailscale, tailscale-archive-keyring, strongswan-swanctl, radvd |
| Diagnostics | dnsutils, iputils-ping, iputils-tracepath, tcpdump, traceroute, net-tools |
| OS 控制 | procps, systemd, kmod |
routerd-dhcpv6-client、routerd-dhcpv4-client、routerd-pppoe-client、routerd-healthcheck 在 Linux 上以 systemd 服務運作。
Ubuntu 26.04 LTS(resolute)已針對受管理的 dnsmasq、nftables、DHCPv6-PD、
委派的 LAN IPv6 位址、控制 API,使用與 Ubuntu 24.04 相同的 Linux
data-plane renderer 完成實機驗證。但在主機 bootstrap 方面,OS 的
網路設定有需注意之處。對於 routerd 所擁有的 DHCPv6-PD 或 LAN RA/DHCPv6
介面,請避免 OS 側的 systemd-networkd 開啟 DHCPv6 client socket。
否則 systemd-networkd 可能比 routerd-dhcpv6-client 更早 bind UDP port 546。
Ubuntu 26.04 的 lab 路由器做法是,OS 的 DHCP 僅保留於管理介面, routerd 所擁有的 WAN/LAN 介面在 OS 層級只設定 link-local。
network:
version: 2
renderer: networkd
ethernets:
ens18:
dhcp4: false
dhcp6: false
accept-ra: false
link-local: [ipv6]
optional: true
ens19:
dhcp4: false
dhcp6: false
accept-ra: false
link-local: [ipv6]
optional: true
ens20:
dhcp4: true
dhcp6: false
accept-ra: false
link-local: [ipv6]
optional: true
若 WAN link 需要從 RA 取得 IPv6 預設路由,請宣告 WAN 介面及 DHCPv6 / RA 資源。
routerd 會作為 systemd-networkd drop-in 推導出 IPv6AcceptRA=yes 與
[IPv6AcceptRA] DHCPv6Client=no,因此可在接受 RA 的同時停用 OS 側的 DHCPv6 client。
FreeBSD
FreeBSD 同樣使用與 Ubuntu 相同的 routerd 資源模型。
套用目標為 FreeBSD 的主機機制。
DHCPv6-PD client 透過 daemon(8) 執行,穩定維持租約。
routerd 不使用 Linux 用的機制,而是將資源對應至 FreeBSD 的 rc.conf、rc.d、pf、mpd5、ifconfig、dnsmasq。
展開 FreeBSD 用的發布封存檔後,執行 sudo ./install.sh。
安裝程式透過 pkg 安裝 ports 套件,並只對 base system 的指令進行確認,不另行安裝。
已實作的項目如下。
- DHCPv6-PD 常駐程式與租約持久化
- WireGuard 與 Linux 的互通
- VXLAN over WireGuard
- 透過
mpd5.conf、mpd_enable、mpd5服務重啟實現 PPPoE Package透過pkg安裝gateway_enable、ipv6_gateway_enable、cloned_interfaces、ifconfig_*、static_routes、ipv6_static_routes、pf_enable、pflog_enable、mpd_enable的 FreeBSD 風格rc.conf.d輸出routerd render freebsd --out-dir產生dhclient.conf、mpd5.conf、pf.conf、dnsmasq 設定、rc.dscript- 從
FirewallZone/FirewallPolicy/FirewallRule產生(render)pf 規則 - 從
NAT44Rule產生 pf NAT - 對產生的
pf.conf執行pfctl -nf驗證與pfctl -f套用 - 將
pfctl -ss -v輸出轉換為流量流(traffic flow) - 透過 BPF 直接讀取
pflog0的防火牆日誌,不依賴 tcpdump 文字格式的差異來解析封包 - DHCPv4、DHCPv6、RA 用的受管理 dnsmasq
- 在
/var/db/routerd/dnsmasq下持久化 dnsmasq 租約 - 服務重啟前以
dnsmasq --test確認設定 - 自動產生 DHCP、DNS、RA、DHCPv6-PD、DS-Lite、WireGuard、HealthCheck 所需的 pf 開口
- 從
generated service artifacts產生 rc.d script routerd-healthcheck的 rc.d script 產生routerd-firewall-logger的 rc.d script 產生,並直接讀取pflog0
ClientPolicy 目前為 Linux 專用的防火牆功能。
使用 nftables 的 Ethernet 來源位址 set 隔離訪客裝置。
FreeBSD pf 無法在 routed filter 路徑以相同模型處理,因此 routerd 明確將此資源標示為不支援。
TailscaleNode的 rc.d script 產生- 靜態 DS-Lite gif tunnel 的產生(render)
- 從靜態 AFTR IPv6、AFTR FQDN、委派位址衍生的本地來源動態套用 DS-Lite
- 雲端 VPN 用
IPsecConnection的驗證,以及 strongSwanswanctl連線定義的產生。與雲端閘道的實際連通性確認依環境個別進行
FreeBSD 不使用 Linux 專用的 nftables / conntrack / iproute2。
Package 的範例宣告 FreeBSD 側的替代品。
pf 與 pflog0 使用 base system,PPPoE 使用 mpd5,DS-Lite 使用 ifconfig gif,
LAN 的 DHCP/RA 使用 dnsmasq,WireGuard、Tailscale、strongSwan 使用 ports 套件。
| 分類 | 套件 |
|---|---|
| Runtime | dnsmasq, wireguard-tools, tailscale, strongswan, mpd5 |
| Diagnostics | bind-tools, tcpdump |
| Base system | ifconfig, sysctl, service, sysrc, netstat, sockstat, tcpdump, ping, traceroute |
routerd render freebsd --out-dir <dir> 輸出以下內容。
rc.conf.d-routerddhclient.confmpd5.confpf.confdnsmasq.confrc.d-*
routerctl apply 會安裝產生的 pf.conf,
並在套用前以 pfctl -nf 確認語法。
dnsmasq 也會以 dnsmasq --test 確認設定後重新啟動。
套用後以 pfctl -f 反映,並以 service <name> onestart 啟動產生的 rc.d script。
靜態 rc.conf 產生不足以描述的 DS-Lite tunnel 以 ifconfig gif 動態套用。
正式投入生產前,請先以 routerd render freebsd 確認輸出。
Platform parity backlog
Ubuntu 和 FreeBSD 相互比較時的已知差異。
| 領域 | 目前差異 | 待辦事項 |
|---|---|---|
| CI / runtime coverage | CI 在 Ubuntu 上執行 unit test 與 Linux static check。FreeBSD 在發布時進行 cross build。 | 新增 FreeBSD VM 的 smoke 工作,涵蓋 validate、plan、實際 package-manager 確認、服務啟用、renderer 語法確認。 |
| FreeBSD 的功能例外 | ClientPolicy 依賴 nftables 的 Ethernet 來源位址 set,為 Linux 專用。 | 在找到可保留相同隔離語義的設計之前,明確拒絕。 |
| 套件 bootstrap | Ubuntu 和 FreeBSD 可命令式安裝套件。 | 對 apt、pkg 的 schema、validation、安裝程式套件清單、範例、產生文件保持同步。 |
OS 抽象化的實作方針
新增 OS 固有行為時,請勿在 business logic 層直接讀取 runtime.GOOS。
使用 pkg/platform 層(platform.Features)或 Go 的 build tag 明確界定邊界。
對不在支援範圍的 OS,優先在 validation 或 planning 階段明確報錯,
而非等到執行時才發生預期外的失敗。