CLOVER🍀

That was when it all began.

Ubuntu Linux 20.04 LTSで、ネットワークデバイスに一時的にIPアドレスを追加する

これは、なにをしたくて書いたもの?

Linuxで、一時的にでもIPアドレスを追加できたりしないのかな?と思って調べてみたら、ipコマンドでできそうだったので
試してみました。

環境

今回の環境は、こちらです。Ubuntu Linux 20.04 LTS。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal


$ uname -srvmpio
Linux 5.4.0-81-generic #91-Ubuntu SMP Thu Jul 15 19:09:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

ip addr add/del

こちらのドキュメントの「Temporary IP Address Assignment」に、そのものの記載があります。

Network - Configuration | Ubuntu

ip addr addでIPアドレスとサブネットマスクを指定することで、一時的な(再起動すると失われる)IPアドレスを付与します。

まずは、現在のネットワークデバイスの情報を見てみます。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:81:dd:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.121.198/24 brd 192.168.121.255 scope global dynamic eth0
       valid_lft 3232sec preferred_lft 3232sec
    inet6 fe80::5054:ff:fe81:dd5d/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:22:9a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe22:9a46/64 scope link 
       valid_lft forever preferred_lft forever

ドキュメントの例に習って、10.102.66.200/24をeth1デバイスに追加してみましょう。

現在のホストから到達できないことを確認しておきます。

$ ping 10.102.66.200
PING 10.102.66.200 (10.102.66.200) 56(84) バイトのデータ
^C
--- 10.102.66.200 ping 統計 ---
送信パケット数 43, 受信パケット数 0, パケット損失 100%, 時間 43001ミリ秒

root権限で、ip addr add [IPアドレス/サブネットマスク] dev [ネットワークデバイス名]で、指定した
ネットワークアドレスにIPアドレスを追加します。

$ sudo ip addr add 10.102.66.200/24 dev eth1

確認。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:81:dd:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.121.198/24 brd 192.168.121.255 scope global dynamic eth0
       valid_lft 2923sec preferred_lft 2923sec
    inet6 fe80::5054:ff:fe81:dd5d/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:22:9a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet 10.102.66.200/24 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe22:9a46/64 scope link 
       valid_lft forever preferred_lft forever

ネットワークデバイスを指定して見てみましょう。指定したIPアドレスが追加されています。

$ ip addr show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:22:9a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet 10.102.66.200/24 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe22:9a46/64 scope link 
       valid_lft forever preferred_lft forever

今度はpingも通るようになります。

$ ping 10.102.66.200
PING 10.102.66.200 (10.102.66.200) 56(84) バイトのデータ
64 バイト応答 送信元 10.102.66.200: icmp_seq=1 ttl=64 時間=0.071ミリ秒
64 バイト応答 送信元 10.102.66.200: icmp_seq=2 ttl=64 時間=0.070ミリ秒
64 バイト応答 送信元 10.102.66.200: icmp_seq=3 ttl=64 時間=0.074ミリ秒
64 バイト応答 送信元 10.102.66.200: icmp_seq=4 ttl=64 時間=0.076ミリ秒
64 バイト応答 送信元 10.102.66.200: icmp_seq=5 ttl=64 時間=0.074ミリ秒
64 バイト応答 送信元 10.102.66.200: icmp_seq=6 ttl=64 時間=0.056ミリ秒
64 バイト応答 送信元 10.102.66.200: icmp_seq=7 ttl=64 時間=0.039ミリ秒

OSを再起動してみましょう。

$ sudo reboot

すると、追加したIPアドレスがなくなりました。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:81:dd:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.121.198/24 brd 192.168.121.255 scope global dynamic eth0
       valid_lft 3531sec preferred_lft 3531sec
    inet6 fe80::5054:ff:fe81:dd5d/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:22:9a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe22:9a46/64 scope link 
       valid_lft forever preferred_lft forever

また、ネットワークデバイスを停止・起動しても、追加したIPアドレスはやはり失われます。

IPアドレスを追加した状態。

$ ip addr show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:22:9a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet 10.102.66.200/24 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe22:9a46/64 scope link 
       valid_lft forever preferred_lft forever

IPアドレスを追加したネットワークデバイスを停止。

$ sudo ip link set dev eth1 down

確認。

$ ip addr show dev eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 52:54:00:22:9a:46 brd ff:ff:ff:ff:ff:ff

停止したネットワークデバイスを起動。

$ sudo ip link set dev eth1 up

確認。

$ ip addr show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:22:9a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe22:9a46/64 scope link 
       valid_lft forever preferred_lft forever

やっぱり、追加したIPアドレスがなくなりましたね。

最後にmanをヘルプを見てみましょう。

ip addrコマンドのmanは、man ip-addressで見れます。

$ man ip-address

IPアドレスを追加するコマンドですね。

   ip address add - add new protocol address.

ヘルプはこちらで。

$ ip addr help
Usage: ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ]
                                                      [ CONFFLAG-LIST ]
       ip address del IFADDR dev IFNAME [mngtmpaddr]
       ip address {save|flush} [ dev IFNAME ] [ scope SCOPE-ID ]
                            [ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up]
       ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ]
                         [ type TYPE ] [ to PREFIX ] [ FLAG-LIST ]
                         [ label LABEL ] [up] [ vrf NAME ] ]
       ip address {showdump|restore}
IFADDR := PREFIX | ADDR peer PREFIX
          [ broadcast ADDR ] [ anycast ADDR ]
          [ label IFNAME ] [ scope SCOPE-ID ] [ metric METRIC ]
SCOPE-ID := [ host | link | global | NUMBER ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG  := [ permanent | dynamic | secondary | primary |
           [-]tentative | [-]deprecated | [-]dadfailed | temporary |
           CONFFLAG-LIST ]
CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG
CONFFLAG  := [ home | nodad | mngtmpaddr | noprefixroute | autojoin ]
LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]
LFT := forever | SECONDS
TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |
          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |
          gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti |
          nlmon | can | bond_slave | ipvlan | geneve | bridge_slave |
          hsr | macsec | netdevsim }