はじめに
この記事はopenSUSE Advent Calendar 2018 14日目の記事です.
こんにちは初めまして,v_7zrgu0 こと Harukaと申します.
openSUSEはメイン使いしているわけではないものの,KVMを用いた仮想化基盤として使用しています.
さて,openSUSE Leapでは15よりVirt-manager上でmacvtap接続オプションが実装されたので,気づいた方も多いのではないでしょうか.
KVMで仮想マシンを外部ネットワークに接続する場合,よく用いられる方法としては
・NAT接続
・ブリッジ接続
などが挙げられます.
上記の接続方法では,いずれも tap デバイスを経由して行われます.
対してmacvtap接続では,1つの物理NICに対して仮想マシン毎に追加のMACアドレスを付与し,独立したインターフェースとして振る舞います.
macvtap接続について,概論的な説明をしているページが多かったので,備忘録を兼ねて実際の構築したときのメモを書こうと思います.
macvtap接続をする際,更に
・Bridge
・VEPA
・プライベート
・パススルー
という項目が指定できます.
今回はパススルーを用いて試験しています.
今回の試験環境について簡単に紹介.
Core i5 650
RAM 4GB
GA-H55M-S2V
eth0 オンボードの蟹
eth1 BuffaloのUSB-NIC(LUA3-U2-AGT)
eth2 IO-DATA の USB-NIC(EDC-GUA3)openSUSE Leap 15.0
急遽用意することが出来たのがこのマシンだったというだけで,特に選定理由はありません.
設定を入れてみる
まずはkvm上の仮想マシンにmacvtap接続の仮想NICを割り当てます.
ホストOSのインストール時 eth0は未設定,eth1にDHCPクライアント設定を入れる(eth0はホストで使用しない)
systemctl enable libvirtd
virt-manager起動
ゲストOSをセットアップし,eth0 - macvtap接続を仮想マシンにアタッチして起動
ホストOS側のインターフェース
haruka@SUSE-H55M:~> 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:73:06:ac brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:feb4:ec8a/64 scope link valid_lft forever preferred_lft forever 4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether bc:5c:4c:e8:6e:76 brd ff:ff:ff:ff:ff:ff inet 192.168.100.10/24 brd 192.168.100.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::be5c:4cff:fee8:6e76/64 scope link valid_lft forever preferred_lft forever 12: macvtap0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 500 link/ether 52:54:00:73:06:ac brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:fe73:6ac/64 scope link valid_lft forever preferred_lft forever haruka@SUSE-H55M:~>
これだけで,ゲストOSはホストOSと同一セグメントのIPアドレスを有しています.
ブリッジ接続よりも簡単に構築できます.
今回の構成ではホストOSとゲストOSで用いるNICを変えているため,ホスト↔ゲスト間でのネットワーク通信も可能です(当たり前ですが.)
ゲストOS側のインターフェース
haruka_vm01@SUSE-VM01:~> 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:73:06:ac brd ff:ff:ff:ff:ff:ff inet 192.168.100.2/24 brd 192.168.100.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe73:6ac/64 scope link valid_lft forever preferred_lft forever haruka_vm01@SUSE-VM01:~>
上記の構成をトポロジ図もどきで示すとこんなところでしょうか.
応用例
次はkvm上の仮想マシンにゲストOSとしてvyOSをインストールし,ホストOSのパケットをすべてvyOSを通した上で送り付けてみようと思います.
virt-manager起動
eth0 - macvtap接続を仮想マシンにアタッチ
ここまでは先ほどと同一ですが,仮想マシンに2つ目の仮想NICをアタッチさせます
eth2を追加し,eth2 - macvtap接続を仮想マシンにアタッチし,vyOSを起動
ホストOSであるopenSUSE上のインターフェースはこんな感じになっているはずです.
haruka@SUSE-H55M:~> 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:b4:ec:8a brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:feb4:ec8a/64 scope link valid_lft forever preferred_lft forever 4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether bc:5c:4c:e8:6e:76 brd ff:ff:ff:ff:ff:ff inet 192.168.100.10/24 brd 192.168.100.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::be5c:4cff:fee8:6e76/64 scope link valid_lft forever preferred_lft forever 9: macvtap0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 500 link/ether 52:54:00:b4:ec:8a brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:feb4:ec8a/64 scope link valid_lft forever preferred_lft forever 10: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:8e:74:db brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:fe8e:74db/64 scope link valid_lft forever preferred_lft forever 11: macvtap1@eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 500 link/ether 52:54:00:8e:74:db brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:fe8e:74db/64 scope link valid_lft forever preferred_lft forever haruka@SUSE-H55M:~>
そしてvyOS上でeth0 を外向き,eth2を内向きとしてNAT設定,DHCPサーバを構築 します
・インターフェースの定義
vyos@vyos:~$ configure [edit] vyos@vyos:~# set interfaces ethernet eth0 address dhcp vyos@vyos:~# set interfaces ethernet eth0 description 'OUTSIDE' vyos@vyos:~# set interfaces ethernet eth1 address '192.168.200.1/24' vyos@vyos:~# set interfaces ethernet eth1 description 'INSIDE'
・NATの設定
vyos@vyos:~# set nat source rule 100 outbound-interface 'eth0' vyos@vyos:~# set nat source rule 100 source address '192.168.200.0/24' vyos@vyos:~# set nat source rule 100 translation address masquerade
・DHCPサーバの設定
vyos@vyos:~# set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 default-router '192.168.200.1' vyos@vyos:~# set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 dns-server '192.168.200.1' vyos@vyos:~# set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 domain-name 'internal-network' vyos@vyos:~# set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 lease '86400' vyos@vyos:~# set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 range 0 start '192.168.200.2' vyos@vyos:~# set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 range 0 stop '192.168.200.9' vyos@vyos:~# commit vyos@vyos:~# save Saving configuration to '/config/config.boot'... Done vyos@vyos:~#
本ブログエントリの主旨からはずれますが,vyOSは1.2系からDHCPサーバを構築する際のアドレス割り当て空間の定義に関する記法が変更になっています.
ご注意ください.
ゲストOSであるvyOSでのインターフェースはこのようになっています.
vyos@vyos:~$ 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:8e:74:db brd ff:ff:ff:ff:ff:ff inet 192.168.200.1/24 brd 192.168.200.255 scope global eth2 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe8e:74db/64 scope link valid_lft forever preferred_lft forever 3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:8e:74:db brd ff:ff:ff:ff:ff:ff inet 192.168.100.3/24 brd 192.168.100.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe8e:74db/64 scope link valid_lft forever preferred_lft forever vyos@vyos:~$
vyOSの設定が完了したらホストOS上でYaST → ネットワークで eth1 をDHCP割り当てから 192.168.200.10/24 に変更
この状態でホストであるopenSUSEから192.168.100.1 かつ 192.168.200.1 にping が通れば成功です.
haruka@SUSE-H55M:~> ping 192.168.100.1 PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data. 64 bytes from 192.168.100.1: icmp_seq=1 ttl=254 time=1.17 ms 64 bytes from 192.168.100.1: icmp_seq=2 ttl=254 time=1.24 ms ^C --- 192.168.100.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 1.172/1.206/1.241/0.048 ms haruka@SUSE-H55M:~> ping 192.168.200.1 PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data. 64 bytes from 192.168.200.1: icmp_seq=1 ttl=64 time=0.787 ms 64 bytes from 192.168.200.1: icmp_seq=2 ttl=64 time=0.684 ms ^C --- 192.168.200.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1026ms rtt min/avg/max/mdev = 0.684/0.735/0.787/0.058 ms haruka@SUSE-H55M:~> ping 1.1.1.1 PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. 64 bytes from 1.1.1.1: icmp_seq=1 ttl=62 time=2.06 ms 64 bytes from 1.1.1.1: icmp_seq=2 ttl=62 time=1.66 ms ^C --- 1.1.1.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 1.661/1.861/2.062/0.205 ms haruka@SUSE-H55M:~>
上記の構成を先ほどと同じトポロジ図もどきで示すとこんなところでしょうか.
仮想マシン上にVPNサーバーを構築して,VLANを切って別経路として流すことも可能ですね.
おわりに
この記事ではoepnSUSEにてvirt-managerからmacvtap接続を使用した仮想マシンの構築を行いました.
今回はゲストOSにmacvtap接続なNICのみを割り当てていますが,応用例の場合vyOSのLAN側はホスト側とブリッジ接続することでより簡素な構成にすることが出来ます.
上記の例はあくまで“こんなことも出来る”程度で優しい目で見ていただけると幸いです.
間違いや訂正すべきことがありましたら,コメント欄より教えていただけるとありがたいです.
最後まで読んでいただき,ありがとうございました.
参考文献
・仮想化環境におけるパケットフォワーディング
https://www.slideshare.net/syuu1228/ss-22395744
・Suse Doc : 管理ガイド - ネットワークの手動環境設定
https://www.suse.com/ja-jp/documentation/sles11/book_sle_admin/data/sec_basicnet_manconf.html