👥

ipコマンドでインターフェイスをまとめてリンクダウン

2022/06/13に公開

はじめに

ipコマンドはインターフェイスをリンクアップさせたり、リンクダウンさせたりできます。

ip link set eth0 up
ip link set ens162 down

1つのホストにインターフェイスが複数ある時とか、network namespaceによってインターフェイス名がちょっとずつ違うときにインターフェイス名を一個ずつ指定してコマンドを打つの面倒じゃないですか?

あとは仮想的にノード障害を起こしたいときに管理用NICを除いてリンクダウンさせたいとか思ったことないですか?

インターフェイスのグループ番号

ip linkコマンドはグループ名、またはグループ番号でインターフェイスを複数指定することが可能です。

例えば以下のようにインターフェイスが5個(lo 1個とveth 4個)あるときを考えます。

# ip netns exec nihombashi ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: g12@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 06:ab:73:17:29:3c brd ff:ff:ff:ff:ff:ff link-netns mitsukoshimae
3: g10@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether ca:d9:7e:89:e8:b4 brd ff:ff:ff:ff:ff:ff link-netns kyobashi
4: t9@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 5a:4b:a3:17:26:87 brd ff:ff:ff:ff:ff:ff link-netns otemachi
5: t11@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 86:f5:6b:ce:f8:12 brd ff:ff:ff:ff:ff:ff link-netns kayabacho

すべてのインターフェイスをダウンさせるには次のコマンドを打ちます。めんどくさいですよね。

# ip netns exec nihombashi ip link set lo down
# ip netns exec nihombashi ip link set g12 down
# ip netns exec nihombashi ip link set g10 down
# ip netns exec nihombashi ip link set t9 down
# ip netns exec nihombashi ip link set t11 down

先ほどのip link showの結果をよく見ると「group default」という文字列が入っています。
デバイス名の代わりに「group ○○」とすることでインターフェイスをまとめて指定できます。
特にグループ名を付けていないインターフェイスは「default」という名前のグループ(グループ番号は0)に所属しています。
以下のコマンド1行だけで5つのインターフェイスをまとめてリンクダウンさせることができます。

# ip netns exec nihombashi ip link set group default down

グループ名「default」の代わりにグループ番号「0」を指定しても同じです。

# ip netns exec nihombashi ip link set group 0 down

グループ名とグループ番号のマッピングは/etc/iproute2/groupファイルにあります。

/etc/iproute2/group
# device group names
0       default

グループ番号付与

例えば、g12というインターフェイスが管理用(自分がこのインターフェイス経由でSSHしている)だとすると、以下のように、それ以外のインターフェイスをグループ100に入れてあげて、

# ip netns exec nihombashi ip link set dev g10 group 100
# ip netns exec nihombashi ip link set dev t9 group 100
# ip netns exec nihombashi ip link set dev t11 group 100

以下のようにgroup 100を指定してリンクダウンさせると管理用NIC以外をまとめて落とすことができます。

# ip netns exec nihombashi ip link set group 100 down

結果はこんな感じ。

# ip netns exec nihombashi ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: g12@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 06:ab:73:17:29:3c brd ff:ff:ff:ff:ff:ff link-netns mitsukoshimae
3: g10@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group 100 qlen 1000
    link/ether ca:d9:7e:89:e8:b4 brd ff:ff:ff:ff:ff:ff link-netns kyobashi
4: t9@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group 100 qlen 1000
    link/ether 5a:4b:a3:17:26:87 brd ff:ff:ff:ff:ff:ff link-netns otemachi
5: t11@if4: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group 100 qlen 1000
    link/ether 86:f5:6b:ce:f8:12 brd ff:ff:ff:ff:ff:ff link-netns kayabacho

ちょっと話が脱線しますが、リンク状態だけを見たいならipコマンドの引数に-brをつけることで出力が簡潔(brief)になります。

# ip netns exec nihombashi ip -br link show
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
g12@if3          UP             06:ab:73:17:29:3c <BROADCAST,MULTICAST,UP,LOWER_UP>
g10@if2          DOWN           ca:d9:7e:89:e8:b4 <BROADCAST,MULTICAST>
t9@if5           DOWN           5a:4b:a3:17:26:87 <BROADCAST,MULTICAST,UP,LOWER_UP>
t11@if4          DOWN           86:f5:6b:ce:f8:12 <BROADCAST,MULTICAST,UP,LOWER_UP>

グループ100に対応するグループ名を決めてあげて、/etc/iproute2/groupファイルにグループ名と番号のマッピングを書いてあげてもいいのですが、今回のように使うだけなら番号だけで十分かと思います。

消し方

「ip link set dev ~ group ~」コマンドで付けた番号は再起動するとdefault(0)に戻ります。

再起動せずに戻すには「ip link set dev ~ group 0」でOKです。

Discussion