web-dev-qa-db-ja.com

dhcpによって構成された複数のインターフェースを使用してDebianStretchにデフォルトルートを設定する

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

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

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)

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

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 ==

Steven Ivesonによるこの記事 ネットワークデバイスがsystemd-udevdによってどのように起動されるか、およびインターフェイス構成を変更する方法についての優れた洞察を提供します。

テストしてさらに読むことで、問題を言い換えることもできます。複数のインターフェイスがランダムな順序で表示されます。それぞれが正しいdhcp構成を取得します。最初に起動するインターフェイスがデフォルトルートを設定するため、10.33.34.1が常にデフォルトルートとして使用されるとは限りません。

3
DoRe

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

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

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

これは、ens3のデフォルトルートでroutersオプションのみを受け入れます。タイミングに問題はなく、使用するsystemdファイルを特定することに問題はありません。ルートは、ens3が起動し、DHCPオファーを受信した場合にのみ有効になります。

2
dirkt

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を拡張して、デフォルトルートを受け入れることができないすべてのインターフェイスを一覧表示できます。

0
DoRe