systemd-networkd

提供: ArchWiki
2024年5月1日 (水) 18:54時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎link ファイル: 削除)
ナビゲーションに移動 検索に移動

関連記事

systemd-networkd はネットワーク設定を管理するシステムデーモンです。ネットワークデバイスが立ち上がるとそれを検出して設定を行います。また、仮想ネットワークデバイスを作成することもできます。このサービスは systemd-nspawn で管理されるコンテナまたは仮想マシンの複雑なネットワークを設定する場合にとても役に立ちます。また、単純な接続でも正常に動作します。

基本的な使い方

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

必要なサービスと設定

systemd-networkd を使用するには、systemd-networkd.service 起動/有効化します。

ノート: ネットワークを設定したい他のサービスが起動していないことを確認する必要があります。実際、複数のネットワークサービスが競合してしまいます。現在動作しているサービスの一覧は systemctl --type=service で確認でき、それらを 停止 して下さい。

また、ネットワーク名前解決サービスである systemd-resolved は,以下の点を考慮して任意に設定して下さい。

  • 使用する DNS を適切に設定するためには、resolv.confsystemd-resolved の相互作用を理解することが重要です。 systemd-resolved にいくつかの解説があります。
  • DNS エントリーが .network ファイルで指定されている場合は systemd-resolved が必要です。
  • systemd-resolved は、DHCP サーバーまたは IPv6 ルーターから DNS アドレスを取得する場合にも必要です。

(DHCP= および IPv6AcceptRA= セクションの [Network] および UseDNS=yes (デフォルト) 、[DHCPv4][DHCPv6][IPv6AcceptRA]systemd.network(5) を参照してください。) を設定します。

  • systemd-networkd 無しでも systemd-resolved を使うことができることに注意してください。

system-networkd-wait-online

systemd-networkd.service を有効にすると、 systemd-networkd-wait-online.service も有効になります。これは、ネットワークが構成されるのを待つワンショット・システム・サービスです。後者は WantedBy=network-online.target を持っているので、 network-online.target 自身が有効になっているか、他のユニットに引き寄せられた時にのみ起動します。 Systemd#ネットワークが稼働した後にサービスを実行するも参照してください。

デフォルトでは、 systemd-networkd-wait-online.service は、認識され systemd-networkd によって管理されているすべてのリンクが完全に設定されるか、または失敗しても、少なくとも1つのリンクがオンラインになるまで待機します。

システムに複数のネットワークインタフェースがあるが、常時接続されているとは想定されていないものもある場合 (例えば、 dual-port Ethernet を使用しているが、ケーブルが1本しか接続されていない場合)、 system-networkd-wait-online.service の起動は、デフォルトのタイムアウトである2分後に失敗します。これにより、起動プロセスに不要な遅延が発生する可能性があります。すべての インターフェイスではなく 任意の インターフェイスがオンラインになるまで待機する動作に変更するには、サービスを編集し、--any パラメータを ExecStart 行に追加します。

/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf
[Service]
ExecStart=
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --any

無視されたインターフェイスや動作状態など、その他の動作も設定できます。使用可能なパラメータについては、 systemd-networkd-wait-online(8) を参照してください。

設定ファイルの例

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

systemd/udev は、予測可能で安定したネットワークインターフェイス名をすべてのローカルイーサネット、WLAN、WWAN インターフェイスに自動で割り当てます。システム上にあるデバイスのリストを得るには networkctl list を使用してください。

設定ファイルに変更を加えたら、systemd-networkd.service再起動してください。

ノート:
  • 設定ファイル内で指定するオプションは大文字と小文字が区別されます。
  • 以下の例では、enp1s0 が有線アダプタ、wlp2s0 が無線アダプタです。環境によって名前は変わります。ネットワーク設定#ネットワークインターフェイス を見てください。
  • Name=en*Name=wl* のようにワイルドカードを使うこともできます。
  • デバイスはタイプによってもマッチさせることが可能です。例: イーサネットは Type=ether、Wi-Fi は Type=wlan、WWAN は Type=wwan。注意点として、Type=ether は仮想イーサネットインターフェイス(veth*)にもマッチします(この動作は望ましくない場合があるでしょう)。
  • IPv6 を無効化したい場合、IPv6#systemd-networkd_3 を見てください。

