hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

仮想マシンにNICを追加する方法



1 はじめに

KVMホストに仮想ブリッジ(br1)を作成し、仮想マシンを仮想ブリッジに接続してみます。
以下が初期状態となります。

+---- client ----+                                +---- server ----+
|                |                                |                |
|                |                                |                |
|                |                                |                |
|                |                                |                |
|                |                                |                |
+---- [eth0]-----+                                +---- [eth0] ----+
        | .181                                            | .216
        |                                                 |
        |                 192.168.122.0/24                |
        |                                                 |
+--- [vnet0] ----------------- virbr0 ----------------- [vnet1] ---+
|                                                                  |
|                                                                  |
+------------------------------------------------------------------+

最終的に以下の環境を作成します。図中の[]内はデバイス名(インタフェース名)を表します。

                             10.0.0.0/8

+---- client ----+           +-- br1 --+          +---- server ----+
|                |           |         |          |                |
|                | .20       |         |      .10 |                |
|              [eth1] --- [vnet2]   [vnet3] --- [eth1]             |
|                |           |         |          |                |
|                |           |         |          |                |
+---- [eth0]-----+           +---------+          +---- [eth0] ----+
        | .181                                            | .216
        |                                                 |
        |                 192.168.122.0/24                |
        |                                                 |
+--- [vnet0] ----------------- virbr0 ----------------- [vnet1] ---+
|                                                                  |
|                                                                  |
+------------------------------------------------------------------+

2 環境

サーバ、クライアントのCentOS版数は以下のとおりです。

