VyOSでVLAN

VyOSでVLAN

VyOSでVLANを設定してみます。

ソフトウェア バージョン
VyOS 1.4-rolling-202203080319
VirtualBox 6.1.32 r149290 (Qt5.6.3)
Vagrant 2.2.19
vagrant-vyos 1.1.10

構築環境

Vagrantで準備するとeth0としてNATタイプのインタフェースとdefaultルートが設定されます。 図には載せないですが全てのホストでdefaultルートがeth0経由でホストマシンに向いています。

ネットワーク図

vlan セグメント
11 100.0.1.0/24
12 100.0.2.2/24

環境準備

環境は下のように準備します。注意するところは nicpromisc を使いNICをプロミスキャストモードに指定することです。 VagrantからVirtualBoxプロバイダーを操作するのにはcutomizeメソッドを使います。 VirtualBoxの公式リファレンスの8.8.2 (modify networking)を使います。プロミスキャストは deny | allow-vms | allow-all を指定できるようです。ここでは allow-vms を指定してます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Vagrant.configure("2") do |config|
  config.vm.box = "vyos/current"

  config.vm.define :vysite1 do | vysite1 |
    vysite1.vm.hostname = "vysite1"
    vysite1.vm.network :private_network, virtualbox__intnet: "seg-i-0"
    vysite1.vm.network :private_network, virtualbox__intnet: "seg-i-1"
    vysite1.vm.network :private_network, virtualbox__intnet: "backbone"

    vysite1.vm.provider "virtualbox" do |vb|
      (1..vysite1.vm.networks.count).each do |i|
        vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-vms"]
      end
    end
  end
  config.vm.define :vysite2 do | vysite2 |
    vysite2.vm.hostname = "vysite2"
    vysite2.vm.network :private_network, virtualbox__intnet: "backbone"
    vysite2.vm.network :private_network, virtualbox__intnet: "ext"

    vysite2.vm.provider :virtualbox do |vb|
      (1..vysite2.vm.networks.count).each do |i|
        vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-vms"]
      end
    end
  end

  config.vm.define :deb0 do | deb |
    deb.vm.box = "debian/bullseye64"
    deb.vm.hostname = "deb0"
    deb.vm.network :private_network, ip: "100.0.1.1", virtualbox__intnet: "seg-i-0"
  end
  config.vm.define :deb1 do | deb |
    deb.vm.box = "debian/bullseye64"
    deb.vm.hostname = "deb1"
    deb.vm.network :private_network, ip: "100.0.2.1", virtualbox__intnet: "seg-i-1"
  end
  config.vm.define :debext do | deb |
    deb.vm.box = "debian/bullseye64"
    deb.vm.hostname = "debext"
    deb.vm.network :private_network, type: "dhcp", virtualbox__intnet: "ext"
  end
end

設定

deb0, deb1 は特に設定変更する必要はなく vagrant up deb0 deb1 で最低限の実験できます。 tcpdump はパケットを見るのに入れました。

vysite1

下のようにイーサネットインタフェースを3つ作成してブリッジに接続しています。 対向ホストは vlan タグをつけません。そこでアクセスポートに対応するインタフェースに native-vlan を設定しています。 トランクポートにあたる eth3 では allowed-vlan を設定しました。 native-vlan のデフォルトは1みたいです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
configure
set interfaces ethernet eth1
set interfaces ethernet eth2
set interfaces ethernet eth3

set interfaces bridge br0
set interfaces bridge br0 enable-vlan
set interfaces bridge br0 member interface eth1 native-vlan 11
set interfaces bridge br0 member interface eth1 native-vlan 12
set interfaces bridge br0 member interface eth3 allowed-vlan 11-12
commit
save

vysite2

こちらはイーサネットインタフェースは2つともトランクポートにしています。

1
2
3
4
5
6
set interfaces ethernet eth1
set interfaces ethernet eth2
set interfaces bridge br0
set interfaces bridge br0 enable-vlan
set interfaces bridge br0 member interface eth1 allowed-vlan 11-12
set interfaces bridge br0 member interface eth1 allowed-vlan 11-12

debext

debext はトランクポートにつながっています。 分離するために vlan インタフェースを作成してアドレスを与えました。

1
2
3
4
5
6
7
sudo ip link add link eth1 name eth1.11 type vlan id 11
sudo ip addr add 100.0.1.2/24 dev eth1.11
sudo ip link set eth1.11 up

