Ubuntuは22.04を使用しているので、他のバージョン・ディストリビューションでは一部機能が提供されていない場合もあります。雑感としてはsystemd-networkdは進化の途中のようでバージョン間での非互換が多そうです。当初IPv6は上流からDHCPv6-PDで譲り受けたprefixを下流に広告していましたが、systemdのバージョンが上がると設定の書き方が変わってしまうので記載を見送りました。
今回の仕様
- 上流からネットワーク情報を受け取り接続する
- 下流からのIPv4通信はNATを経由して外部へアクセスする
- 下流からのIPv6通信は
上流から移譲を受けた予め設定したprefixでNATを経由する - キャッシュDNSサーバーを提供する
- Ubuntuの今どきの(?)設定方法を踏襲する
ネットワーク設定
Ubuntu Serverではsystemd-networkdが使われています。systemdのサブコマンドですし、今後はnetworkdの採用が進むのでしょうか?
そして、基本設定は直接書くわけでなくnetplanを使うのがUbuntuの流儀のようです。
netplanはnetwrokdとNetworkManager両対応のコンフィグレーション生成プリプロセッサですが、rendererを指定しなければnetworkdの設定を/run/systemd/network以下に書き出してくれます。便利なもののすべてに対応できるわけでもないですし、canonicalオリジナルツール故に他のディストリでの採用はなさそうと微妙な気もします。
network:
ethernets:
eth1:
dhcp4: true
dhcp6: true
accept-ra: true
eth2:
optional: true
addresses:
- "192.0.2.1/24"
- "2001:db8::/64" <-- 上流からプレフィクス委譲を受ける場合は不要です
eth1は上流からDHCP, SLAACで各種情報を受け取ります。
eth2は下流へ192.0.2.1/24,2001:db8::/64で接続します。
※このIPアドレスは利用環境に応じて変更してください。
DHCPv4サーバー
netplanはnetworkdのすべての設定を行えるわけではないので、/etc/systemd/network/以下に追加の設定を別途行います。
[Network]
DHCPServer=yes
IPMasquerade=both <-- IPv4のみNATする場合はipv4と書きます
[DHCPServer]
DNS=192.0.2.1
よほど凝った設定でなければnetworkdだけで対応できそうです。
IPMasqueradeはipv4
, ipv6
, both
でどちらかもしくは両方を対象にできます。
DNSキャッシュサーバー
昨今のディストリビューションだとsystemd-resolvedが使われていると思います。しかし、これは自ホストのみがDNSキャッシュを使えるようにローカルループバックでlistenしています。そこで、下流のクライアントが参照可能なIPアドレスを追加します。
[Resolve]
DNSStubListenerExtra=192.0.2.1
IPv6が必要なければここまでで完了です。
IPv6ルーター広告
IPv6を使う場合には、netplanで記載したeth2のprefixを下流にルーター広告します。これもnetworkdだけで実現できます。
[Network]
IPv6SendRA=yes
[IPv6Prefix]
Prefix=2001:db8::/64
systemd-{networkd,resolved}の再起動
netplanを適用して再起動させれば反映されます。ネットワーク越しにしかアクセスできない機材へ設定している場合には念入りに確認してから反映するようにしてください。
$ systemctl restart systemd-resolved
$ netplan apply
そもそも無効化されている場合には有効にしないといけませんが、networkdが無効ということは、NetworkManagerなど他の管理機構が使われてるので調整が必要です。