[root@server ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

KVMホストのCentOS版数は以下のとおりです。

[root@kvm ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

virshコマンドの版数は以下のとおりです。

[root@kvm ~]# virsh -v
4.5.0

3 環境作成手順

3.1 仮想ブリッジの作成

KVMホストに仮想ブリッジ(br1)を作成します。ifnameにはデバイス名、con-nameにはプロファイル名を指定します。

[root@kvm ~]# nmcli connection add type bridge ifname br1 con-name br1-profile
接続 'br1-profile' (79447e2f-1041-4f65-a8df-2883f368cf1d) が正常に追加されました。

バイスの状態を確認します。仮想ブリッジが追加されたことがわかります。ただし、この時点では、仮想ブリッジは、まだシステムに接続されていません。

[root@kvm ~]# nmcli device |grep br1
br1         bridge    切断済み  --

仮想ブリッジを作成したらプロファイルを確認してみます。/etc/sysconfig/network-scripts配下にプロファイルが作成されることがわかります。

[root@kvm ~]# cat /etc/sysconfig/network-scripts/ifcfg-br1-profile
STP=yes
BRIDGING_OPTS=priority=32768
TYPE=Bridge
-snip-

作成した仮想ブリッジに、管理用のIPアドレスを設定します。

[root@kvm ~]# nmcli connection modify br1-profile ipv4.method manual ipv4.addresses "10.0.0.1/24"

仮想ブリッジをシステムに接続します。

[root@kvm ~]# nmcli device connect br1
デバイス 'br1' が 'dff11b62-2c59-4a13-96e3-246406c0cf3d' で正常にアクティベートされました。

バイスの状態を確認します。仮想ブリッジがシステムに接続されたことがわかります。

[root@kvm ~]# nmcli device |grep br1
br1         bridge    接続済み  br1-profile

3.2 サーバにNICを追加

サーバ、クライアントにデバイス(NIC)を追加します。デバイスの追加は、サーバ、クライアントが実行中のときに行います。

[root@kvm ~]# virsh list
 Id    名前                         状態
----------------------------------------------------
 3     server                         実行中
 4     client                         実行中

仮想ブリッジと接続するデバイスをサーバに追加します。

[root@kvm ~]# virsh attach-interface --type bridge --source br1 --model virtio server
インターフェースが正常に接続できました

サーバと接続するためのデバイス(vnet2)が、仮想ブリッジに追加されたことがわかります。

[root@kvm ~]# virsh domiflist server
インターフェース 種類     ソース  モデル   MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:6f:b0:ca
vnet2      bridge     br1        virtio      52:54:00:11:22:e8

brctlコマンドを使っても、仮想ブリッジに追加されたデバイス(vnet2)を確認することが確認できます。

[root@kvm ~]# brctl show br1
bridge name     bridge id               STP enabled     interfaces
br1             8000.fe5400639565       yes             vnet2

サーバでデバイスを確認します。デバイス(eth1)が追加されたことがわかります。

[root@server ~]# ip l show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:0b:52:e7 brd ff:ff:ff:ff:ff:ff

バイスの状態を確認します。

[root@server ~]# nmcli device
DEVICE  TYPE      STATE     CONNECTION
eth0    ethernet  接続済み  eth0
eth1    ethernet  切断済み  --
lo      loopback  管理無し  --

eth1という名前の接続プロファイルを作成します。

[root@server ~]# nmcli connection add type ethernet ifname eth1 con-name eth1
接続 'eth1' (a1f1d160-4dfc-4f89-8ac4-ede9bec33f23) が正常に追加されました

eth1にIPアドレス(10.0.0.10)を設定します

[root@server ~]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 10.0.0.10/24

バイス(eth1)をシステムに接続します。

[root@server ~]# nmcli device connect eth1
デバイス 'eth1' が '1868a469-132a-43f8-833d-71dad0621094' で正常にアクティベートされました。

バイスの状態を確認します。デバイス(eth1)がシステムに接続されたことがわかります。

[root@server ~]# nmcli device
DEVICE  TYPE      STATE     CONNECTION
eth0    ethernet  接続済み  eth0
eth1    ethernet  接続済み  eth1
lo      loopback  管理無し  --

バイス(eth1)に設定したIPアドレスを確認します。IPアドレスは10.0.0.10であることがわかります。

[root@server ~]# ip a show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:0b:52:e7 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.10/24 brd 10.0.0.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::18b7:805:de79:7f0b/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

3.3 クライアントにNICを追加

仮想ブリッジと接続するNICをクライアントに追加します。

[root@kvm ~]# virsh attach-interface --type bridge --source br1 --model virtio client
インターフェースが正常に接続できました

クライアントと接続するデバイス(vnet3)が、仮想ブリッジに追加されたことがわかります。

[root@kvm ~]# virsh domiflist client
インターフェース 種類     ソース  モデル   MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:d0:e3:a7
vnet3      bridge     br1        virtio      52:54:00:a8:67:25

brctlコマンドを使っても、仮想ブリッジに追加されたデバイス(vnet3)を確認することが確認できます。

[root@kvm ~]# brctl show br1
bridge name     bridge id               STP enabled     interfaces
br1             8000.fe5400639565       yes             vnet2
                                                        vnet3

クライアントでデバイスを確認します。デバイス(eth1)が追加されたことがわかります。

[root@client ~]# ip l show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:a8:67:25 brd ff:ff:ff:ff:ff:ff

バイスの状態を確認します。

[root@client ~]# nmcli device
DEVICE  TYPE      STATE                     CONNECTION
eth0    ethernet  接続済み                  eth0
eth1    ethernet  接続中 (IP 設定を取得中)  有線接続 1
lo      loopback  管理無し                  --

eth1という名前の接続プロファイルを作成します。

[root@client ~]# nmcli connection add type ethernet ifname eth1 con-name eth1
接続 'eth1' (f419b1c4-6a66-4f6b-9c9a-7dadac903da4) が正常に追加されました。

eth1にIPアドレス(10.0.0.20)を設定します

[root@client ~]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 10.0.0.20/24

バイス(eth1)をシステムに接続します。

[root@client ~]# nmcli device connect eth1
デバイス 'eth1' が 'dd6bcfd0-9484-44f7-8cb6-30004084a3f5' で正常にアクティベートされました。

バイスの状態を確認します。デバイス(eth1)がシステムに接続されたことがわかります。

[root@client ~]# nmcli device
DEVICE  TYPE      STATE     CONNECTION
eth0    ethernet  接続済み  eth0
eth1    ethernet  接続済み  eth1
lo      loopback  管理無し  --

バイス(eth1)に設定したIPアドレスを確認します。IPアドレスは10.0.0.20であることがわかります。

[root@client ~]# ip a show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:a8:67:25 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.20/24 brd 10.0.0.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::bc91:fe92:5463:fff3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

4 動作確認

4.1 デバイスの確認

作成した仮想ブリッジを確認します。

[root@kvm ~]# nmcli device show br1
GENERAL.DEVICE:                         br1
GENERAL.TYPE:                           bridge
GENERAL.HWADDR:                         FE:54:00:63:95:65
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (接続済み)
GENERAL.CONNECTION:                     br1-profile
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/8
IP4.ADDRESS[1]:                         10.0.0.1/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 10.0.0.0/24, nh = 0.0.0.0, mt = 425
IP6.ADDRESS[1]:                         fe80::f494:3a19:12c3:ef51/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 425
IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt = 256, table=255

4.2 pingによる確認

クライアントでpingコマンドを実行します。宛先はサーバのeth1を指定します。なお、pingコマンドの使い方は、pingコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@client ~]# ping -I eth1 -c 1 10.0.0.10
PING 10.0.0.10 (10.0.0.10) from 10.0.0.20 eth1: 56(84) bytes of data.
64 bytes from 10.0.0.10: icmp_seq=1 ttl=64 time=1.22 ms

--- 10.0.0.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.223/1.223/1.223/0.000 ms

4.3 tsharkによる確認

tsharkを使って、仮想ブリッジのvnet2を通過するICMP echo request/replyパケットを確認します。確認をするため、KVMホストでtsharkコマンドを実行します。なお、tsharkコマンドの使い方は、tsharkコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@kvm ~]# tshark -i vnet2 -Y 'icmp.type==0 or icmp.type==8'
Running as user "root" and group "root". This could be dangerous.
Capturing on 'vnet2'

