systemd-networkd

提供: ArchWiki
2015年12月6日 (日) 16:54時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

関連記事

バージョン 210 から、systemd は udev と networkd による基本的なネットワーク設定のサポートを含むようになりました。

systemd-networkd はネットワーク設定を管理するシステムデーモンです。ネットワークデバイスが立ち上がるとそれを検出して設定を行い、仮想ネットワークデバイスを作成することもできます。このサービスは netctl などの通常のネットワーク管理ツールと一緒に動かすことが可能で、仮想化する場合、設定によってはツールを置き換えることもできます。特に systemd-nspawn で管理するコンテナのための基本的な、もしくは複雑なネットワーク設定 (固定 IP、ブリッジ、vlan など) を設定する場合にこのサービスはとても役に立ちます。

基本的な使い方

systemd パッケージは Arch ではデフォルトでインストールされており、有線ネットワークに接続するために必要なファイルは全て揃っています。後で述べているように、wpa_supplicant など他のサービスを使うことで無線アダプタを設定することもできます。

必要なサービスと設定

systemd-networkd を使用するには、以下の2つのサービスを起動して、システムのブート時に実行されるように有効化する必要があります:

  • systemd-networkd.service
  • systemd-resolved.service
ノート: systemd-resolved が必要になるのは .network ファイルで DNS エントリを指定したり、networkd の DHCP クライアントから DNS アドレスを取得する場合です。

resolv.conf の互換性のために、既存のファイルを削除または名前変更して以下のシンボリックリンクを作成してください:

# ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

さらに、systemd-resolved のローカル DNS スタブリゾルバ (インターフェイスごとに LLMNR や DNS マージングが使われます) を使うために、/etc/nsswitch.confdnsresolve に置き換えます:

hosts: files resolve myhostname

man systemd-resolvedman resolved.conf、または Systemd README を参照してください。

ノート: ホストネームを指定しているとき、たとえ .network ファイルに UseDomains=yesDomains=[domain-list] を設定している場合 (resolv.confsearch [domain-list] が作成されます) でも、Systemd の resolve はローカルドメインを検索しません。この問題を解決するには:
  • 完全修飾ドメイン名を使うようにする。
  • /etc/hosts を使ってホストネームを解決する。
  • systemd の resolve の代わりに glibc の dns を使うようにする。

設定ファイルの例

このセクションにおける設定はすべて /etc/systemd/network の中に foo.network として保存します。利用できるオプションや処理の順番については、#設定ファイルsystemd.network の man ページを見て下さい。

まずシステムのデバイス名を知る必要があります。昔は、eth0 がシステム上の1番目の NIC に付けられていましたが、現在 udev は別の名前を使用するようになっています。networkctl list を使ってシステム上のデバイスを確認してください。

設定ファイルに変更を加えたら、networkd デーモンをリロードしてください:

# systemctl restart systemd-networkd 
ノート: 以下の例では、enp1s0 が有線アダプタ、wlp2s0 が無線アダプタです。環境によって名前は変わります。

有線アダプタで DHCP を使用

/etc/systemd/network/wired.network
[Match]
Name=enp1s0

[Network]
DHCP=ipv4

有線アダプタで固定 IP を使用

/etc/systemd/network/wired.network
[Match]
Name=enp1s0

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1

DNS サーバーやブロードキャストアドレスを指定するネットワークオプションは systemd.network(5) の man ページを見て下さい。

無線アダプタ

先に触れた通り、systemd-networkd で無線ネットワークに接続するには、wpa_supplicant など別のサービスで無線アダプタを設定してから適当なサービスを有効にしてください。以下の例では、wpa_supplicant@wlp2s0.service としています。

/etc/systemd/network/wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=ipv4

無線アダプタで固定 IP アドレスを使っている場合、設定は (インターフェイス名を除いて) 有線アダプタと同じになります。

同一マシンで有線アダプタと無線アダプタ両方を使用

