1 問題
私の目標は、すべてのLANトラフィックがルーターとファイアウォールとして機能する仮想マシン(VM)を介してルーティングされることです。同じハイパーバイザー上の他のVMもファイアウォールVMを介してルーティングされる必要があります。以下を参照してください。ネットワークスケッチトランク ブリッジに接続された物理ホストは相互に正常に ping を実行できますが、VM にはまだ到達できません。
2 詳細
ハイパーバイザー上のネットワーク構成:
# =======
# Bridges
# =======
# ---------------------
# VLAN bridge br-vlan-3
# ---------------------
ip link add name br-vlan-3 type bridge
ip addr add 10.66.3.11/24 dev br-vlan-3
ip link set dev br-vlan-3 up
# ---------------------
# Trunk bridge Upstream
# ---------------------
ip link add name br-trunk-up type bridge vlan_filtering 1 vlan_default_pvid 0
ip link set br-trunk-up up
# ---------------
# Trunk bridge VM
# ---------------
ip link add name br-trunk-vm type bridge vlan_filtering 1 vlan_default_pvid 0
ip link set br-trunk-vm up
# =====
# Hosts
# =====
# Set physical devices up
ip link set enp5s0 up
ip link set enp9s0f0 up
ip link set enp9s0f1 up
ip link set enp9s0f2 up
ip link set enp9s0f3 up
# ----------------------
# desktop.3 br-vlan-3
# ----------------------
ip link add link enp9s0f1 name enp9s0f1.3 type vlan id 3
ip link set dev enp9s0f1.3 master br-vlan-3
ip link set enp9s0f1.3 up
# --------------------------
# desktop.100 br-trunk-vm
# --------------------------
ip link add link enp9s0f1 name enp9s0f1.100 type vlan id 100
ip link set enp9s0f1.100 master br-trunk-vm
ip link set enp9s0f1.100 up
bridge vlan add vid 100 dev enp9s0f1.100 master
bridge vlan add vid 100 dev br-trunk-vm self
bridge vlan add vid 100 dev fw.100 pvid 100
ネットワークマップ
=======
DESKTOP
=======
localhost:user ~ $ ip a
2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
4: br-vlan-100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 1a:b1:36:43:f0:e4 brd ff:ff:ff:ff:ff:ff
inet 10.66.100.44/24 scope global br-vlan-100
valid_lft forever preferred_lft forever
7: enp.100@enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-vlan-100 state UP group default qlen 1000
link/ether 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
localhost:~ # cat /proc/net/vlan/enp.100
enp.100 VID: 100 REORDER_HDR: 1 dev->priv_flags: 1221
total frames received 0
total bytes received 0
Broadcast/Multicast Rcvd 0
total frames transmitted 287
total bytes transmitted 53964
Device: enp34s0
INGRESS priority mappings: 0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0
EGRESS priority mappings:
==========
HYPERVISOR
==========
bridge name bridge id STP enabled interfaces
br-vlan-100 8000.1ab13643f0e4 no enp.100
[root@fedora system]# ip a
4: enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether a0:36:9f:5d:09:19 brd ff:ff:ff:ff:ff:ff
13: br-trunk-vm: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 56:7e:22:6a:23:2d brd ff:ff:ff:ff:ff:ff
16: enp9s0f1.100@enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-trunk-vm state UP group default qlen 1000
link/ether a0:36:9f:5d:09:19 brd ff:ff:ff:ff:ff:ff
21: fw.100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-trunk-vm state UNKNOWN group default qlen 1000
link/ether fe:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
[root@fedora system]# brctl show dev br-trunk-vm
bridge name bridge id STP enabled interfaces
br-trunk-vm 8000.567e226a232d no enp9s0f1.100
fw.100
fw.103
fw.3
===============
VIRTUAL MACHINE
===============
[root@fedora system]# bridge vlan show
port vlan-id
br-trunk-vm 100
enp9s0f1.100 100
virbr0 1 PVID Egress Untagged
fw.100 100 PVID Egress Untagged
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
inet 10.66.100.10/24 scope global enp1s0
valid_lft forever preferred_lft forever
ファイアウォール VM の Libvirt XML ネットワーク構成:
<interface type='bridge'>
<mac address='52:54:00:3e:97:72'/>
<source bridge='br-trunk-vm'/>
<target dev='fw.100'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
3回の試み
ファイアウォール VM でタグ付き NIC とタグなし NIC の両方を設定してみました。タグ付き NIC の場合、ファイアウォール VM に VLAN ブリッジを作成し、fw.100
VLAN 100: を使用して仮想タップから仮想タップ デバイスを作成しました[email protected]
。次に、のトランク ポートを[email protected]
master: に設定しました。タグなし NIC アプローチの場合、ファイアウォール VM に VLAN を設定せず、そのトランク ポートを PVID 100 untagged に設定しました。どちらの場合も、デスクトップ ホストとファイアウォール VM の間で ping を実行できませんでした。bridge vlan add vid 100 dev [email protected] master
bridge vlan add vid 100 dev fw.100 pvid 100 untagged
この問題は、libvirt KVM/QEMU 仮想マシンでのみ発生します。ハイパーバイザーのトランク ブリッジにマスターとして接続された 2 つの物理 VLAN タグ付きホストは、相互に ping を実行できます。
4 アップデート
libvirt は VLAN を使用した Linux ブリッジをサポートしていないようです。次の記事によると、ハイパーバイザー上に同じ VLAN を持つ 2 番目の仮想デバイスがある場合、VM の VLAN は機能しなくなります。https://alesnosek.com/blog/2015/09/07/bridging-vlan-trunk-to-the-guest/
代わりに openvswitch を使用することもできますが、各 VM と物理ホストにブリッジを使用する方がよい方法です。ハイパーバイザーは、VM とホストのブリッジをファイアウォール VM のブリッジに転送することを許可し、残りのルーティングはファイアウォール VM 内で実行されます。