クライアントでpingを1回実行してみます。宛先はサーバのeth1のIPアドレスを指定します。

[root@client ~]# ping -I eth1 -c 1 10.0.0.10

tsharkの実行結果を確認します。vnet2をICMP echo request/replyパケットが通過していることがわかります。

[root@kvm ~]# tshark -i vnet2 -Y 'icmp.type==0 or icmp.type==8'
Running as user "root" and group "root". This could be dangerous.
Capturing on 'vnet2'
  1 0.000000000    10.0.0.20 -> 10.0.0.10    ICMP 98 Echo (ping) request  id=0x067b, seq=1/256, ttl=64
  2 0.000980030    10.0.0.10 -> 10.0.0.20    ICMP 98 Echo (ping) reply    id=0x067b, seq=1/256, ttl=64 (request in 1)

5 環境削除手順

5.1 サーバのNIC削除

バイス(eth1)の接続を切断します。

[root@server ~]# nmcli device disconnect eth1

バイス(eth1)のプロファイルを削除します。プロファイルを削除すると、/etc/sysconfig/network-scripts配下から、当該プロファイルが削除されます。

[root@server ~]# nmcli connection delete eth1

仮想ブリッジのデバイスを確認します。仮想ブリッジは、サーバとvnet2で接続していることがわかります。

[root@kvm ~]# virsh domiflist server
インターフェース 種類     ソース  モデル   MAC
-------------------------------------------------------
vnet1      network    default    virtio      52:54:00:6f:b0:ca
vnet2      bridge     br1        virtio      52:54:00:0b:52:e7

サーバと仮想ブリッジの接続を切断します。

[root@kvm ~]# virsh detach-interface --domain server --type bridge --mac 52:54:00:0b:52:e7
インターフェースが正常に切断されました
[root@kvm ~]# virsh domiflist server
インターフェース 種類     ソース  モデル   MAC
-------------------------------------------------------
vnet1      network    default    virtio      52:54:00:6f:b0:ca

5.2 クライアントのNIC削除

バイス(eth1)の接続を切断します。

[root@client ~]# nmcli device disconnect eth1

バイス(eth1)のプロファイルを削除します。

[root@client ~]# nmcli connection delete eth1

仮想ブリッジのデバイスを確認します。仮想ブリッジは、クライアントとvnet3で接続していることがわかります。

[root@kvm ~]# virsh domiflist client
インターフェース 種類     ソース  モデル   MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:d0:e3:a7
vnet3      bridge     br1        virtio      52:54:00:a8:67:25

クライアントと仮想ブリッジの接続を切断します。

[root@kvm ~]# virsh detach-interface --domain client --type bridge --mac 52:54:00:a8:67:25 
インターフェースが正常に切断されました
[root@kvm ~]# virsh domiflist client
インターフェース 種類     ソース  モデル   MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:d0:e3:a7

5.3 仮想ブリッジの削除

削除する仮想ブリッジを確認します。

[root@kvm ~]# nmcli device |grep br1
br1         bridge    接続済み  br1-profile

仮想ブリッジをシステムから切断します。

[root@kvm ~]# nmcli device disconnect br1
デバイス 'br1' が正常に切断されました。

仮想ブリッジを削除します。

[root@kvm ~]# nmcli device delete br1
デバイス 'br1' が正常に削除されました。

仮想ブリッジを確認します。仮想ブリッジが削除されたことがわかります。

[root@kvm ~]# nmcli device |grep br1
[root@kvm ~]#

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