インターフェースがダウンしているときに、`ip` と `ifconfig` の動作が異なるのはなぜですか?

インターフェースがダウンしているときに、`ip` と `ifconfig` の動作が異なるのはなぜですか?

まずインターフェースをシャットダウンします

# Shutdown the interfaces
ip link set enp2s0f0 down
ip link set enp2s0f1 down

使用方法ifconfig:

# Set subnets to interfaces
ifconfig enp2s0f0 10.0.0.1/24
ifconfig enp2s0f1 10.0.1.1/24

# Add two routes
ip route add 10.11.1.1 dev enp2s0f0
ip route add 10.11.0.1 dev enp2s0f1

# Result => NO PROBLEM, my routes are here even tho the interfaces are down
$ip route
10.0.0.0/24 dev enp2s0f0 proto kernel scope link src 10.0.0.1 
10.0.1.0/24 dev enp2s0f1 proto kernel scope link src 10.0.1.1 
10.11.0.1 dev enp2s0f1 scope link 
10.11.1.1 dev enp2s0f0 scope link 

使用方法ip:

# Set subnets to interfaces
ip addr add 10.0.0.1/24 dev enp2s0f0
ip addr add 10.0.1.1/24 dev enp2s0f1

$ip route
#NOTHING => Where are the routes?!

# Add two routes
ip route add 10.11.1.1 dev enp2s0f0
ip route add 10.11.0.1 dev enp2s0f1

$ip route
#NOTHING => Where are my routes?!

ip link set enp2s0f0 up
ip link set enp2s0f1 up

# Result => WOW only two routes appeared miraculously
$ip route
10.0.0.0/24 dev enp2s0f0 proto kernel scope link src 10.0.0.1 
10.0.1.0/24 dev enp2s0f1 proto kernel scope link src 10.0.1.1 
# => Where are my 10.11.*.* routes?
  1. ip routeルートが表示されないのはなぜですか?
  2. インターフェイスを起動した後、ルートはどこに追加されましたか? 以前は表示されなかったのはなぜですか?
  3. インターフェースを起動した後、ルートが表示されないのはなぜですか?

インターフェイスを立ち上げる前に、すべてのルートを設定したいのですが、ifconfigそうすることに何の問題もありません。次にどんな驚きが起こるのか楽しみです。

ifconfig互換性があると思っていましたがip、ifconfig から ip への移行はそれほど簡単ではありません。

答え1

あなたの 3 つの質問はすべて、1 つの誤解から生じています。

ifconfigインターフェースとアドレスはupオプションを意味しますつまり、あなたのifconfig例では、アドレスを指定すると同時にインターフェースが起動します。

これはつまり

ifconfig enp2s0f0 10.0.0.1/24
ifconfig enp2s0f1 10.0.1.1/24

実際には

ifconfig enp2s0f0 10.0.0.1/24 up
ifconfig enp2s0f1 10.0.1.1/24 up

ipからiproute2以下の行為をより明確に整理します。

  • 持参するインターフェース上げたり下げたり(ip link)、
  • IPの割り当て住所ネットワークデバイス(ip address)に接続し、
  • カーネルの設定ルーティング表(ip route)。

ifconfigこれらの異なる概念が混在しているため、混乱を招きやすく、直感性が低下する可能性があります。


ルート、ネットワーク デバイス、インターフェイス、およびトンネルの状態を便利に管理したい場合は、ネットワーク構成管理ツールの使用を検討してください。 便利な宣言型構文でネットワークを定義でき、1 つのコマンドでネットワークをすばやく起動または停止できます。

一般的な Linux ディストリビューションに含まれているツールの一部を以下に示します。

  • デビアン –アップダウン/etc/network/interfaces/etc/network/interfaces.d/
  • ウブントゥ –ネットプラン/etc/netplan/
  • Red Hat Enterprise Linux / CentOS –cfg の場合/etc/sysconfig/network-scripts/
  • 通常はデスクトップ環境を備えたディストリビューションです –ネットワーク管理者/etc/NetworkManager/

完全を期すために、質問に対する回答を以下に示します。

  1. ip routeルートが表示されないのはなぜですか?

対応するリンクがダウンしている場合、ルートはメイン テーブルに保存されません。ipコマンド シーケンスでは、関連するインターフェイスが最初に起動されません。

  1. インターフェイスを起動した後、ルートはどこに追加されましたか? 以前は表示されなかったのはなぜですか?

インターフェースがダウンしている場合、デバイスのルートはルーティング テーブルに登録されません。

  1. インターフェースを起動した後、ルートが表示されないのはなぜですか?

対応するインターフェイスが最初に起動する必要があったため、ルートは追加されませんでした。ダウンしているインターフェイスでルートの追加を試行した場合RTNETLINK answers: Network is down、またはのようなエラー メッセージが表示されるはずError: Device for nexthop is not up.です。戻りコード ( $?) もゼロ以外である必要があります。

インターフェースを起動する前に、すべてのルートを設定したいと思います。

私の知る限り、 を使ってもこれは実行できません。コマンドは実際にはルートを追加する前にインターフェースを起動しているifconfigことに注意してください。ifconfig

次はどんなサプライズが待っているのでしょうか。

願わくば、誰もいないでしょう。 ip関心の分離は、それを知る

私は相性が良いifconfigと思ったip

2 つのコマンドには重複する部分がありますが、互換性はありません。

関連情報