JANOG57 NETCON Level3-11 問題解説
問題文

あなたは、4台のLeafスイッチと2台のSpineスイッチで構成されるEVPN/VXLANファブリックの構築作業をしています。各Leafの下には、サーバー(SV-01~04)が接続されています。
今回、異なるLeaf配下にあるサーバー間(L3セグメントを跨ぐ通信)の疎通確認を行ったところ、特定のサーバー間で通信ができない、あるいは不安定であるという報告を受けました。
報告内容としては、SV-01からSV-02へpingを打っているときはpingが通らないのに、その後にSV-02からSV-01へ打つとpingが通る。もしくは同じセグメントのServerに通信をしてからだと異なるセグメントのServerに通信ができると言ったものでした。さらに、Anycast Gatewayの設定をしているはずなのに一部でMACアドレスが意図したものでないことも判明しました。
原因を特定して、安定したネットワーク環境を提供してください。
特定のサーバー間で通信ができない、あるいは不安定であるという報告を受けましたこの環境を再現するために以下の注意点に従ってください。
注意点: clear mac address-table dynamicをServerからpingを打つ前に全てのLeafに入れてください
達成条件
- SV-01からSV-02,04へのpingが他の通信を行わずに通ること
- SV-01からSV-03へのpingの後にSV-01からSV-02へのpingが通ったとしても認めません
- 全てのサーバのGWの宛先MACアドレスが同一であること
制約
- Static Routeを設定するのは禁止です。
解説
この問題では、以下の2つの設定ミスにより問題が起こっています。
- RDの設定場所が間違っていたことによる経路広告が期待通りに行われていない
-
ip address virtualにするところをip addressとして設定しまいip virtual-router mac-address aa:bb:cc:00:02:54で設定したMACアドレスが反映されていない
まずは、解決方法が簡単なAnycast GatewayのMACアドレスが一致していない問題から解決していきたいと思います。
そもそもAnycast Gatewayがわからないという方は、EVPN/VXLAN -座学編-をみてください。
簡単にいうとGatewayのMACアドレスを全て合わせておいてくださいね、ということです。一部でMACアドレスが意図していないものと問題文中にあるので、意図しているものと意図していないものを見つけるためにGWへのpingを行い、MACアドレスを見ていきたいと思います。意図しているMACアドレスはaa:bb:cc:00:02:54になります。
SV-01:~# ping -c 3 192.168.10.254
PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data.
64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=6.29 ms
64 bytes from 192.168.10.254: icmp_seq=2 ttl=64 time=1.27 ms
64 bytes from 192.168.10.254: icmp_seq=3 ttl=64 time=1.09 ms
--- 192.168.10.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.088/2.881/6.288/2.409 ms
SV-01:~# ip n
192.168.10.254 dev eth1 lladdr aa:bb:cc:00:02:54 STALE
SV-02:~# ping -c 3 192.168.20.254
PING 192.168.20.254 (192.168.20.254) 56(84) bytes of data.
64 bytes from 192.168.20.254: icmp_seq=1 ttl=64 time=1.87 ms
64 bytes from 192.168.20.254: icmp_seq=2 ttl=64 time=1.14 ms
64 bytes from 192.168.20.254: icmp_seq=3 ttl=64 time=1.18 ms
--- 192.168.20.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.144/1.398/1.868/0.332 ms
SV-02:~# ip n
192.168.20.254 dev eth1 lladdr aa:bb:cc:00:02:54 REACHABLE
SV-03:~# ping -c 3 192.168.10.254
PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data.
64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=2.30 ms
64 bytes from 192.168.10.254: icmp_seq=2 ttl=64 time=1.20 ms
64 bytes from 192.168.10.254: icmp_seq=3 ttl=64 time=1.13 ms
--- 192.168.10.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.132/1.544/2.300/0.535 ms
SV-03:~# ip n
192.168.10.254 dev eth1 lladdr 00:1c:73:9a:cf:13 STALE
SV-04:~# ping -c 3 192.168.20.254
PING 192.168.20.254 (192.168.20.254) 56(84) bytes of data.
64 bytes from 192.168.20.254: icmp_seq=1 ttl=64 time=2.37 ms
64 bytes from 192.168.20.254: icmp_seq=2 ttl=64 time=1.31 ms
64 bytes from 192.168.20.254: icmp_seq=3 ttl=64 time=1.12 ms
--- 192.168.20.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.122/1.601/2.374/0.551 ms
SV-04:~# ip n
192.168.20.254 dev eth1 lladdr aa:bb:cc:00:02:54 REACHABLE
SV-03のGWのMACアドレスだけが意図していないものになっていることを確認できました。SV-03に接続しているRT-L-03について設定が不足していると考えられます。
RT-L-03とRT-L-01の設定を見比べてみるとハイライトされている部分のような設定の差異があります。
RT-L-01
interface Vlan10
vrf l3vni-3000
+ ip address virtual 192.168.10.254/24
RT-L-03
interface Vlan10
vrf l3vni-3000
+ ip address 192.168.10.254/24
GWのIPアドレスの設定時にvirtualという単語が抜けていたようです。ちなみにMACアドレスの設定は、ip virtual-router mac-address aa:bb:cc:00:02:54です。
では、設定を修正して確認してみましょう。
RT-L-03#conf t
RT-L-03(config)#interface Vlan 10
RT-L-03(config-if-Vl10)#no ip address 192.168.10.254/24
RT-L-03(config-if-Vl10)#ip address virtual 192.168.10.254/24
SV-03:~# ip n flush 192.168.10.254
SV-03:~# ping -c 3 192.168.10.254
PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data.
64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=2.33 ms
64 bytes from 192.168.10.254: icmp_seq=2 ttl=64 time=1.02 ms
64 bytes from 192.168.10.254: icmp_seq=3 ttl=64 time=1.17 ms
--- 192.168.10.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.021/1.505/2.327/0.583 ms
SV-03:~# ip n
192.168.10.254 dev eth1 lladdr aa:bb:cc:00:02:54 REACHABLE
MACアドレスが意図したものになっていることを確認できました。
では、次の問題であるRDの設定場所が間違っていたことによる経路広告が期待通りに行われていないについて考えていきたいと思います。
まず問題文中にあるようにSV-01からSV-02へpingを打っているときはpingが通らないのに、その後にSV-02からSV-01へ打つとpingが通るという事象を確かめようと思います。
**その前に注意点に従うようにclear mac address-table dynamic**を全てのLeafで入力しておいてください。
SV-01:~# ping -c 3 192.168.20.2
PING 192.168.20.2 (192.168.20.2) 56(84) bytes of data.
From 192.168.10.254 icmp_seq=1 Destination Net Unreachable
From 192.168.10.254 icmp_seq=3 Destination Net Unreachable
--- 192.168.20.2 ping statistics ---
3 packets transmitted, 0 received, +2 errors, 100% packet loss, time 2003ms
SV-02:~# ping -c 3 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=2 ttl=62 time=4.31 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=62 time=7.70 ms
--- 192.168.10.1 ping statistics ---
3 packets transmitted, 2 received, 33.3333% packet loss, time 2039ms
rtt min/avg/max/mdev = 4.305/6.001/7.698/1.696 ms
問題文の通り、SV-01からSV-02へのpingは繋がりませんでしたが、その後SV-02からSV-01へpingを打つと通信ができました。同じネットワークのSV-03には繋がることから、L3VPNがうまくおらずに異なるネットワークへの通信が不安定だと考えることができると思いますし、Destination Net Unreachableとあることからもわかると思います。
確かめる情報としては、サーバとL3VPNのためのVRFのルーティングテーブルだと思います。
SV-01:~# ip r
default via 192.168.10.254 dev eth1
172.20.20.0/24 dev eth0 proto kernel scope link src 172.20.20.2
192.168.10.0/24 dev eth1 proto kernel scope link src 192.168.10.1
RT-L-01#show ip route vrf l3vni-3000
C 192.168.10.0/24
directly connected, Vlan10
B E 192.168.20.2/32 [200/0]
via VTEP 10.1.254.22 VNI 3000 router-mac 00:1c:73:f9:9f:88 local-interface Vxlan1
SV-02:~# ip r
default via 192.168.20.254 dev eth1
172.20.20.0/24 dev eth0 proto kernel scope link src 172.20.20.3
192.168.20.0/24 dev eth1 proto kernel scope link src 192.168.20.2
RT-L-02#show ip route vrf l3vni-3000
B E 192.168.10.1/32 [200/0]
via VTEP 10.1.254.21 VNI 3000 router-mac 00:1c:73:23:d6:c8 local-interface Vxlan1
C 192.168.20.0/24
directly connected, Vlan20
Serverのデフォルトゲートはちゃんと設定されていますね。ルーティングテーブルの方はBGPでそれぞれのServerのホストルートを受け取っています。ホストルートが広報されているのにSV-01からの通信が上手くいかないのは不思議です。
一旦、注意点にあるようにMACアドレステーブルをクリアした状態で経路がどのようになっているのかを確認したいと思います。
RT-L-01#clear mac address-table dynamic
RT-L-01#show ip route vrf l3vni-3000
C 192.168.10.0/24
directly connected, Vlan10
MACアドレステーブルをクリアすると、SV-02へのホストルートが消えていますね。RT-L-02も同様にSV-01のホストルートは消えていると思います。
このことから初期状態では、ホストルートの経路はBGPで広報されていないことがわかると思います。
次にSV-01からSV-02へpingを打った後のルーティングテーブルを見てみます。
RT-L-01#show ip route vrf l3vni-3000
C 192.168.10.0/24
directly connected, Vlan10
RT-L-02#show ip route vrf l3vni-3000
B E 192.168.10.1/32 [200/0]
via VTEP 10.1.254.21 VNI 3000 router-mac 00:1c:73:23:d6:c8 local-interface Vxlan1
C 192.168.20.0/24
directly connected, Vlan20
SV-01からSV-02宛にpingを打った後だと、RT-L-02の方にSV-01へのホストルートが現れます。RT-L-01の方は変わりないです。ということは、次にSV-02からpingを打った時にはSV-01まで行きのパケットが届くと共にSV-02へのホストルートが広報されてRT-L-01が受信されてSV-01からの返りのパケットがSV-02へ届くことにより通信が可能になります。
このことから、pingを打つとEVPNによってホストルートへの経路が広報されていることが想像できると思います。EVPNの動作的にpingを打つことによってVTEPにMAC/IPアドレスが学習されてEVPNによって広報されるということになっていると考えることができます。
しかし、お互いにpingを打ってから出ないと通信ができないというのは、あまりにも非実用的すぎます。理想としては、すぐに異なるネットワークのホスト間(例えばSV-01とSV-02の間)で通信ができることです。つまりpingを打つ前にEVPNでL3VPNの経路情報が広報されているということです。
そう考えるとRT-L-01,02のルーティングテーブルでConnected経路しかないのが非常に気になり、192.168.10.0/24などの経路がEVPN(BGP)が最初から現れているのが理想です。
ちょっと設定を見てみましょう。
RT-L-01
vrf instance l3vni-3000
rd 3000:30
!
router bgp 65201
neighbor EVPN peer group
neighbor EVPN remote-as 65100
neighbor EVPN update-source Loopback0
neighbor EVPN ebgp-multihop
neighbor EVPN send-community extended
neighbor 10.1.254.11 peer group EVPN
neighbor 10.1.254.12 peer group EVPN
!
address-family evpn
neighbor EVPN activate
!
address-family ipv4
neighbor SPINE activate
neighbor SPINE route-map ACCEPT_PREFIX_LOOPBACK in
neighbor SPINE route-map ACCEPT_PREFIX_LOOPBACK out
neighbor SPINE next-hop address-family ipv6 originate
network 10.1.254.21/32
!
vrf l3vni-3000
router-id 10.1.254.21
bgp bestpath as-path multipath-relax
route-target import evpn 3000:30
route-target export evpn 3000:30
redistribute connected
!
redistribute connectedがあるので、RT-L-01なら192.168.10.0/24が広報されるはずですが、ルーティングテーブルの状態を考えるに正しく広報されていないようです。L3VPNの経路について考えるとRoute Distinguisher(RD)とRoute Target(RT)があるかと思います。コンフィグを見る限りは設定されているようですが、EVPNの状態を確認していきたいと思います。
RT-L-01#show bgp evpn detail | include Route Distinguisher
BGP routing table entry for mac-ip aabb.cc10.1001, Route Distinguisher: 10.1.254.21:1010
BGP routing table entry for mac-ip aabb.cc10.1003, Route Distinguisher: 10.1.254.23:1010
BGP routing table entry for mac-ip aabb.cc10.2002, Route Distinguisher: 10.1.254.22:1020
BGP routing table entry for mac-ip aabb.cc10.2004, Route Distinguisher: 10.1.254.24:1020
BGP routing table entry for imet 10.1.254.21, Route Distinguisher: 10.1.254.21:1010
BGP routing table entry for imet 10.1.254.22, Route Distinguisher: 10.1.254.22:1020
BGP routing table entry for imet 10.1.254.23, Route Distinguisher: 10.1.254.23:1010
BGP routing table entry for imet 10.1.254.24, Route Distinguisher: 10.1.254.24:1020
Route Distinguisher: 3000:30のEVPNの経路が見当たりません。L3VPNの設定は、router bgp vrf l3vni-3000にroute-targetの設定があり、vrf instance l3vni-3000に設定されてはいます。
これは、vrf instance l3vni-3000の方が引っ掛けで、BGP vrf l3vni-3000の方にRDの設定がないとEVPN Route Type5のIP-PREFIXとしてVPN経路を生成して広報をしてくれません。なのでrouter bgp vrf l3vni-3000の方にrd 3000:30を設定する必要があります。
router bgp 65201
address-family ipv4
!
vrf l3vni-3000
router-id 10.1.254.21
bgp bestpath as-path multipath-relax
+ rd 3000:30
route-target import evpn 3000:30
route-target export evpn 3000:30
redistribute connected
rd 3000:30の設定を入れてみました。この設定を全てのLeafに追加した後のルーティングテーブルとEVPNの状態を見てみましょう。
RT-L-01#show ip route vrf l3vni-3000
C 192.168.10.0/24
directly connected, Vlan10
B E 192.168.20.0/24 [200/0]
via VTEP 10.1.254.22 VNI 3000 router-mac 00:1c:73:f9:9f:88 local-interface Vxlan1
RT-L-02#show ip route vrf l3vni-3000
B E 192.168.10.0/24 [200/0]
via VTEP 10.1.254.21 VNI 3000 router-mac 00:1c:73:23:d6:c8 local-interface Vxlan1
C 192.168.20.0/24
directly connected, Vlan20
RT-L-01#show bgp evpn detail | include Route Distinguisher
BGP routing table entry for mac-ip aabb.cc10.1001, Route Distinguisher: 10.1.254.21:1010
BGP routing table entry for mac-ip aabb.cc10.2004, Route Distinguisher: 10.1.254.24:1020
BGP routing table entry for imet 10.1.254.21, Route Distinguisher: 10.1.254.21:1010
BGP routing table entry for imet 10.1.254.22, Route Distinguisher: 10.1.254.22:1020
BGP routing table entry for imet 10.1.254.23, Route Distinguisher: 10.1.254.23:1010
BGP routing table entry for imet 10.1.254.24, Route Distinguisher: 10.1.254.24:1020
BGP routing table entry for ip-prefix 192.168.10.0/24, Route Distinguisher: 3000:30
BGP routing table entry for ip-prefix 192.168.20.0/24, Route Distinguisher: 3000:30
192.168.10.0/24と192.168.20.0/24の経路が現れてくれました。この経路はEVPN Route Type5(IP-Prefix)によって広報されている経路になります。show bgp evpn route-type ip-prefixによって確認することもできます。
192.168.10.0/24と192.168.20.0/24の経路によってSV-01,02のホストルートが初期状態で存在しなくても、それぞれのネットワークに所属しているVTEPの元にパケットが飛んでいってくれる仕組みにより通信が可能になります。
では、ホストルートがない状態で本当にSV-01からSV-02への通信が飛ぶのかを確かめてみましょう。
SV-01:~# ping -c 3 192.168.20.2
PING 192.168.20.2 (192.168.20.2) 56(84) bytes of data.
64 bytes from 192.168.20.2: icmp_seq=1 ttl=62 time=9.58 ms
64 bytes from 192.168.20.2: icmp_seq=2 ttl=62 time=5.61 ms
64 bytes from 192.168.20.2: icmp_seq=3 ttl=62 time=7.05 ms
--- 192.168.20.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 5.605/7.411/9.576/1.640 ms
ちゃんと届いてますね。次はルーティングテーブルも見てみましょう。
RT-L-01#show ip route vrf l3vni-3000
C 192.168.10.0/24
directly connected, Vlan10
B E 192.168.20.2/32 [200/0]
via VTEP 10.1.254.22 VNI 3000 router-mac 00:1c:73:f9:9f:88 local-interface Vxlan1
B E 192.168.20.0/24 [200/0]
via VTEP 10.1.254.22 VNI 3000 router-mac 00:1c:73:f9:9f:88 local-interface Vxlan1
RT-L-02#show ip route vrf l3vni-3000
B E 192.168.10.1/32 [200/0]
via VTEP 10.1.254.21 VNI 3000 router-mac 00:1c:73:23:d6:c8 local-interface Vxlan1
B E 192.168.10.0/24 [200/0]
via VTEP 10.1.254.21 VNI 3000 router-mac 00:1c:73:23:d6:c8 local-interface Vxlan1
C 192.168.20.0/24
directly connected, Vlan20
SV-01からしかpingを打っていないのに、SV-01,02の両方のホストルートが広報されていますね。
SV-01から異なるネットワークのSV-02,04のすべてにpingが通ることが確認できると思うので、この問題の解決は以上になります。
いきなりEVPNVXLANの話をされて、あまり挙動がわかっていない中で私の説明も十分ではなく、理解はできないとはと思いますのでここからEVPN/VXLANの勉強を進めてくれると個人的に嬉しいです。
Discussion