Harukaの雑記

備忘録を兼ねて。サーバマシンとかネットワークとか

openSUSE Leap15 のKVMでmacvtap接続を試す

はじめに

この記事はopenSUSE Advent Calendar 2018 14日目の記事です.

んにちは初めまして,v_7zrgu0 こと Harukaと申します.
openSUSEはメイン使いしているわけではないものの,KVMを用いた仮想化基盤として使用しています.

さて,openSUSE Leapでは15よりVirt-manager上でmacvtap接続オプションが実装されたので,気づいた方も多いのではないでしょうか.

openSUSE 15 macvtap selection
eth0, eth1, eth2 にそれぞれ macvtap の選択肢が表示されている
KVM仮想マシンを外部ネットワークに接続する場合,よく用いられる方法としては
・NAT接続
・ブリッジ接続
などが挙げられます.
上記の接続方法では,いずれも tap デバイスを経由して行われます.
対してmacvtap接続では,1つの物理NICに対して仮想マシン毎に追加のMACアドレスを付与し,独立したインターフェースとして振る舞います.

macvtap接続について,概論的な説明をしているページが多かったので,備忘録を兼ねて実際の構築したときのメモを書こうと思います.

macvtap接続をする際,更に
・Bridge
・VEPA
・プライベート
・パススルー
という項目が指定できます.

macvtap のモード選択
今回はパススルーを用いて試験しています.

今回の試験環境について簡単に紹介.

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:~> 

上記の構成をトポロジ図もどきで示すとこんなところでしょうか.

f:id:v_7zrgu0:20181212181708j:plain
ホストOSとゲストOSが同一セグメント上にある

応用例

kvm上の仮想マシンにゲストOSとしてvyOSをインストールし,ホストOSのパケットをすべてvyOSを通した上で送り付けてみようと思います.

virt-manager起動
eth0 - macvtap接続を仮想マシンにアタッチ

ここまでは先ほどと同一ですが,仮想マシンに2つ目の仮想NICをアタッチさせます
eth2を追加し,eth2 - macvtap接続を仮想マシンにアタッチし,vyOSを起動

f:id:v_7zrgu0:20181210121517j:plain
NICが2つ設定されているのが分かると思います

ホスト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:~> 

上記の構成を先ほどと同じトポロジ図もどきで示すとこんなところでしょうか.

f:id:v_7zrgu0:20181212181749j:plain
ホストOSのパケットをvyOSに通すことにより,2重ルータとなっている
仮想マシン上に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