DHCP で設定された複数のインターフェースを持つ Debian Stretch でデフォルト ルートを設定する

DHCP で設定された複数のインターフェースを持つ Debian Stretch でデフォルト ルートを設定する

複数のインターフェースを持つ Debian Stretch システムでは、特定のインターフェースを介してデフォルト ルートを定義する必要がありますens3。このインターフェースは、10.33.34.2dhcp を介して IP アドレスを受け取ります。

私は自分のニーズに合わせて次のガイドを調整しました。

5.3. GUIを使用しない最新のネットワーク構成

/etc/systemd/network/route.networkそこで、次の内容のファイルを作成しました。

[Match]
Name=ens3

[Network]
Gateway=10.33.34.1

ただし、起動時にデフォルト ルートが正しく設定されません。

systemd-networkdに従ってデバッグを有効にしましたsystemd-networkd をデバッグするにはどうすればいいですか?

再起動後systemd-networkd、ログに次の内容が表示されます。

Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Setting routes
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Could not set route: Network is unreachable
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Routes set
Aug 21 13:43:13 vpn dhclient[15709]: Listening on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on Socket/fallback
Aug 21 13:43:13 vpn dhclient[15709]: DHCPDISCOVER on ens3 to 255.255.255.255 port 67 interval 8
Aug 21 13:43:13 vpn dhclient[15709]: DHCPREQUEST of 10.33.34.2 on ens3 to 255.255.255.255 port 67
Aug 21 13:43:13 vpn dhclient[15709]: DHCPOFFER of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn dhclient[15709]: DHCPACK of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Adding address: 10.33.34.2/24 (valid forever)

networkd は、IP アドレスが DHCP 経由で割り当てられる前にルートを設定しようとしているようです。

systemd を使用して特定のインターフェースにデフォルトルートを設定するにはどうすればよいでしょうか?

== 編集 ==

systemd-networkdがインターフェースを立ち上げるという想定は間違っていました。システムを再起動すると、

$ sudo service systemd-networkd status
● systemd-networkd.service - Network Service
   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; vendor pres
  Drop-In: /etc/systemd/system/systemd-networkd.service.d
           └─10-debug.conf
   Active: inactive (dead)
     Docs: man:systemd-networkd.service(8)

したがって、/etc/systemd/network/route.network起動時に設定は有効になりません。現在、すべてのネットワーク デバイスを起動する責任があるサービスが何なのか疑問に思っています。

== 編集 2 ==

スティーブン・アイブソンによるこの記事systemd-udevdネットワーク デバイスがどのように起動され、インターフェイス構成がどのように変更されるかについて、優れた洞察を提供します。

テストとさらなる読書によって、私は自分の問題を再述したいと思います。複数のインターフェースがランダムな順序で起動されます。それぞれが正しい DHCP 構成を取得します。起動される最初のインターフェースはデフォルト ルートを設定するため、10.33.34.1常にデフォルト ルートとして使用されるわけではありません。

答え1

もし全てインターフェイスがデフォルト ルートで有効な DHCP オファーを受信する場合、それらを無視するように設定する方法はありません。これは、、、または init システムに接続されたその他のものdhclientでは実行できないことです。systemdudev

その方法の一つは、ここ: の「フック」ディレクトリの1つにシェルスクリプトフラグメントを作成します(もちろん、エディタを使用することもできます)dhclient

cat << EOF > /etc/dhcp/dhclient-enter-hooks.d/restrict-default-route
## Only the DHCP server talking to ens3 is allowed to give us a default
## route.  Other interfaces only get local-segment configuration.
case ${interface} in
  ens3)
    ;;
  *)
    unset new_routers
    ;;
esac
EOF

routersは、 のデフォルト ルートのオプションのみを受け入れますens3。タイミングの問題はなく、どのファイルを使用するかを判断する問題もなくsystemd、ルートはens3が起動して DHCP オファーを受信した場合にのみ有効になります。

答え2

Debian Stretchでは、インターフェースはudevによって命名され、基本的な設定はで行われます/etc/network/interfaces。編集2で述べたように、複数のインターフェースはランダムな順序で起動されます。それぞれが正しいdhcp設定を取得します。最初に起動されるインターフェースがデフォルトルートを設定します。必要なインターフェースのデフォルトルートのみを受け入れる必要があります。これは、フックによって達成されるdhcpclient

新しいフックスクリプトを追加します/etc/dhcp/dhclient-enter-hooks.d/nodefaultroute:

#!/bin/sh
## Prevent DHCP server on eth0 from forcing a default route on us

case ${interface} in
  ens8|ens9)
     printf "executing ip route delete default via $new_routers\n" 
     ip route delete default via $new_routers
  ;;
     *)
  ;;
esac

ens8|ens9デフォルト ルートを受け入れることができないすべてのインターフェイスをリストするように拡張できます。

関連情報