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)
[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技術ブログ