有線アダプタで DHCP を使用

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

[Network]
DHCP=yes

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

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

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1

Address= は1回以上使用することができ、複数の IPv4 や IPv6 アドレスを指定することができます。さらなるオプションについては #network ファイルsystemd.network(5) を見てください。

無線アダプタ

systemd-networkd で無線ネットワークに接続するには、wpa_supplicantiwd などの別のアプリケーションで設定された無線アダプタが必要です。

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

[Network]
DHCP=yes
IgnoreCarrierLoss=3s

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

ヒント: IgnoreCarrierLoss=3s により、同じワイヤレスネットワーク(SSID)内でワイヤレスインターフェイスが他のアクセスポイントにローミングする間、systemd-networkd が短期間(この例では 3 秒間)にインターフェイスを再設定(例: DHCP リースの開放と再取得)しないことを保証します。これにより、ローミング時にダウンタイムが短縮されます。

無線スネットワークへの認証には、wpa_supplicantiwd などを使用します。

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

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

システム上の無線・有線どちらのデバイスも有効な接続がある場合、カーネルのルーティングのメトリック(ip で設定するのと同一) が、パケットを送るのにどちらのルートを使用するか決定します。システム上の有線デバイスと無線デバイスの両方がアクティブな接続を行っている場合がそうです。均衡状態を破るために、カーネルはメトリックを使います。もし一方の接続が終了しても、何も設定せずとも、もう一方が自動的にギャップを埋めます(進行中の転送はまだうまく対処されないでしょうが、これは他の OSI レイヤーでの問題です)。

systemd-networkdインターフェイスごとのデフォルトルートメトリクスを設定しないので、手動で設定する必要があります:

ノート: Metric オプションはスタティックルーティングの設定を行います。RouteMetric オプションはスタティックルーティングの設定をしないセットアップ用です。詳細については systemd.network(5) を参照して下さい
/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
DHCP=yes

[DHCPv4]
RouteMetric=100

[IPv6AcceptRA]
RouteMetric=100
/etc/systemd/network/25-wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=yes

[DHCPv4]
RouteMetric=600

[IPv6AcceptRA]
RouteMetric=600

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

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] セクションはどんな場合でもそのセクションを適用することを示します (いわば * ワイルドカードのようなものです)。
  • 全ての設定ファイルは辞書順でまとめてソートされ処理されます。ファイルがどのディレクトリにあるかは関係ありません。
  • 同じ名前のファイルは互いを置き換えます。
ヒント:
  • /etc/systemd/network/ 内のファイルは /usr/lib/systemd/network/ 内の対応する、システムによって提供されたファイルを上書きします。また、/dev/null へのシンボリックリンクを作成することで、システムファイルを"マスク"できます。
  • systemd は true 真偽値として値 1trueyeson を受け付け、false 真偽値として値 0falsenooff を受け付けます。systemd.syntax(7) を見てください。

network ファイル