以下の設定では、Metric ディレクティブを使用して、有線と無線両方の接続で DHCP IP を有効にしており、カーネルがオンザフライでどちらを使うか決定します。有線接続が切断されると、即座に無線に切り替わります。接続が途切れることはありません。

システム上の無線・有線どちらのデバイスも有効な接続がある場合、カーネルのルートメトリック (ip で設定するのと同一) がパケットを送るのにどちらのルートを使用するか決定します。均衡状態を破るために、カーネルはメトリックを使います。メトリックの良い所は、どちらかが使えなくなったときに、自動的にもう片方が有効になることです。

ノート: Metric オプションは RouteMetric オプションがスタティックルーティングを行うよう設定されていない時にその設定を行うためのものです。
/etc/systemd/network/wired.network
[Match]
Name=enp1s0

[Network]
DHCP=ipv4

[DHCP]
RouteMetric=10
/etc/systemd/network/wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=ipv4

[DHCP]
RouteMetric=20

IPv6 プライバシー拡張

IPv6 を使用する場合、IPv6PrivacyExtensions オプションも設定すると良いでしょう。/etc/sysctl.d/40-ipv6.conf の設定は反映されません。

/etc/systemd/network/wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=yes
IPv6PrivacyExtensions=true

[DHCP]
RouteMetric=20

設定ファイル

設定ファイルは /usr/lib/systemd/network から、そして一時的な実行時のネットワークディレクトリ /run/systemd/network とローカルのネットワーク管理ディレクトリ /etc/systemd/network から読み込まれます。/etc/systemd/network 内のファイルが一番優先されます。

3つのタイプの設定ファイルが存在します。

  • .network ファイル。マッチするデバイスにネットワーク設定を適用します。
  • .netdev ファイル。マッチする環境に仮想ネットワークデバイスを作成します。
  • .link ファイル。ネットワークデバイスが作られた時、udev は最初にマッチする .link ファイルを探します。

これらの設定ファイルは同じルールに従っています:

  • [Match] セクションの全ての条件がマッチすれば、プロファイルが有効になります。
  • 空の [Match] セクションはどんな場合でもそのセクションを適用することを示します (いわば * ジョーカーのようなものです)。
  • それぞれのエントリは NAME=VALUE 構文によるキーです。
  • 全ての設定ファイルは辞書順でまとめてソートされ処理されます。ファイルがどのディレクトリにあるかは関係ありません。
  • 同じ名前のファイルは互いを置き換えます。
ヒント:
  • /usr/lib/systemd/network にあるシステムによって提供されたファイルを上書きする (アップグレードしても変わらないようにする) には、/etc/systemd/network に同じ名前のファイルを配置して /dev/null にシンボリックリンクを張って下さい。
  • VALUE には * ジョーカーを使うことができます (例: en* は全ての Ethernet デバイスにマッチします)。
  • Arch-general スレッドによれば、特定のコンテナのネットワーク設定は networkd 設定ファイルを使ってコンテナの中で設定するのがベストプラクティスです。

network ファイル

このファイルはネットワーク設定の変数の設定、特にサーバーとコンテナの設定のために存在します。

以下は基本的な構造の MyProfile.network ファイルになります:

/etc/systemd/network/MyProfile.network
[Match]
a vertical list of keys

[Network]
a vertical list of keys

[Address]
a vertical list of keys

[Route]
a vertical list of keys

[Match] セクション

よく使われるキーは:

  • Name= デバイスの名前 (例: Br0, enp4s0)
  • Host= マシンのホストネーム
  • Virtualization= システムが仮想化環境で起動されているかどうかをチェックします。Virtualization=no キーはホストマシンでのみ適用され、逆に Virtualization=yes はコンテナや VM で適用されます。

[Network] セクション

