2016-07-18

RHEL7: Virtual interface with NetworkManager

RHEL6 でインターフェイスに複数 IP アドレスを割り当てられるようになってからも、個人的には好んで仮想インターフェイスの方を使っている。

私自身、もう仮想インターフェイスはオワコン、とは思っていない。いくら ip addr で IP アドレスを自由に付け替えられるといっても、それでは余りに生々しすぎる。仮想インターフェイスは if{up,down} <ifname> という安全かつお手軽な UI が良いのだ。操作する度に IP アドレスを打ち込むなど、トラブルの元でしかない。

という訳で、RHEL7 + NetworkManager で仮想インターフェイスが使えるかどうかは、私にとって大きな関心事だった。とりあえず早くに動くことだけは確認していたが、NetworkManager と仮想インターフェイスとの関係が良く理解できず、暫く様子を見ていた。そして最近になってようやく安心して使っていけそうだと判断した。

まず、enp0s18 を親とする仮想インターフェイス enp0s18:1 を作ってみる。

# cat /etc/sysconfig/network-scripts/ifcfg-enp0s18
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s18
UUID=4fe308d7-c49f-4232-ba9b-fb8f635ea38c
DEVICE=enp0s18
ONBOOT=yes
IPADDR=192.168.0.1
PREFIX=24
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no

# cat /etc/sysconfig/network-scripts/ifcfg-enp0s18:1
NAME=enp0s18:1
DEVICE=enp0s18:1
BOOTPROTO=none
IPADDR=192.168.0.2
PREFIX=24

この状態で、NetworkManager はどのように認識するのか。(予め enp0s18 は停止している)

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)

# nmcli con reload

# nmcli con
NAME     UUID                                  TYPE            DEVICE
enp0s17  bd4f8279-8778-4032-86dc-900dce2a12ee  802-3-ethernet  enp0s17
enp0s18  4fe308d7-c49f-4232-ba9b-fb8f635ea38c  802-3-ethernet  --

NetworkManager は、親(enp0s18)だけを認識している。その内容は、

# nmcli con show enp0s18
connection.id:                          enp0s18
connection.uuid:                        4fe308d7-c49f-4232-ba9b-fb8f635ea38c
connection.interface-name:              enp0s18
connection.type:                        802-3-ethernet
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.timestamp:                   1467383289
connection.read-only:                   no
connection.permissions:
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.secondaries:
connection.gateway-ping-timeout:        0
802-3-ethernet.port:                    --
802-3-ethernet.speed:                   0
802-3-ethernet.duplex:                  --
802-3-ethernet.auto-negotiate:          yes
802-3-ethernet.mac-address:             --
802-3-ethernet.cloned-mac-address:      --
802-3-ethernet.mac-address-blacklist:
802-3-ethernet.mtu:                     auto
802-3-ethernet.s390-subchannels:
802-3-ethernet.s390-nettype:            --
802-3-ethernet.s390-options:
ipv4.method:                            manual
ipv4.dns:
ipv4.dns-search:
ipv4.addresses:                         192.168.0.1/24, 192.168.0.2/24
ipv4.gateway:                           --
ipv4.routes:
ipv4.route-metric:                      -1
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.never-default:                     no
ipv4.may-fail:                          yes
ipv6.method:                            auto
ipv6.dns:
ipv6.dns-search:
ipv6.addresses:
ipv6.gateway:                           --
ipv6.routes:
ipv6.route-metric:                      -1
ipv6.ignore-auto-routes:                no
ipv6.ignore-auto-dns:                   no
ipv6.never-default:                     no
ipv6.may-fail:                          yes
ipv6.ip6-privacy:                       0 (disabled)
ipv6.dhcp-send-hostname:                yes
ipv6.dhcp-hostname:                     --

注目すべきは、ipv4.addresses に仮想インターフェイス(enp0s18:1)の IP アドレスも設定されていること。NetworkManager は仮想インターフェイスの情報を収集し、親インターフェイス側に集約するようだ。そして仮想インターフェイスの方は無かったことにされ、NetworkManager から仮想インターフェイスは見えなくなる。

# nmcli con show enp0s18:1 ; echo $?
Error: enp0s18:1 - no such connection profile.
10

この状態で enp0s18 を起動すると、両方の IP アドレスが起動する。

# ip addr show enp0s18
3: enp0s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:94:42:c7 brd ff:ff:ff:ff:ff:ff

# nmcli con up enp0s18
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/16)

# ip addr show enp0s18
3: enp0s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:94:42:c7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global enp0s18
       valid_lft forever preferred_lft forever
    inet 192.168.0.2/24 brd 192.168.0.255 scope global secondary enp0s18:1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe94:42c7/64 scope link
       valid_lft forever preferred_lft forever

その際、仮想インターフェイスの「ONBOOT」や「ONPARENT」という設定は無視されるようだ。少なくとも試した限りでは、これらをどう設定しても、仮想インターフェイス側の IP アドレスは自動的に起動した。

そして前述の通り、NetworkManager から仮想インターフェイスは見えないので、当然、up / down することもできない。

# nmcli con down enp0s18:1 ; echo $?
Error: 'enp0s18:1' is not an active connection.
Error: no active connection provided.
10

# nmcli con up enp0s18:1 ; echo $?
Error: Connection 'enp0s18:1' does not exist.
10

しかし ifup / ifdown なら、それが可能。

# ip addr show enp0s18
3: enp0s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:94:42:c7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global enp0s18
       valid_lft forever preferred_lft forever
    inet 192.168.0.2/24 brd 192.168.0.255 scope global secondary enp0s18:1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe94:42c7/64 scope link
       valid_lft forever preferred_lft forever

# ifdown enp0s18:1 ; echo $?
0

# ip addr show enp0s18
3: enp0s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:94:42:c7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global enp0s18
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe94:42c7/64 scope link
       valid_lft forever preferred_lft forever

# ifup enp0s18:1 ; echo $?
0

# ip addr show enp0s18
3: enp0s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:94:42:c7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global enp0s18
       valid_lft forever preferred_lft forever
    inet 192.168.0.2/24 brd 192.168.0.255 scope global secondary enp0s18:1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe94:42c7/64 scope link
       valid_lft forever preferred_lft forever

ifup / ifdown は、NetworkManager が管理するインターフェイスについては NetworkManager に処理を丸投げするが、そうでない場合、従来同様に ifup / ifdown 自身が処理を行う。よって NetworkManager からは見えない仮想インターフェイスについても、ifup / ifdown なら扱うことができる。

・・・のはずなのだが、実は RHEL7.1 以前には不具合があって、仮想インターフェイスを ifup することができない。

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)

# ifdown enp0s18:1 ; echo $?
0

# ifup enp0s18:1 ; echo $?
Error: no device found for connection 'enp0s18:1'.
4

正直この不具合のお陰で、ずっと NetworkManager と仮想インターフェイスとの関係に悩んでいたと言っていい。:-(

以上をまとめると、

  • RHEL7 でも仮想インターフェイスは使用できる。
    • ただし、「ONBOOT」「ONPARENT」設定は無視される。(常に自動起動する)
  • NetworkManager (nmcli)は仮想インターフェイスを操作できない。
  • ifup / ifdown は仮想インターフェイスを操作できる。
    • ただし、RHEL7.2 以上が必要。

個人的には、仮想インターフェイスはずっと残しておいて欲しい機能だ。きっと RHEL8 でも動いてくれる・・・よね?

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。