PPPoE IPv4 NAT ルーター

物理 WAN は Ethernet で、IPv4 インターネットへの出口を PPPoE セッションで作る例です。
完全な YAML は examples/example-pppoe-ipv4-nat.yaml にあります。
構成図
図の対応表
| 番号 | 意味 | 主なリソース |
|---|---|---|
| [1] | routerd の管理外にある回線終端 / ONU。 | routerd 管理外 |
| [2] | PPPoE を通す物理 Ethernet インターフェース。 | Interface/wan |
| [3] | PPPoE セッションと論理的な出口インターフェース。 | PPPoESession/pppoe-home |
| [4] | IPv4 forwarding を導出し、nftables NAT を適用するホスト。 | Derived host runtime, NAT44Rule/lan-to-pppoe |
| [5] | LAN ゲートウェイと DHCPv4 セグメント。 | IPv4StaticAddress/lan-base, DHCPv4Server/lan-dhcpv4 |
| [6] | NAT 経由で PPPoE を IPv4 インターネット経路として使うクライアント。 | DHCPv4Server/lan-dhcpv4 |
この例で管理するもの
| 領域 | routerd リソース |
|---|---|
| PPPoE セッション | PPPoESession/pppoe-home |
| LAN アドレス / DHCPv4 | IPv4StaticAddress/lan-base, DHCPv4Server/lan-dhcpv4 |
| IPv4 インターネット接続 | NAT44Rule/lan-to-pppoe |
| フィルタリング | FirewallZone/*, FirewallPolicy/home |
設定の要点
# [3] 物理 WAN 上に作る論理 PPPoE インターフェース。
- kind: PPPoESession
metadata:
name: pppoe-home
spec:
interface: wan
ifname: ppp-home
username: user@example.jp
passwordFile: /usr/local/etc/routerd/secrets/pppoe-home.password
mtu: 1454
mru: 1454
defaultRoute: true
# [5] -> [3] LAN の IPv4 トラフィックを PPPoE セッション側へマスカレードする。
- kind: NAT44Rule
metadata:
name: lan-to-pppoe
spec:
type: masquerade
egressInterface: pppoe-home
sourceRanges:
- 192.168.40.0/24
daemon の前に確認する
以下は sudo を実行できる通常ユーザーを想定します。まだサービスを起動していないため、
routerctl ではなく routerd を使い、dry-run の状態ファイルは一時ディレクトリへ隔離します。
LAB_DIR="$(mktemp -d)"
sudo routerd validate --config examples/example-pppoe-ipv4-nat.yaml
sudo routerd apply --config examples/example-pppoe-ipv4-nat.yaml --once --dry-run --skip-service-manager \
--state-file "$LAB_DIR/state.db" \
--ledger-file "$LAB_DIR/ledger.db" \
--status-file "$LAB_DIR/status.json"
sudo sed -n "1,160p" "$LAB_DIR/status.json"
サービス起動後に確認する
レビュー済みの設定を適用して routerd.service を起動した後で、ルーター上で次を実行します。
sudo routerctl describe PPPoESession/pppoe-home
sudo ip link show ppp-home
sudo ip route show default
よく変えるところ
- PPPoE のパスワードは YAML に直書きせず、参照先の秘密ファイルに置きます。
mtuとmruは ISP の案内に合わせます。- PPPoE をバックアップ経路にする場合は
defaultRoute: falseにします。