Vyatta(VyOS) VXLAN(L2トンネル)設定

スポンサーリンク

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で互いに経路を交換しているものとします。

host100 : Rocky Linux 8.4
[root@host100 ~]# ip address 

 <omitted>

3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:8e:96:66 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens224
       valid_lft forever preferred_lft forever
    inet6 2001:db8:100::100/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::8813:7d0:ffd3:2c04/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
host200 : Rocky Linux 8.4
[root@host200 ~]# ip address 

 <omitted>

3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:8e:83:9b brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.200/24 brd 192.168.100.255 scope global noprefixroute ens224
       valid_lft forever preferred_lft forever
    inet6 2001:db8:100::200/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::5fb3:768b:ed49:2f24/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
vy001 : VyOS 1.4
set interfaces ethernet eth0 hw-id '00:50:56:8e:74:ec'
set interfaces ethernet eth1 address '192.168.12.1/24'
set interfaces ethernet eth1 hw-id '00:50:56:8e:3a:92'
set interfaces loopback lo address '10.1.1.1/32'
set protocols ospf area 0 network '192.168.12.0/24'
set protocols ospf area 0 network '10.1.1.1/32'
set service ssh
set system config-management commit-revisions '100'
set system console device ttyS0 speed '115200'
set system host-name 'vy001'
set system login user vyos authentication encrypted-password '$6$tMjC07ln2rEuCnYQ$NrbFEUQTzGprNHwkxo5skkG5h4rX1G6RQxdpo61p3MF77PluwdJgfP9UlYT7f1Nr.gIFKoQdAsKRBykNU24.I/'
set system login user vyos authentication plaintext-password ''
set system ntp server time1.vyos.net
set system ntp server time2.vyos.net
set system ntp server time3.vyos.net
set system syslog global facility all level 'info'
set system syslog global facility protocols level 'debug'
cisco002 : IOS 15.9
version 15.9
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname cisco002
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
mmi polling-interval 60
no mmi auto-configure
no mmi pvc
mmi snmp-timeout 180
!
!
!
!
!
!
!
!
!
!
!
ip cef
no ipv6 cef
!
multilink bundle-name authenticated
!
!
!
!
!
redundancy
!
!
! 
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
 ip address 10.2.2.2 255.255.255.255
!
interface GigabitEthernet0/0
 ip address 192.168.12.2 255.255.255.0
 duplex auto
 speed auto
 media-type rj45
!
interface GigabitEthernet0/1
 ip address 192.168.23.2 255.255.255.0
 duplex auto
 speed auto
 media-type rj45
!
interface GigabitEthernet0/2
 no ip address
 shutdown
 duplex auto
 speed auto
 media-type rj45
!
interface GigabitEthernet0/3
 no ip address
 shutdown
 duplex auto
 speed auto
 media-type rj45
!
router ospf 1
 network 10.2.2.2 0.0.0.0 area 0
 network 192.168.12.0 0.0.0.255 area 0
 network 192.168.23.0 0.0.0.255 area 0
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ipv6 ioam timestamp
!
!
!
control-plane
!
banner exec ^C
**************************************************************************
* IOSv is strictly limited to use for evaluation, demonstration and IOS  *
* education. IOSv is provided as-is and is not supported by Cisco's      *
* Technical Advisory Center. Any use or disclosure, in whole or in part, *
* of the IOSv Software or Documentation to any third party for any       *
* purposes is expressly prohibited except as otherwise authorized by     *
* Cisco in writing.                                                      *
**************************************************************************^C
banner incoming ^C
**************************************************************************
* IOSv is strictly limited to use for evaluation, demonstration and IOS  *
* education. IOSv is provided as-is and is not supported by Cisco's      *
* Technical Advisory Center. Any use or disclosure, in whole or in part, *
* of the IOSv Software or Documentation to any third party for any       *
* purposes is expressly prohibited except as otherwise authorized by     *
* Cisco in writing.                                                      *
**************************************************************************^C
banner login ^C
**************************************************************************
* IOSv is strictly limited to use for evaluation, demonstration and IOS  *
* education. IOSv is provided as-is and is not supported by Cisco's      *
* Technical Advisory Center. Any use or disclosure, in whole or in part, *
* of the IOSv Software or Documentation to any third party for any       *
* purposes is expressly prohibited except as otherwise authorized by     *
* Cisco in writing.                                                      *
**************************************************************************^C
!
line con 0
line aux 0
line vty 0 4
 login
 transport input none
!
no scheduler allocate
!
end
vy003 : VyOS 1.4
set interfaces ethernet eth0 address '192.168.23.3/24'
set interfaces ethernet eth0 hw-id '00:50:56:8e:01:93'
set interfaces ethernet eth1 hw-id '00:50:56:8e:fd:95'
set interfaces loopback lo address '10.3.3.3/32'
set protocols ospf area 0 network '192.168.23.0/24'
set protocols ospf area 0 network '10.3.3.3/32'
set service ssh
set system config-management commit-revisions '100'
set system console device ttyS0 speed '115200'
set system host-name 'vy003'
set system login user vyos authentication encrypted-password '$6$tMjC07ln2rEuCnYQ$NrbFEUQTzGprNHwkxo5skkG5h4rX1G6RQxdpo61p3MF77PluwdJgfP9UlYT7f1Nr.gIFKoQdAsKRBykNU24.I/'
set system login user vyos authentication plaintext-password ''
set system ntp server time1.vyos.net
set system ntp server time2.vyos.net
set system ntp server time3.vyos.net
set system syslog global facility all level 'info'
set system syslog global facility protocols level 'debug'

動作確認 (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はこのパケットをデコードしません。

VyOS vxlanパケット観察 01

デコードを変更するには、変更したいパケットを選択した状態で、右クリックメニューの「Decode As…」を選びます。

VyOS vxlanパケット観察 02

「Current」を「VXLAN」に変更し、「OK」を押下します。

VyOS vxlanパケット観察 03

VXLANとしてデコードされ、vni 10010などの情報を読み取れるようになりました。さらに、VXLAN(udp8472)でICMPがカプセル化されている様子も読み取る事ができます。

VyOS vxlanパケット観察 04

タイトルとURLをコピーしました