よく使われるキーは:

  • DHCP=DHCPv4 や DHCPv6 サポートを有効にします。yes, no, ipv4, ipv6 が設定できます。
  • DNS=DNS サーバーのアドレスです。このオプションは複数個指定することができます。
  • Bridge= はリンクに追加するブリッジの名前です。
  • IPForward= は IP フォワーディングを有効にして、ルーティングテーブルに基づいてフォワーディングを実行します。インターネット共有を設定する場合は必須になります。設定できる値は: yes, no, ipv4, ipv6, kernelIPForward のデフォルトは 0 となっており、.network ファイルで IPForward の設定をしないかぎり、たとえ sysctl を使ったり /proc/sys に書き込んだりして IP フォワーディングをオンにしていても、インターフェイスの IP フォワーディングはオフになります。

[Address] セクション

[Address] セクションでよく使われるキーは:

  • Address= は固定の IPv4 または IPv6 アドレスとそのプレフィックス長で、/ を使って区切ります (例: 192.168.1.90/24)。このオプションは必須です。

[Route] セクション

[Route] セクションでよく使われるキーは:

  • Gateway= はマシンのゲートウェイのアドレスです。このオプションは必須です。

完全なキーのリストについては、systemd.network(5) を参照してください。

ヒント: Address= が Address キーだけを含み Gateway= セクションが Gateway キーだけを含む場合、略式表記として [Network] セクションに Address=Gateway= キーを記述することができます。

netdev ファイル

このファイルは仮想ネットワークデバイスを作成します。

以下は基本的な構造の Mydevice.netdev ファイルになります:

/etc/systemd/network/MyDevice.netdev
[Match]
a vertical list of keys

[Netdev]
a vertical list of keys

[Match] セクション

よく使われるキーは Host=Virtualization= です。

[Netdev] セクション

よく使われるキーは:

  • Name= は netdev を作成するときに使うインターフェイスの名前です。このオプションは必須です。
  • Kind= は netdev の種類になります。現在 bridge, bond, vlan, veth, sit などがサポートされています。このオプションは必須です。

完全なキーのリストについては、systemd.netdev(5) を参照してください。

link ファイル

このファイルはカスタム udev ルールの代わりとなりデバイスが現れた時に udev によって適用されます。

以下は基本的な構造の Mydevice.link ファイルになります:

/etc/systemd/network/MyDevice.link
[Match]
a vertical list of keys

[Link]
a vertical list of keys

[Link] セクションでデバイスの設定を指定した場合、[Match] セクションは指定した link ファイルが指定したデバイスに適用できるかどうかを決めます。

[Match] セクション

よく使われるキーは MACAddress=, Host=, Virtualization= です。

Type= はデバイスのタイプです (例: vlan)

[Link] セクション

よく使われるキーは:

MACAddressPolicy= は永続的な MAC アドレスをハードウェアに設定する persistent (ほとんどのハードウェアはこちらにするべきです) またはデバイスが現れた時にランダムな MAC アドレスを与える random を指定します。

MACAddressPolicy= を指定しなかった場合は MACAddress= を使います。

ノート: ほとんどの場合システムの /usr/lib/systemd/network/99-default.link で基本的に問題ありません。

コンテナでの使用方法

systemd 210 以上でサービスが利用可能です。ホストやコンテナで systemd-networkd.service有効化・起動することができます。

デバッグするときのために bridge-utils, net-tools, iproute2 パッケージをインストールすることが強く推奨されます。

systemd-nspawn を使用する場合、ネットワーク設定によっては、systemd-nspawn@.service を編集して ExecStart 行にブートオプションを追加する必要があります。オプションの完全なリストは man 1 systemd-nspawn を参照してください。

DHCP による自動 DNS 設定を利用したい場合は、systemd-resolved を有効にして /run/systemd/resolve/resolv.conf から /etc/resolv.conf にシンボリックリンクを張る必要があります。詳しくは systemd-resolved.service(8) を見て下さい。

