Vyatta(VyOS)で、VXLANトンネルの設定方法をまとめます。VXLANは、他のトンネリング設定と同様に、トンネルの終端を指定する設定が必要ですが、VXLANには「静的に設定する方法」と「マルチキャストで動的に検出する方法」があります。
設定まとめ
静的にTEPを指定する場合
VXLANで静的にTEPを指定する場合、最小限必要となる設定は以下の通りです。
set interfaces vxlan <インターフェース名> remote <対向IPアドレス> set interfaces vxlan <インターフェース名> vni <vni>
以下のコマンドでブリッジインターフェースを作成し、それに所属するブリッジメンバーを定義できます。ブリッジのメンバーになれるのは、IPアドレスが付与されていないインターフェースのみです。
set interfaces bridge <ブリッジインターフェース> member interface <ブリッジメンバー> set interfaces bridge <ブリッジインターフェース> member interface <ブリッジメンバー>
VXLANトンネルの正常性を確認するには「show interfaces vxlan <インタフェース名>」コマンドが便利です。TX(送信)とRX(受信)のそれぞれのカウンタが上昇している(0ではない)ならば、互いに疎通可能な状態と判断できます。
vyos@vy001:~$ show interfaces vxlan vxlan10 vxlan10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether d2:d0:1d:71:ce:7b brd ff:ff:ff:ff:ff:ff inet6 fe80::d0d0:1dff:fe71:ce7b/64 scope link valid_lft forever preferred_lft forever RX: bytes packets errors dropped overrun mcast 648 7 0 0 0 0 TX: bytes packets errors dropped carrier collisions 648 7 0 0 0 0
マルチキャストによってTEPを検出する場合
マルチキャストによってTEPを検出する場合、最小限必要となる設定は以下の通りです。
set interfaces vxlan <インターフェース名> group <マルチキャストアドレス> set interfaces vxlan <インターフェース名> source-interface <送信元インターフェース名> set interfaces vxlan <インターフェース名> vni <vni>
以下のコマンドでブリッジインターフェースを作成し、それに所属するブリッジメンバーを定義できます。ブリッジのメンバーになれるのは、IPアドレスが付与されていないインターフェースのみです。
set interfaces bridge <ブリッジインターフェース> member interface <ブリッジメンバー> set interfaces bridge <ブリッジインターフェース> member interface <ブリッジメンバー>
VXLANトンネルの正常性を確認するには「show interfaces vxlan <インタフェース名>」コマンドが便利です。TX(送信)とRX(受信)のそれぞれのカウンタが上昇している(0ではない)ならば、互いに疎通可能な状態と判断できます。
vyos@vy001:~$ show interfaces vxlan vxlan10 vxlan10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether d2:d0:1d:71:ce:7b brd ff:ff:ff:ff:ff:ff inet6 fe80::d0d0:1dff:fe71:ce7b/64 scope link valid_lft forever preferred_lft forever RX: bytes packets errors dropped overrun mcast 648 7 0 0 0 0 TX: bytes packets errors dropped carrier collisions 648 7 0 0 0 0
上記の設定以外にも、マルチキャストルーティングを有効にする設定も必要です。VyOS 1.4ではマルチキャストルーティングに不具合があるため、この検証シナリオでは部分的にCisco IOSを使用しています。
動作確認
動作確認の構成
以下の環境で動作確認を行います。ブリッジを含む動作確認をする時は、ハイパーバイザの仮想スイッチに対してプロミスキャスモード等を有効にする必要がある事に注意ください。
VyOS 1.4ではマルチキャストルーティングに関する不具合が存在するため、スパインスイッチ(spine switch)相当の役割を果たす機器は、VyOSではなくCisco IOSを使用しています。
+-----------------------+ | host100 | | | +-----------+-----------+ ens224 | .100 ::100 | | 192.168.100.0/24 | 2001:0DB8:100::/64 | eth0 | (bridge) +-----------+-----------+ | vy001(leaf) | | Lo:10.1.1.1/32 | | Lo:2001:0DB8:1::1/128 | +-----------+-----------+ eth1 | .1 ::1 | | 192.168.12.0/24 | 2001:0DB8:12::/64 | g0/0 | .2 ::2 +-----------+-----------+ | cisco002(spine) | | Lo:10.2.2.2/32 | | Lo:2001:0DB8:2::2/128 | +-----------+-----------+ g0/1 | .2 ::2 | | 192.168.23.0/24 | 2001:0DB8:23::/64 | eth0 | .3 ::3 +-----------+-----------+ | vy003(leaf) | | Lo:10.3.3.3/32 | | Lo:2001:0DB8:3::3/128 | +-----------+-----------+ eth1 | (bridge) | | 192.168.100.0/24 | 2001:0DB8:100::/64 | ens224 | .200 ::200 +-----------+-----------+ | host200 | | | +-----------------------+
初期設定
IPv4アドレスとIPv6アドレスは付与済とします。vy001, vy002, vy003の間はOSPFで互いに経路を交換しているものとします。
動作確認 (1) 静的なTEP(Tunnel End Point)指定
vy001とvy003の間でvxlanトンネルを確立します。
[vy001:VyOS1.4] set interfaces vxlan vxlan10 remote 192.168.23.3 set interfaces vxlan vxlan10 vni 10010 [vy003:VyOS1.4] set interfaces vxlan vxlan10 remote 192.168.12.1 set interfaces vxlan vxlan10 vni 10010
トンネルが正常に確立されたかどうかを確認します。show interfaces vxlan vxlan10コマンドを実行し、RX, TXともにカウントアップしていれば(0以外の数字であれば)、双方向の通信が正常である事の確認になります。
もし、RX(受信)が0パケットとなっているならば設定を見直しましょう。
[vy001:VyOS1.4] vyos@vy001:~$ show interfaces vxlan vxlan10 vxlan10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether d2:d0:1d:71:ce:7b brd ff:ff:ff:ff:ff:ff inet6 fe80::d0d0:1dff:fe71:ce7b/64 scope link valid_lft forever preferred_lft forever RX: bytes packets errors dropped overrun mcast 648 7 0 0 0 0 TX: bytes packets errors dropped carrier collisions 648 7 0 0 0 0
ブリッジインターフェースを作成し、そのメンバーを定義します。
[vy001:VyOS1.4] set interfaces bridge br10 member interface eth0 set interfaces bridge br10 member interface vxlan10 [vy003:VyOS1.4] set interfaces bridge br10 member interface eth1 set interfaces bridge br10 member interface vxlan10
host100とhost200の間で互いに疎通可能である事を確認します。
[host100:RockyLinux8.4] [root@host100 ~]# ping -c 3 192.168.100.200 PING 192.168.100.200 (192.168.100.200) 56(84) bytes of data. 64 bytes from 192.168.100.200: icmp_seq=1 ttl=64 time=4.15 ms 64 bytes from 192.168.100.200: icmp_seq=2 ttl=64 time=3.52 ms 64 bytes from 192.168.100.200: icmp_seq=3 ttl=64 time=3.36 ms --- 192.168.100.200 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 3.362/3.679/4.151/0.340 ms [root@host100 ~]# [root@host100 ~]# [root@host100 ~]# ping -c 3 2001:db8:100::200 PING 2001:db8:100::200(2001:db8:100::200) 56 data bytes 64 bytes from 2001:db8:100::200: icmp_seq=1 ttl=64 time=3.33 ms 64 bytes from 2001:db8:100::200: icmp_seq=2 ttl=64 time=4.08 ms 64 bytes from 2001:db8:100::200: icmp_seq=3 ttl=64 time=3.96 ms --- 2001:db8:100::200 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 3.328/3.789/4.083/0.337 ms [root@host100 ~]#
次の検証シナリオに備え、トンネルとBGPの設定を削除します。
[vy001:VyOS1.4] delete interfaces vxlan vxlan10 delete interfaces bridge br10 [vy003:VyOS1.4] delete interfaces vxlan vxlan10 delete interfaces bridge br10
動作確認 (2) マルチキャストによるTEP(Tunnel End Point)指定
前述の設定例は、対向のTEP(Tunnel End Point)をstaticに指定しています。VXLANを使用するLEAF/SPINEと呼ばれる構成は大量のLEAFスイッチを管理する事が多く、LEAFスイッチを1台ずつ指定するのは大きな負担増になります。これを回避する方法の1つが、マルチキャストによる対向との通信です。
マルチキャストを使用する場合は、vxlanインターフェースを以下のように作成します。前述の静的な指定との違いは、送信元IPアドレスの明示指定が必要な事と、マルチキャストグループアドレスの指定が必要な事です。
実践では、安定性を考え、VXLANの送信元IPアドレスはLoopbackを使う事例が多いです。しかし、VyOS 1.4ではマルチキャストの不具合のため、やむを得ずeth0やeth1を送信元として指定しています。
[vy001:VyOS1.4] set interfaces vxlan vxlan10 group '239.0.0.10' set interfaces vxlan vxlan10 source-interface 'eth1' set interfaces vxlan vxlan10 vni '10010' [vy003:VyOS1.4] set interfaces vxlan vxlan10 group '239.0.0.10' set interfaces vxlan vxlan10 source-interface 'eth0' set interfaces vxlan vxlan10 vni '10010'
vy001, cisco002, vy003の間でマルチキャストルーティングが可能になるよう設定します。
[cisco002:IOS15.9] ip multicast-routing ! interface GigabitEthernet0/0 ip pim dense-mode ! interface GigabitEthernet0/1 ip pim dense-mode
トンネルが正常に確立されたかどうかを確認します。show interfaces vxlan vxlan10コマンドを実行し、RX, TXともにカウントアップしていれば(0以外の数字であれば)、双方向の通信が正常である事の確認になります。
もし、RX(受信)が0パケットとなっているならば設定を見直しましょう。
[vy001:VyOS1.4] vyos@vy001:~$ show interfaces vxlan vxlan10 vxlan10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether d2:f7:ed:04:ac:57 brd ff:ff:ff:ff:ff:ff inet6 fe80::d0f7:edff:fe04:ac57/64 scope link valid_lft forever preferred_lft forever RX: bytes packets errors dropped overrun mcast 648 7 0 0 0 0 TX: bytes packets errors dropped carrier collisions 648 7 0 0 0 0 vyos@vy001:~$
cisco002のマルチキャストルーティングテーブルを確認し、239.0.0.10を介して、vy001とvy003の間で通信が発生している事を確認します。
[cisco002:IOS15.9] cisco002#show ip mroute IP Multicast Routing Table Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected, L - Local, P - Pruned, R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT, M - MSDP created entry, E - Extranet, X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement, U - URD, I - Received Source Specific Host Report, Z - Multicast Tunnel, z - MDT-data group sender, Y - Joined MDT-data group, y - Sending to MDT-data group, G - Received BGP C-Mroute, g - Sent BGP C-Mroute, N - Received BGP Shared-Tree Prune, n - BGP C-Mroute suppressed, Q - Received BGP S-A Route, q - Sent BGP S-A Route, V - RD & Vector, v - Vector, p - PIM Joins on route, x - VxLAN group Outgoing interface flags: H - Hardware switched, A - Assert winner, p - PIM Join Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 239.0.0.10), 00:02:10/stopped, RP 0.0.0.0, flags: DC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: GigabitEthernet0/1, Forward/Dense, 00:02:04/stopped GigabitEthernet0/0, Forward/Dense, 00:02:10/stopped (192.168.23.3, 239.0.0.10), 00:02:04/00:00:55, flags: T Incoming interface: GigabitEthernet0/1, RPF nbr 0.0.0.0 Outgoing interface list: GigabitEthernet0/0, Forward/Dense, 00:02:04/stopped (192.168.12.1, 239.0.0.10), 00:02:10/00:00:49, flags: T Incoming interface: GigabitEthernet0/0, RPF nbr 0.0.0.0 Outgoing interface list: GigabitEthernet0/1, Forward/Dense, 00:02:04/stopped (*, 224.0.1.40), 01:39:46/00:02:35, RP 0.0.0.0, flags: DCL Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: GigabitEthernet0/0, Forward/Dense, 01:39:46/stopped cisco002#
ブリッジインターフェースを作成し、そのメンバーを定義します。
[vy001:VyOS1.4] set interfaces bridge br10 member interface eth0 set interfaces bridge br10 member interface vxlan10 [vy002:VyOS1.4] set interfaces bridge br10 member interface eth1 set interfaces bridge br10 member interface vxlan10
host100とhost200の間で互いに疎通可能である事を確認します。
[host100:RockyLinux8.4] [root@host100 ~]# ping -c 3 192.168.100.200 PING 192.168.100.200 (192.168.100.200) 56(84) bytes of data. 64 bytes from 192.168.100.200: icmp_seq=1 ttl=64 time=3.74 ms 64 bytes from 192.168.100.200: icmp_seq=2 ttl=64 time=3.38 ms 64 bytes from 192.168.100.200: icmp_seq=3 ttl=64 time=3.37 ms --- 192.168.100.200 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2004ms rtt min/avg/max/mdev = 3.370/3.496/3.742/0.186 ms [root@host100 ~]# [root@host100 ~]# [root@host100 ~]# [root@host100 ~]# ping -c 3 2001:db8:100::200 PING 2001:db8:100::200(2001:db8:100::200) 56 data bytes 64 bytes from 2001:db8:100::200: icmp_seq=1 ttl=64 time=4.32 ms 64 bytes from 2001:db8:100::200: icmp_seq=2 ttl=64 time=4.45 ms 64 bytes from 2001:db8:100::200: icmp_seq=3 ttl=64 time=3.98 ms --- 2001:db8:100::200 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 3.977/4.248/4.447/0.205 ms [root@host100 ~]#
パケットキャプチャの補足説明
Wiresharkでパケットキャプチャすると、VXLANのヘッダ情報が可視化されていません。初期の頃は慣例としてudp port 8472が使用されていましたが、その後、IANAがudp port 4789を割り当てました。
VyOSはデフォルト設定ではudp port 8472が使用されているため、デフォルト設定のWiresharkはこのパケットをデコードしません。
デコードを変更するには、変更したいパケットを選択した状態で、右クリックメニューの「Decode As…」を選びます。
「Current」を「VXLAN」に変更し、「OK」を押下します。
VXLANとしてデコードされ、vni 10010などの情報を読み取れるようになりました。さらに、VXLAN(udp8472)でICMPがカプセル化されている様子も読み取る事ができます。