sudo ip link add link eth1 name eth1.12 type vlan id 12
sudo ip addr add 100.0.2.2/24 dev eth1.12
sudo ip link set eth1.12 up

検証

それぞれのホストから ping を飛ばします。 tcpdump -e -n -i br0 でイーサネットフレームを観察するとVLANタグが付与されてることが観察できます。

1
2
3
4
5
6
7
8
9
# in vagrant@deb0:~
$ ping 100.0.1.2
PING 100.0.1.2 (100.0.1.2) 56(84) bytes of data.
64 bytes from 100.0.1.2: icmp_seq=1 ttl=64 time=1.59 ms
64 bytes from 100.0.1.2: icmp_seq=2 ttl=64 time=3.12 ms
^C
--- 100.0.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.591/2.353/3.116/0.762 ms
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ tcpdump -e -n -i br0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on br0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:46:10.785509 08:00:27:80:0d:76 > 08:00:27:14:27:3f, ethertype 802.1Q (0x8100), length 102: vlan 11, p 0, ethertype IPv4 (0x0800), 100.0.1.1 > 100.0.1.2: ICMP echo request, id 6911, seq 1, length 64
14:46:10.785995 08:00:27:14:27:3f > 08:00:27:80:0d:76, ethertype 802.1Q (0x8100), length 102: vlan 11, p 0, ethertype IPv4 (0x0800), 100.0.1.2 > 100.0.1.1: ICMP echo reply, id 6911, seq 1, length 64
14:46:11.788517 08:00:27:80:0d:76 > 08:00:27:14:27:3f, ethertype 802.1Q (0x8100), length 102: vlan 11, p 0, ethertype IPv4 (0x0800), 100.0.1.1 > 100.0.1.2: ICMP echo request, id 6911, seq 2, length 64
14:46:11.789564 08:00:27:14:27:3f > 08:00:27:80:0d:76, ethertype 802.1Q (0x8100), length 102: vlan 11, p 0, ethertype IPv4 (0x0800), 100.0.1.2 > 100.0.1.1: ICMP echo reply, id 6911, seq 2, length 64
14:46:15.939954 08:00:27:80:0d:76 > 08:00:27:14:27:3f, ethertype 802.1Q (0x8100), length 64: vlan 11, p 0, ethertype ARP (0x0806), Request who-has 100.0.1.2 tell 100.0.1.1, length 46
14:46:15.940433 08:00:27:14:27:3f > 08:00:27:80:0d:76, ethertype 802.1Q (0x8100), length 64: vlan 11, p 0, ethertype ARP (0x0806), Reply 100.0.1.2 is-at 08:00:27:14:27:3f, length 46
14:46:15.940566 08:00:27:14:27:3f > 08:00:27:80:0d:76, ethertype 802.1Q (0x8100), length 64: vlan 11, p 0, ethertype ARP (0x0806), Request who-has 100.0.1.1 tell 100.0.1.2, length 46
14:46:15.941324 08:00:27:80:0d:76 > 08:00:27:14:27:3f, ethertype 802.1Q (0x8100), length 64: vlan 11, p 0, ethertype ARP (0x0806), Reply 100.0.1.1 is-at 08:00:27:80:0d:76, length 46

bridgeメモ

vysite1 ではアクセスポートを提供していました。これを普通の ip, bridge コマンドでやる方法をメモしておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
ip link add br0 type bridge
ip link set br0 up
ip link set br0 type bridge vlan_filtering 1

ip link set eth1 master br0
ip link set eth2 master br0
ip link set eth3 master br0

# アクセスポート(eth1,eth2)
bridge vlan add dev eth1 vid 11 pvid untagged master
bridge vlan add dev eth2 vid 12 pvid untagged master
# トランクポート(eth3)
bridge vlan add dev eth3 vid 11 master
bridge vlan add dev eth2 vid 12 master

Linuxにはvlan,macvlan,ipvlanと色々あるようです。 macvlanvlan と異なり別のMACアドレスを持てます。そのため物理ポート・VLAN IDを共有しつつ別 vrf に繋げることができそうです。 ipvlan は仮想アドレスと似てますがインタフェースなので netfilter などを分離できそうです。

ref. bridgeコマンドの実例(vlan_filteringの挙動)

comments powered by Disqus