ヒント: コンテナネットワークの設定を始める前に:
  • netctl サービスを全て無効にしてください。無効にすることで systemd-networkd との危険な衝突を回避することができ設定のテストが楽になります。さらに、有効な netctl プロファイルが残ったまま終了する可能性が少なくなります。$ netctl list コマンドは全てのプロファイルのリストを表示し、有効になっているプロファイルには星印が付きます。
  • systemd-nspawn@.service を無効にしてコンテナを起動するときは # systemd-nspawn -bnD /path_to/your_container/ コマンドとオプションを使ってください。ログオフやシャットダウンをするには、コンテナの中で # systemctl poweroff を実行してください。ネットワーク設定が要求を満たすようになったら、systemd-nspawn@.service有効化・起動してください。
  • dhcpcd.service が有効になっている場合は無効にしてください。このサービスは全てのインターフェイスに dhcpcd を使わせます。
  • コンテナで netctl プロファイルや、systemd-networkd.service が有効になっていないことを確認してください。
  • トラフィックをブロックするような iptables ルールが設定されていないことを確認してください。
  • コンテナ上でプライベートネットワークを設定する場合はパケットフォワーディング有効にしてください。
  • 設定ファイルを作った後、networkd デーモンが動作している場合はリロードを行なって下さい: # systemctl restart systemd-networkd
  • デーモンが起動したら systemd の networkctl コマンドでネットワークインターフェイスの状態が表示されます。
ノート: 下で説明している設定について
  • $ ip a コマンドの出力を、関連するインターフェイスにだけ絞っています。
  • ホストは起動しているメインの OS であり、コンテナは仮想マシンのゲストのことです。
  • インターフェイスの名前や IP アドレスは全てあくまでただの例です。

基本的な DHCP ネットワーク

以下はホストとコンテナで DHCP IP を有効にします。この場合、両方のシステムが同じインターフェイスを共有し、同じ IP を共有します。

/etc/systemd/network/MyDhcp.network
[Match]
Name=en*

[Network]
DHCP=ipv4

そして、コンテナで systemd-networkd起動・有効化してください。

もちろん en*$ ip link コマンドの出力でわかる Ethernet デバイスのフルネームに置き換えることは可能です。

  • ホストとコンテナで:
$ ip a
2: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.72/24 brd 192.168.1.255 scope global enp7s0
       valid_lft forever preferred_lft forever
    inet6 fe80::16da:e9ff:feb5:7a88/64 scope link 
       valid_lft forever preferred_lft forever

デフォルトのホストネームは DHCP サーバーから取得され一時的なホストネームとして使用されます。

変更するには [DHCPv4] セクションに UseHostname=false を追加してください:

/etc/systemd/network/MyDhcp.network
[DHCPv4]
UseHostname=false

/etc/resolv.conf で DNS を設定するかわりに DHCP に設定してもらいたい場合、systemd-resolved を有効にして /run/systemd/resolve/resolv.conf から /etc/resolv.conf にシンボリックリンクを作成してください:

# systemctl enable systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

詳しくは systemd-resolved.service(8) を参照。

2つの別々な IP で DHCP を使う

ブリッジインターフェイス

仮想ブリッジインターフェイスを作成する:

/etc/systemd/network/MyBridge.netdev
[NetDev]
Name=br0
Kind=bridge
  • ホストとコンテナで:
$ ip a
3: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether ae:bd:35:ea:0c:c9 brd ff:ff:ff:ff:ff:ff

インターフェイス br0 が表示されていますが DOWN になっているので注意してください。

イーサネットをブリッジに関連付ける

/etc/systemd/network/MyDhcp.network を編集して DHCP を削除します。ブリッジはどの IP にもバインドされないインターフェイスが必要なので、このデバイスを br0 にバインドするキーを追加してください。名前を適切なものに変更しましょう。

/etc/systemd/network/MyEth.network
[Match]
Name=en*

[Network]
Bridge=br0

ブリッジネットワーク

ブリッジのネットワークプロファイルを作成:

/etc/systemd/network/MyBridge.network
[Match]
Name=br0

[Network]
DHCP=ipv4

コンテナを起動するオプションを追加する

