VyOSでVXLAN

VyOSでVXLAN

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

ソフトウェア バージョン
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経由でホストマシンに向いています。

ネットワーク図

VXLANは、VTEPの管理やARPへの対応のやり方で種類がいろいろあります。

  • 静的にVTEPを指定する
  • マルチキャストで検出する
  • MP-BGPで交換する(EVPNと呼ぶらしい)

今回はマルチキャストで交換する設定をやってみます。 マルチキャストではマルチキャストアドレス用にMACアドレスが割り振られハイパーバイザ管理外のMACアドレスを使った通信が必要になります。 そのためVitualBoxのネットワーク設定ではプロミスキャストを有効にする必要があります。

マルチキャストを行うにはPIM-SM(RFC7761)を設定します。 このプロトコルでは、まずユニキャストで経路が確保されたアドレス(RP)を持つルーターで、ここにマルチキャストを受信するホストが接続されたルーターは登録されます。 実際の配信では経路を最適化しつつ行うようです。このまとめがわかりやすかったです。

RPに集めるマルチキャストのグループはDクラスアドレスのプレフィックスで指定します。 このグループとRPについてはマルチキャストに参加する全てのルーターで同じ設定を行います。 そうしないと経路情報を集約できません。 また、実際にマルチキャストアドレスに参加を受け付けるプロトコルであるIGMP(RFC3376)も設定しました。

環境準備

設定

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

 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
44
45
46
47
48
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: "seg1"
    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: "local"

    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 :vysite3 do | vysite3 |
    vysite3.vm.hostname = "vysite3"
    vysite3.vm.network :private_network, virtualbox__intnet: "local"
    vysite3.vm.network :private_network, virtualbox__intnet: "seg2"

    vysite3.vm.provider :virtualbox do |vb|
      (1..vysite3.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.1.10.10", virtualbox__intnet: "seg1"
  end
  config.vm.define :deb1 do | deb |
    deb.vm.box = "debian/bullseye64"
    deb.vm.hostname = "deb1"
    deb.vm.network :private_network, ip: "100.1.10.20", virtualbox__intnet: "seg2"
  end
end

vysite1

 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
configure

set interfaces ethernet eth2
set interfaces ethernet eth2 address 100.0.10.2/24

set protocols ospf area 0 network 100.0.10.0/24

# マルチキャスト設定
set protocols pim interface eth2 # 使うインタフェース
 # 使うマルチキャストのサブネットと解決するRPのユニキャストアドレス
set protocols pim rp address 192.0.100.1 group 239.0.0.0/24

# VXLANインタフェースの設定
set interfaces vxlan vxlan0 vni 37
set interfaces vxlan vxlan0 group 239.0.0.11
set interfaces vxlan vxlan0 source-interface eth2

# VXLANインタフェースとセグメントの紐付け
set interfaces ethernet eth1
set interfaces bridge br0
set interfaces bridge br0 member interface eth1
set interfaces bridge br0 member interface vxlan0

commit
save

vysite2

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
configure

set interfaces ethernet eth1 address 100.0.10.1/24
set interfaces ethernet eth2 address 100.0.20.2/24
set interfaces loopback lo address 192.0.100.1/32 # PIMのRP用アドレス

set protocols ospf area 0 network 100.0.10.0/24
set protocols ospf area 0 network 100.0.20.0/24
set protocols ospf area 0 network 192.0.100.1/32 # RP用アドレスの広報

# マルチキャスト設定
set protocols pim interface eth1
set protocols pim interface eth2
set protocols pim rp address 192.0.100.1 group 239.0.0.0/24

# マルチキャストアドレスへの登録を受付(IGMP)に使うインタフェース
set protocols igmp interface eth1
set protocols igmp interface eth2

commit
save

vysite3

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
configure

set interfaces ethernet eth1
set interfaces ethernet eth1 address 100.0.20.1/24
set protocols ospf area 0 network 100.0.20.0/24

set protocols pim interface eth1
set protocols pim rp address 192.0.100.1 group 239.0.0.0/24

set interfaces vxlan vxlan0 vni 37
set interfaces vxlan vxlan0 group 239.0.0.11
set interfaces vxlan vxlan0 source-interface eth1

set interfaces ethernet eth2
set interfaces bridge br0
set interfaces bridge br0 member interface eth2
set interfaces bridge br0 member interface vxlan0

commit
save
comments powered by Disqus