このセクションは削除するべきか検討が行われています。
Reason: Duplicates the systemd.network(5) man page. (議論: トーク:Systemd-networkd#)

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

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

[Match]

パラメータ 説明 受け入れる値 デフォルト値
Name= デバイス名のリストにマッチ(例: en*)。プレフィックス ! を付けると、リストを反転できます。 空白で区切られた、グロブ付きデバイス名リスト。論理否定 (!)
MACAddress= MAC アドレスのリストにマッチ(例: MACAddress=01:23:45:67:89:ab 00-11-22-33-44-55 AABB.CCDD.EEFF) コロン、ハイフン、またはドットで区切られた完全な 16 進数による、空白で区切られた MAC アドレスリスト
Host= ホスト名、またはホストのマシン IDにマッチ。 グロブ付きのホスト名文字列、machine-id(5)
Virtualization= システムが仮想化環境で起動されているかどうかをチェックします。Virtualization=false キーはホストマシンにのみマッチし、逆に Virtualization=true はコンテナや VM にマッチします。特定の仮想化タイプや実装をチェックしたり、(private-users を使って)ユーザ名前空間をチェックしたりできます。 真偽値、論理否定(!)、タイプ(vm, container)、実装(systemd-detect-virt(1) を参照)、private-users

[Link]

パラメータ 説明 受け入れる値 デフォルト値
MACAddress= ハードウェアアドレスをデバイスに割り当てる。MAC アドレスの偽装に便利。 コロン、ハイフン、ドットで区切られた、完全な 16 進数 MAC アドレス。
MTUBytes= デバイスに対して最大転送単位をバイト単位で指定。IPv6 がインターフェイスで有効化されていて、MTU が 1280 (IPv6 における最低 MTU) 未満に指定されている場合、自動的に 1280 まで増やされます。より大きな MTU 値を設定することで(例: ジャンボフレーム 使用時)、ネットワーク転送速度を飛躍的に速くできます。 整数 (通常の接尾辞 K、M、G がサポートされており、1024 の倍数として認識されます)
Multicast= マルチキャスト の使用を許可。 真偽値 ? ドキュメント化されておらず ?

[Network]

パラメータ 説明 受け入れる値 デフォルト値
DHCP= DHCPv4 と DHCPv6 の一方/両方のサポートを制御。 真偽値、ipv4ipv6 false
DHCPServer= 有効化されている場合、DHCPv4 サーバが起動されます。 真偽値 false
MulticastDNS= マルチキャスト DNS のサポートを有効化。resolve に設定すると、名前解決のみが有効化され、ホストやサービスの登録と広告は行われません。 真偽値、resolve false
DNSSEC= リンク上での DNSSEC DNS validation のサポートを制御。allow-downgrade に設定すると、DNSSEC 非対応のネットワークとの互換性が向上します。この場合、DNSSEC は自動でオフになります。 真偽値、allow-downgrade false
DNS= 固定 DNS アドレスを設定。1回以上指定できます。 inet_pton(3)
Domains= リンク上の DNS サーバを利用して解決すべきドメインのリスト。詳細 ドメイン名、オプションでチルダ(~)のプレフィックス。
IPForward= 有効化すると、ネットワークインターフェイス上で受信したパケットを、ルーティングテーブルに従って他のインターフェイスに転送します。詳細は インターネット共有#パケット転送の有効化 真偽値、ipv4ipv6 false
IPMasquerade= 有効化すると、ネットワークインターフェイスからのパケット転送がローカルホストから来るように見えます。値によっては、IPForward=ipv4IPForward=ipv6、または IPForward=yes の意味になります。 ipv4ipv6bothno no
IPv6PrivacyExtensions= 時間と共に変化するステートレステンポラリアドレスの使用を設定します(RFC 4941 を参照)。prefer-public を指定すると、プライバシー拡張が有効に名ありますが、テンポラリアドレスよりもパブリックアドレスを優先します。kernel を指定すると、カーネルのデフォルトの設定のままになります。 真偽値、prefer-publickernel false

[Address]

パラメータ 説明 受け入れる値 デフォルト値
Address= 複数のアドレスを設定するには、このキーを複数回指定してください。DHCP を使用しない限り必須です。指定されたアドレスが(IPv4の 場合) 0.0.0.0 または (IPv6 の場合) :: である場合、要求されたサイズの新しいアドレス範囲が、システム全体の未使用範囲のプールから自動的に割り当てられます。 固定 IPv4 または IPv6 アドレスとプレフィックス長(inet_pton(3) を参照)

[Route]

  • Gateway= DHCP を使用しない場合、このオプションは必須です。
  • Destination= ルートの宛先プリフィックスです。スラッシュとプリフィックス長を後ろに付けることができます。

[Route] セクションに Destination が存在しない場合、デフォルトルートとして扱われます。

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

[DHCPv4]

パラメータ 説明 受け入れる値 デフォルト値
UseDNS= DHCP サーバにより広告された DNS サーバを使用するかどうかを制御。 真偽値 true
Anonymize= true を指定すると、DHCP サーバに送られるオプションが RFC:7844 (Anonymity Profiles for DHCP Clients) に従って、識別情報の開示を最小限にするようになります。 真偽値 false
UseDomains= DHCP サーバから受け取るドメイン名を DNS 検索ドメインとして使用するかどうかを制御。route に設定すると、DHCP サーバから受け取るドメイン名が DNS クエリにのみ使用され、検索には使用されなくなります。このオプションは、systemd-resolved を使用している際にはローカルな名前解決を修正する可能性があります。 真偽値、route false

[DHCPServer]

これは、無線ホットスポットを作成するために hostapd とうまく連動する DHCP サーバーの設定例です。IPMasqueradeNATを有効にする ためのファイアウォールルールを追加し、IPForward=ipv4 パケット転送 を有効にしています。

この記事またはセクションの正確性には問題があります。
理由: IPMasquerade=truefilter テーブルのルールを追加しません、それらは手動で追加する必要があります。systemd-nspawn#仮想イーサネットリンクを使用する を参照してください (議論: トーク:Systemd-networkd#)

/etc/systemd/network/wlan0.network
[Match]
Name=wlan0

[Network]
Address=10.1.1.1/24
DHCPServer=true
IPMasquerade=ipv4

[DHCPServer]
PoolOffset=100
PoolSize=20
EmitDNS=yes
DNS=9.9.9.9

netdev ファイル

このセクションは削除するべきか検討が行われています。
Reason: Duplicates the systemd.netdev(5) man page. (議論: トーク:Systemd-networkd#)

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

[Match] セクション

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

[NetDev] セクション

  • Name= インターフェイス名。必須
  • Kind= 例: bridge, bond, vlan, veth, sit必須

コンテナでの使用方法

systemd-networkd は、コンテナ内とホストシステムの両方で使用されている場合、systemd-nspawn コンテナに対するネットワークの完全自動設定を提供できます。総合的な外観は systemd-nspawn#ネットワーキング を見てください。

下で説明している設定について、

  • $ ip a コマンドの出力を、関連するインターフェイスにだけ絞っています。
  • ホストは起動しているメインの OS であり、コンテナは仮想マシンのゲストのことです。
  • インターフェイスの名前や IP アドレスは全てあくまでただの例です。

DHCP を用いたネットワークブリッジ

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

まず、仮想ブリッジインターフェイスを作成してください。systemd に、イーサネットブリッジとして機能する、br0 という名前のデバイスを作成するように指示します。

/etc/systemd/network/mybridge.netdev
[NetDev]
Name=br0
Kind=bridge
ヒント: systemd-networkd は、インターフェイス名とマシン ID に基づいて生成された MAC アドレスをブリッジに割り当てます。これにより接続の問題が発生する場合があります。例えば、MAC フィルタリングに基づいたルーティングです。そのような問題を回避するには、MAC アドレス(おそらく物理デバイスと同じもの)をブリッジに割り当ててください。上記の NetDev セクション内に MACAddress=xx:xx:xx:xx:xx:xx という行を追加してください。

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 になっていることに注意してください。

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

次のステップでは、新しく作成したブリッジにネットワークインターフェイスを追加します。以下の例では、en* という名前にマッチする任意のインターフェイスをブリッジ br0 に追加します。

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

[Network]
Bridge=br0

ブリッジが IP と関連付けられていないインターフェイスを必要とするので、イーサネットインターフェイスは DHCP や IP アドレスと関連付けてはいけません: 対応する /etc/systemd/network/MyEth.network を適宜変更して、アドレッシングを削除してください。

ブリッジネットワーク

ブリッジが作成され、既存のネットワークインターフェイスに関連付けられました。ブリッジインターフェイスの IP 設定を指定する必要があります。これは3番目の .network で定義されます。以下の例では DHCP を使用します。

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

[Network]
DHCP=ipv4

コンテナの設定

コンテナを起動する際は --network-bridge=br0 オプションを使用してください。詳細は systemd-nspawn#ネットワークブリッジを使用する を見てください。

結果

  • ホスト側
$ 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 オプションによるものです。詳細は systemd-nspawn#ネットワークブリッジを使用する を参照してください。
  • host0 の DHCP アドレスはシステムの /usr/lib/systemd/network/80-container-host0.network ファイルから由来します。
  • ホスト側
この記事またはセクションは情報が古くなっています。
理由: brctl は非推奨です。bridge link を使用してください。ネットワークブリッジ#iproute2 を使う を参照。 (Discuss)
$ 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 アドレスを持つネットワークブリッジ

各デバイスに静的 IP アドレスを設定すると、Web サービス (例:FTP、http、SSH) を展開する場合に便利です。システム /usr/lib/systemd/network/99-default.link ファイルに MACAddressPolicy=persistent オプションが指定されている場合(デフォルトで指定されています)、各デバイスは再起動後も同じMACアドレスを保持します。したがって、ゲートウェイ上の任意のサービスを目的のデバイスに簡単にルーティングできます。

このセットアップでは、次の設定を行う必要があります。

  • ホスト側

この設定は、#DHCP を用いたネットワークブリッジ セクションと非常によく似ています。まず、仮想ブリッジインターフェイスを作成し、メインの物理インターフェイスをそのインターフェイスにバインドする必要があります。この作業は、次の2つのファイルを使用して実行できます。これらのファイルの内容は、 DHCP セクションで使用できるものと同じです。

/etc/systemd/network/MyBridge.netdev
/etc/systemd/network/MyEth.network

次に、新しく作成した仮想ブリッジインターフェイスの IP および DNS を設定する必要があります。例:

/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
  • コンテナ側

コンテナに静的 IP アドレスを設定するには、システム /usr/lib/systemd/network/80-container-host0.network ファイルを上書きする必要があります。このファイルは、コンテナの host0 ネットワークインタフェースに DHCP 構成を提供します。これを行うには、設定を /etc/systemd/network/80-container-host0.network に置きます。例:

/etc/systemd/network/80-container-host0.network
[Match]
Name=host0

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

コンテナで systemd-networkd.service有効化されていることを確認してください。

MACVLAN bridge

For the host to be able to reach containers connected via MACVLAN, the host itself also needs to connect via MACVLAN and not directly to the underlying Ethernet network interface.

On the host, attach the underlying Ethernet network interface to MACVLAN and make sure it does not get assigned IP addresses. For example, using mv-0 as the MACVLAN interface name and with enp1s0 as the host's Ethernet interface:

/etc/systemd/network/30-enp1s0.network
[Match]
Name=enp1s0

[Link]
RequiredForOnline=carrier

[Network]
MACVLAN=mv-0
DHCP=no
IPv6AcceptRA=false
LinkLocalAddressing=no
MulticastDNS=false
LLMNR=false
ヒント:
  • RequiredForOnlineテンプレート:=carrier prevents systemd-networkd-wait-online.service from waiting (and eventually failing) for the connection to acquire an IP address, which will never happen.
  • The underlying network interface does not necessarily need to be a physical Ethernet interface. For example, a MACVLAN bridge can be attached to a bond.

Create the MACVLAN bridge mv-0:

/etc/systemd/network/25-mv-0.netdev
[NetDev]
Name=mv-0
Kind=macvlan

[MACVLAN]
Mode=bridge

Configure the host's network connection on the MACVLAN bridge (mv-0). The following example uses DHCP, replace the options as necessary.

/etc/systemd/network/35-mv-0.network
[Match]
Name=mv-0

[Link]
RequiredForOnline=routable

[Network]
BindCarrier=enp1s0
DHCP=yes

For the container, attach a MACVLAN to the underlying Ethernet network interface (enp1s0 in the examples above). For example, in /etc/systemd/nspawn/container_name.nspawn specify:

[Network]
MACVLAN=enp1s0

For containers started from the command line, pass them the --network-macvlanテンプレート:=enp1s0 option.

In the container, the MACVLAN interface will have the name mv-underlying_interface_name (e.g. mv-enp1s0). Configure the network connection as necessary (just like in the host) by matching the interface name. For example, using DHCP:

/etc/systemd/network/30-mv-enp1s0.network
[Match]
Name=mv-enp1s0

[Link]
RequiredForOnline=routable

[Network]
DHCP=yes

ヒントとテクニック

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

systemd-networkd にはコマンドラインシェルや GUI による適切なインタラクティブ管理インターフェイスがありません。

ただし、ネットワークの現在の状態を表示したり、通知を受信したり、ワイヤレス構成を操作したりするためのツールはあります:

  • networkctl は(CLI を通して)ネットワークインターフェイスの状態の簡単な表示を行います。
  • networkdwpa_supplicant を使うように設定した場合、wpa_cliwpa_gui を使うことで動的に WLAN インターフェイスを関連付けしたり再設定できます。
  • networkd-notify-gitAUR はネットワークインターフェイスの状態の変化にあわせてシンプルな通知を生成します (接続・切断や再関連付けなど)。
  • networkd-dispatcherAUR デーモンを使うことで NetworkManager-dispatcher と同じようにネットワークインターフェイスの状態が変わったときにスクリプトを実行することができます。
  • DNS リゾルバの systemd-resolvedresolvectl status で現在の DNS サーバーの情報を視覚化できます。

SSID (場所) に基づいた静的 IP または DHCP の設定

ホームワイヤレスネットワークが DHCP を使用し、オフィスワイヤレスネットワークが静的 IP を使用する状況がよくあります。この混在したセットアップは、次のように構成できます:

ノート: ファイル名の番号によって,ファイルの処理順序が決まります。 SSID、 BSSID、 またはその両方に基づいて [Match] できます。
/etc/systemd/network/24-wireless-office.network
# special configuration for office WiFi network
[Match]
Name=wlp2s0
SSID=office_ap_name
#BSSID=aa:bb:cc:dd:ee:ff

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1
#DNS=8.8.8.8
/etc/systemd/network/25-wireless-dhcp.network
# use DHCP for any other WiFi network
[Match]
Name=wlp2s0

[Network]
DHCP=ipv4

ワイヤード (有線) インターフェイスとワイヤレスインターフェイスのボンディング

ワイヤレスボンディング も参照してください。

ボンディングを使用すると、複数のインターフェイスを介して接続を共有できるため、有線インターフェイスを取り外しても、ワイヤレス接続は維持され、ネットワーク接続はシームレスに維持されます。

結合インタフェースを作成します。この場合、モードは active-backup です。つまり、プライマリインターフェイスがダウンした場合、パケットはセカンダリインターフェイスを介してルーティングされます。

/etc/systemd/network/30-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=active-backup
PrimaryReselectPolicy=always
MIIMonitorSec=1s

有線インターフェイスをプライマリとして設定します。

/etc/systemd/network/30-ethernet-bond0.network
[Match]
Name=enp0s25

[Network]
Bond=bond0
PrimarySlave=true

ワイヤレスをセカンダリとして設定します。

/etc/systemd/network/30-wifi-bond0.network
[Match]
Name=wlan0

[Network]
Bond=bond0

通常のインターフェイスと同様に、bond インターフェイスを設定します。

/etc/systemd/network/30-bond0.network
[Match]
Name=bond0

[Network]
DHCP=ipv4

有線ネットワークが接続されていない場合は、ワイヤレス接続が維持されます。

$ networkctl
IDX LINK    TYPE     OPERATIONAL      SETUP
  1 lo      loopback carrier          unmanaged
  2 enp0s25 ether    no-carrier       configured
  3 bond0   bond     degraded-carrier configured
  5 wlan0   wlan     enslaved         configured

4 links listed.

TCP スロースタートの速度を上げる

遅延が中程度の広帯域リンク (通常、10 Mbit/s を超えるホームインターネット接続) では、TCP スロースタートアルゴリズムのデフォルト設定はやや保守的です。この問題は、ダウンロードがゆっくりと開始され、接続の全帯域幅に到達するまでに加速するのに数秒かかる場合に発生します。特に pacman アップグレードなどで、ダウンロードされた各パッケージがゆっくりと開始し、接続の最大速度に達する前に終了することがよくあります。

これらの設定を調整して、 TCP 接続が既定よりも大きなウィンドウサイズで開始されるようにすることができます。これにより 新しい TCP 接続ごとに自動的に増加する時間を避けることができます [1] これは通常、損失した多数のパケットを再送信する必要があるため、低速な接続ではパフォーマンスを低下させますが (または値が大きくなりすぎた場合) 、十分な帯域幅を持つ接続ではパフォーマンスを大幅に向上させることができます。

これらの値を変更する前と変更した後にベンチマークを実行して、ネットワーク速度を向上させ、低下させないようにすることが重要です。ダウンロードの開始が遅く、速度が徐々に上がっていない場合は、これらの値を変更する必要はありません。これらの値はすでに接続速度に最適です。ベンチマークを行う際には、低速なサーバへのアクセスをさらに低速にすることを犠牲にして高速なマシンへのアクセスを高速化しないように、高速なリモートサーバと低速なリモートサーバの両方に対してテストするようにしてください。

これらの値を調整するには、接続の .network ファイルを編集します。

/etc/systemd/network/eth0.network
[Match]
Name=eth0

#[Network]
#Gateway=...  <-- Remove this if you have it, and put it in the Gateway= line below

[Route]
# This will apply to the gateway supplied via DHCP.  If you manually specify
# your gateway, put it here instead.
Gateway=_dhcp4

# The defaults for these values is 10.  They are a multiple of the MSS (1460 bytes).
InitialCongestionWindow=10
InitialAdvertisedReceiveWindow=10

デフォルトの 10 は、 10Mbit/s より遅い接続に適しています。100 Mbit/s 接続の場合、値 30 位が適切に機能します。マニュアル・ページ systemd.network(5) § [ROUTE] SECTION OPTIONS には、100 の値は過剰と見なされると記載されています。

sysctl 設定 net.ipv4.tcp_slow_start_after_idle が有効になっている場合、しばらくアイドル状態が続くと (多くの場合、ごく短時間) 、接続はこれらの初期設定に戻ります。この設定を無効にすると、パケット転送中に大きいウィンドウがネゴシエートされた場合、接続は大きいウィンドウを維持します。設定に関係なく、新しい各 TCP 接続は上記の Initial* 設定で始まります。

sysctl 設定 net.ipv4.tcp_congestion_control は、 TCP リンクがアクティブなとき、特に2つのホスト間のパスが輻輳してスループットを低下させる必要があるときに、輻輳ウィンドウと受信ウィンドウを調整する方法を制御するため、これらの値とは直接関係しません。上記の Initial* 値は、輻輳アルゴリズムに引き継がれて必要に応じて調整される前に、新しい接続ごとに選択されたデフォルトのウィンドウ値を設定するだけです。高い初期値を設定すると、輻輳アルゴリズムが最適な値 (または、逆に、間違った初期値を設定するとネゴシエーション時間が長くなりますが、輻輳アルゴリズムはそれらを修正するように動作し、新しく確立された各 TCP 接続の速度が数秒間遅くなります。) を見つけようとしている間に、単純にネゴシエーションが短縮されます。

参照