systemd-networkd

提供: ArchWiki
2016年12月29日 (木) 23:37時点における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 アドレスを取得する場合です。もしくは /etc/resolv.conf を手動で管理することもできます。

resolv.conf の互換性のために、既存のファイルを削除または名前変更して以下のシンボリックリンクを作成してください (systemd-resolved を使用する場合):

# 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/nsswitch.confhosts データベースを切り詰める (例: resolve サービスの後ろの [!UNAVAIL=return] オプションを削除する)。
  • 完全修飾ドメイン名を使うようにする。
  • /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 が無線アダプタです。環境によって名前は変わります。
  • IPv6 を無効化したい場合、ルーターが IPv6 を喧伝しているときは [Network] セクションに IPv6AcceptRA=false を追加する必要があります。

有線アダプタで 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

IP アドレスを複数指定することもできます。Address= 行を追加して IPv6 アドレスを指定してください。DNS サーバーやブロードキャストアドレスを指定するネットワークオプションは systemd.network(5) の man ページを見て下さい。

無線アダプタ

先に触れた通り、systemd-networkd で無線ネットワークに接続するには、wpa_supplicant など別のサービスで無線アダプタを設定してから適当なサービスを有効にしてください。以下の例では、wpa_supplicant@wlp2s0.service としています。以下のサービスは /etc/wpa_supplicant/wpa_supplicant-wlp2s0.conf 設定ファイルを使って wpa_supplicant を起動します。ファイルが存在しなかった場合、サービスは起動しません。

/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

インターフェイスの名前を変更

udev ルールを編集するかわりに .link ファイルを使ってインターフェイスの名前を変更できます。MAC アドレスに基づいて USB-to-Ethernet アダプタに予測可能なインターフェイス名を設定する例 (通常は接続された USB 端子によって名前が変わってしまいます):

/etc/systemd/network/10-ethusb0.link
[Match]
MACAddress=12:34:56:78:90:ab

[Link]
Description=USB to Ethernet Adapter
Name=ethusb0
ノート: ユーザーが作成した .link ファイルが先に有効になるように、デフォルト設定の 99-default.link よりも辞書的に早い順番になるような名前を付けてください。例えば、ethusb0.link という名前を付けたい場合は 10-ethusb0.link としてください。

設定ファイル

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

3つのタイプの設定ファイルが存在します。ファイルのフォーマットは systemd のユニットファイルと似ています。

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

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

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

network ファイル

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

.network ファイルには次のセクションを記述できます: [Match], [Link], [Network], [Address], [Route], [DHCP]。以下ではそれぞれのセクションでよく使われる設定キーを説明します。詳しくは systemd.network(5) を見てください。

[Match]

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

[Link]

  • MACAddress= MAC アドレスを偽装することができます。
  • MTUBytes= 最大転送単位をバイトで指定 (K, M, G を後ろに付けることができ、1024の倍数として認識されます)。MTU の値を大きくすることでネットワークの転送速度を速くすることが可能です (ジャンボフレーム)。

[Network]

  • DHCP= DHCP クライアントを有効にします。
  • DNS= DNS サーバーのアドレス
  • Bridge= ブリッジの名前
  • IPForward= IP パケットの転送を有効にします。
  • Domains= DNS によるホスト名解決に使用するドメインのリスト。

[Address]

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

[Route]

  • Gateway= はマシンのゲートウェイのアドレスです。DHCP を使用しない場合このオプションは必須です。
ヒント: Address= が Address キーだけを含み Gateway= セクションが Gateway キーだけを含む場合、略式表記として [Network] セクションに Address=Gateway= キーを記述することができます。

[DHCP]

  • UseDomains=true systemd-resolved を使用する場合にローカル名の解決を修正します。

netdev ファイル

このファイルは仮想ネットワークデバイスを作成します。.netdev ファイルには次のセクションを記述できます: [Match][NetDev]。以下ではそれぞれのセクションでよく使われる設定キーを説明します。詳しくは systemd.netdev(5) を見てください。

[Match]

  • Host= ホストネーム
  • Virtualization= VM の中で実行されているかどうか確認する。

[NetDev]

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

link ファイル

このファイルはカスタム udev ルールの代わりとなりデバイスが現れた時に udev によって適用されます。2つのセクションを記述します: [Match][Link]。以下ではそれぞれのセクションでよく使われる設定キーを説明しています。詳しくは systemd.link(5) を参照してください。

ヒント: .link ファイルの問題を診断したいときは udevadm test-builtin net_setup_link /sys/path/to/network/device を使ってください。

[Match]

  • MACAddress= MAC アドレス
  • Host= ホストネーム
  • Virtualization=
  • Type= デバイスのタイプ (例: vlan)

[Link]

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

ノート: arch-install-scripts/usr/bin/arch-chroot を使ってシステムパーティションにアクセスする場合、マウントしたパーティションに対して chroot の外からシンボリックリンクを作成する必要があります。arch-chroot はファイルからライブ環境にリンクを作成するためです。

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

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

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

/etc/systemd/network/MyBridge.netdev
[NetDev]
Name=br0
Kind=bridge

systemd-networkd.service を再起動すると systemd はブリッジを作成します。

  • ホストとコンテナで:
$ 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!

管理やデスクトップの統合

systemd-networkd にはコマンドラインや GUI によるインタラクティブな管理インターフェイスがありません。networkctl はネットワークインターフェイスの状態を出力するだけです。

networkdwpa_supplicant を使うように設定した場合、wpa_cliwpa_gui を使うことで動的に WLAN インターフェイスを関連付けしたり再設定できます。

networkd-notify はネットワークインターフェイスの状態の変化にあわせてシンプルな通知を生成します (接続・切断や再関連付けなど)。

参照