ホストとコンテナに別々の IP を割り当てたいので、ホストからコンテナのネットワークを切断する必要があります。切断するには、コンテナの起動コマンドに --network-bridge=br0 オプションを追加します。

# systemd-nspawn --network-bridge=br0 -bD /path_to/my_container

結果

  • ホスト側
$ ip a
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.87/24 brd 192.168.1.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::16da:e9ff:feb5:7a88/64 scope link 
       valid_lft forever preferred_lft forever
6: vb-MyContainer: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether d2:7c:97:97:37:25 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::d07c:97ff:fe97:3725/64 scope link 
       valid_lft forever preferred_lft forever
  • コンテナ側
$ ip a
2: host0: <BROADCAST,MULTICAST,ALLMULTI,AUTOMEDIA,NOTRAILERS,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 5e:96:85:83:a8:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.73/24 brd 192.168.1.255 scope global host0
       valid_lft forever preferred_lft forever
    inet6 fe80::5c96:85ff:fe83:a85d/64 scope link 
       valid_lft forever preferred_lft forever

注意

  • ホストの br0 と、コンテナの host0 にそれぞれ IP アドレスが割り当てられました。
  • 2つの新しいインターフェイスが作成されます: ホストの vb-MyContainer とコンテナの host0 です。これは --network-bridge=br0 オプションによるものです。このオプションには --network-veth という別のオプションも含まれており、ホストとコンテナの間に仮想イーサネットリンクが作成されます。
  • host0 の DHCP アドレスはシステムの /usr/lib/systemd/network/80-container-host0.network ファイルから由来します。
  • ホスト側
$ brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.14dae9b57a88	no		enp7s0
							vb-MyContainer

上記のコマンドの出力で2つのインターフェイスがバインドされたブリッジが確認できます。

  • ホスト側
$ ip route
default via 192.168.1.254 dev br0 
192.168.1.0/24 dev br0  proto kernel  scope link  src 192.168.1.87
  • コンテナ側
$ ip route
default via 192.168.1.254 dev host0 
192.168.1.0/24 dev host0  proto kernel  scope link  src 192.168.1.73

上記のコマンドの出力で IP アドレスとゲートウェイが 192.168.1.254 の br0host0 インターフェイスが有効になったのが確認できます。ゲートウェイのアドレスは systemd-networkd によって自動的に取得されます。

$ cat /run/systemd/resolve/resolv.conf
nameserver 192.168.1.254

固定 IP ネットワーク

ウェブサービス (例: FTP, http, SSH) を動かしている場合、デバイスごとに固定 IP を設定するのが役に立つかもしれません。システムの /usr/lib/systemd/network/99-default.link ファイルに MACAddressPolicy=persistent オプションがあれば (デフォルトの設定)、各デバイスは再起動しても同じ MAC アドレスを維持します。つまり、ゲートウェイのサービスを簡単に適切なデバイスに設定することができます。 まず、システムの /usr/lib/systemd/network/80-container-host0.network ファイルを除去します。永続的にするために (例: アップグレードしても変わらないように)、コンテナで以下の設定を行なって下さい。これによって /etc/systemd/network の同じ名前のファイルが /usr/lib/systemd/network のファイルよりも優先されるため /usr/lib/systemd/network/80-container-host0.network ファイルがマスクされます。

# ln -sf /dev/null /etc/systemd/network/80-container-host0.network

次に、コンテナで systemd-networkd有効化・起動してください。

必要な設定ファイル:

  • ホスト側
/etc/systemd/network/MyBridge.netdev
/etc/systemd/network/MyEth.network

MyBridge.network の修正

/etc/systemd/network/MyBridge.network
[Match]
Name=br0

[Network]
DNS=192.168.1.254
Address=192.168.1.87/24
Gateway=192.168.1.254
  • コンテナ側
/etc/systemd/network/MyVeth.network
[Match]
Name=host0

[Network]
DNS=192.168.1.254
Address=192.168.1.94/24
Gateway=192.168.1.254

Et voila!

参照