シナプスの技術部ネットワーク課の福山と申します。
今回シナプスのバックボーン見直しをするにあたって、GNS3で模擬環境を構築してテストをしていたのですが、パケットがループし、到達性が失われるという事象が発生しました。
ループした原因と対策した内容についてご紹介したいと思います。
テスト用の模擬環境
R1~R6はOSPFでリンク情報を交換しています。 R3とR4はOSPFでデフォルトルートを配布しています。
- R1にデフォルトルートが配布されていることを確認
R1#show ip route <<抜粋>> O*E1 0.0.0.0/0 [110/2] via 172.16.2.10, 00:55:18, GigabitEthernet2/0 [110/2] via 172.16.2.2, 00:55:23, GigabitEthernet1/0
R3とR4はR5,R6とループバックアドレスでIBGPピアしてます。
R3#show ip bgp summary <<抜粋>> BGP router identifier 172.16.0.3, local AS number 65000 Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 172.16.0.5 4 65000 141 138 7 0 0 02:00:15 0 172.16.0.6 4 65000 90 138 7 0 0 02:00:19 1 R4#show ip bgp summary <<抜粋>> BGP router identifier 172.16.0.4, local AS number 65000 Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 172.16.0.5 4 65000 142 133 7 0 0 01:56:00 0 172.16.0.6 4 65000 91 133 7 0 0 01:56:04 1
R6はR8とEBGPピアしています。
R6#show ip bgp summary <<抜粋>> BGP router identifier 172.16.0.6, local AS number 65000 Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 10.0.2.2 4 65002 101 59 10 0 0 00:47:54 1 172.16.0.3 4 65000 141 92 10 0 0 01:18:49 1 172.16.0.4 4 65000 136 92 10 0 0 01:18:50 1
以上、今回のテスト環境の簡単な説明ですが、なぜこのような環境でテストしたかは諸事情ありまして説明は省かせていただきます。
PC1からPC2,PC3,PC4への通信
R8がPC2,PC3,PC4の経路情報(192.168.1.0/24)をR6に広報しています。
R8#show ip bgp neighbors 10.0.2.1 advertised-routes <<抜粋>> Network Next Hop Metric LocPrf Weight Path *> 192.168.1.0 0.0.0.0 0 32768 i Total number of prefixes 1
R3とR4がR6からPC2,PC3,PC4の経路情報(192.168.1.0/24)を受け取っています。
R3#show ip bgp neighbors 172.16.0.6 received-routes <<抜粋>> Network Next Hop Metric LocPrf Weight Path *>i 192.168.1.0 172.16.0.6 0 100 0 65002 i Total number of prefixes 1 R4#show ip bgp neighbors 172.16.0.6 received-routes <<抜粋>> Network Next Hop Metric LocPrf Weight Path *>i 192.168.1.0 172.16.0.6 0 100 0 65002 i Total number of prefixes 1
よってPC1からPC2,PC3,PC4への通信は以下の経路となります。
PC1 -> R1 -> デフォルトルートでR3 -> BGPでR6 -> R8 -> PC2,PC3,PC4 または PC1 -> R1 -> デフォルトルートでR4 -> BGPでR6 -> R8 -> PC2,PC3,PC4
検証中にループが発生
冗長性に問題がないかテストを実施しました。
R4-R6間のリンクをダウンさせます。
PC1からPC2,PC3,PC4への通信は
PC1 -> R1 -> デフォルトルートでR4 -> BGPでR6 -> R8 -> PC2,PC3,PC4
の経路であっても、R4とR6はループバックアドレスでピアしているのでBGPはダウンしていません。
R4#show ip bgp summary BGP router identifier 172.16.0.4, local AS number 65000 <<抜粋>> Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 172.16.0.5 4 65000 182 176 7 0 0 02:34:38 0 172.16.0.6 4 65000 132 176 7 0 0 02:34:42 1
R4はR6のループバックアドレス(172.16.0.6)をOSPFで知っており、等コストになっています。
R4#show ip route 172.16.0.6 Routing entry for 172.16.0.6/32 Known via "ospf 1", distance 110, metric 4, type intra area Last update from 172.16.2.5 on GigabitEthernet1/0, 00:01:07 ago Routing Descriptor Blocks: * 172.16.2.30, from 172.16.0.6, 00:01:07 ago, via GigabitEthernet4/0 Route metric is 4, traffic share count is 1 172.16.2.9, from 172.16.0.6, 00:01:07 ago, via GigabitEthernet2/0 Route metric is 4, traffic share count is 1 172.16.2.5, from 172.16.0.6, 00:01:07 ago, via GigabitEthernet1/0 Route metric is 4, traffic share count is 1
よって
R4 -> R5 -> R3 -> R6 R4 -> R1 -> R3 -> R6 R4 -> R2 -> R3 -> R6
のいずれかの経路をたどると思われます。
しかし、そううまくいかないケースがありました。
- PC1からPC2,PC3,PC4にPing確認
PC1> ping 192.168.1.2 84 bytes from 192.168.1.2 icmp_seq=1 ttl=60 time=43.961 ms 84 bytes from 192.168.1.2 icmp_seq=2 ttl=60 time=55.265 ms 84 bytes from 192.168.1.2 icmp_seq=3 ttl=60 time=55.250 ms 84 bytes from 192.168.1.2 icmp_seq=4 ttl=60 time=54.884 ms 84 bytes from 192.168.1.2 icmp_seq=5 ttl=60 time=54.734 ms PC1> ping 192.168.1.3 84 bytes from 192.168.1.3 icmp_seq=1 ttl=60 time=40.919 ms 84 bytes from 192.168.1.3 icmp_seq=2 ttl=60 time=45.459 ms 84 bytes from 192.168.1.3 icmp_seq=3 ttl=60 time=45.477 ms 84 bytes from 192.168.1.3 icmp_seq=4 ttl=60 time=45.229 ms 84 bytes from 192.168.1.3 icmp_seq=5 ttl=60 time=45.520 ms PC1> ping 192.168.1.4 *172.16.2.6 icmp_seq=1 ttl=254 time=327.062 ms (ICMP type:11, code:0, TTL expired in transit) *172.16.2.6 icmp_seq=2 ttl=254 time=338.323 ms (ICMP type:11, code:0, TTL expired in transit) *172.16.2.6 icmp_seq=3 ttl=254 time=338.107 ms (ICMP type:11, code:0, TTL expired in transit) *172.16.2.6 icmp_seq=4 ttl=254 time=337.709 ms (ICMP type:11, code:0, TTL expired in transit) *172.16.2.6 icmp_seq=5 ttl=254 time=326.798 ms (ICMP type:11, code:0, TTL expired in transit)
PC1からPC4(192.168.1.4)にだけ疎通がとれなくなりました。
- PC1からPC2,PC3,PC4にトレースルート確認
※GNS3でVPCSからのトレースルートの「-P 6」はTCPを表しています。
PC1> trace 192.168.1.2 -P 6 trace to 192.168.1.2, 8 hops max (TCP), press Ctrl+C to stop 1 172.16.1.254 11.014 ms 9.217 ms 9.641 ms 2 172.16.2.10 19.146 ms 20.131 ms 19.209 ms 3 172.16.2.5 29.274 ms 19.941 ms 19.970 ms 4 172.16.2.14 19.124 ms 19.265 ms 19.355 ms 5 172.16.2.26 30.028 ms 29.755 ms 30.042 ms 6 10.0.2.2 39.791 ms 39.765 ms 40.080 ms 7 192.168.1.2 60.207 ms 49.680 ms 49.593 ms PC1> trace 192.168.1.3 -P 6 trace to 192.168.1.3, 8 hops max (TCP), press Ctrl+C to stop 1 172.16.1.254 10.145 ms 9.739 ms 9.180 ms 2 172.16.2.2 19.789 ms 19.749 ms 19.767 ms 3 172.16.2.26 29.737 ms 30.153 ms 29.619 ms 4 10.0.2.2 40.260 ms 39.517 ms 40.306 ms 5 192.168.1.3 50.122 ms 59.351 ms 49.721 ms PC1> trace 192.168.1.4 -P 6 trace to 192.168.1.4, 8 hops max (TCP), press Ctrl+C to stop 1 172.16.1.254 5.570 ms 9.331 ms 9.898 ms 2 172.16.2.10 19.424 ms 19.352 ms 19.268 ms 3 172.16.2.5 29.253 ms 30.050 ms 29.636 ms 4 172.16.2.6 29.292 ms 30.499 ms 30.163 ms 5 172.16.2.5 39.935 ms 39.264 ms 39.902 ms 6 172.16.2.6 39.641 ms 40.084 ms 40.202 ms 7 172.16.2.5 49.239 ms 49.436 ms 49.536 ms 8 172.16.2.6 49.668 ms 49.551 ms 50.363 ms
PC1からPC4向けは
R1 → R4 → R2 → R4 → R2 ・・・ とループしています。
OSPFとCEFによるロードバランシング
OSPFにてECMP(Equal Cost Multi Path)となっている経路へのパケット転送は、CEFによりロードバランシングされます。
デフォルトでは宛先単位のロードバランシングです。 次のコマンドを使用して、どのルートに転送されるか確認することができます。
show ip cef exact-route {source-ip-address} {dest-ip-address}
- R1でPC1からPC4宛てはどのルートに転送されるか確認
R1#show ip cef exact-route 172.16.1.1 192.168.1.4 172.16.1.1 -> 192.168.1.4 => IP adj out of GigabitEthernet2/0, addr 172.16.2.10
R4に転送されています。
- R4でPC1からPC4宛てはどのルートに転送されるか確認
R4#show ip cef exact-route 172.16.1.1 192.168.1.4 172.16.1.1 -> 192.168.1.4 => IP adj out of GigabitEthernet1/0, addr 172.16.2.5
R2に転送されています。
R2からR3,R4宛てもOSPFで等コストになっています。
- R2でPC1からPC4宛てはどのルートに転送されるか確認
R2#show ip cef exact-route 172.16.1.1 192.168.1.4 172.16.1.1 -> 192.168.1.4 => IP adj out of GigabitEthernet1/0, addr 172.16.2.6
R4に転送されるためループします。
対策
パケット単位のロードバランシングに変更する
インターフェイス コンフィギュレーションモードで以下のコマンドで変更できます。
ip load-sharing per-packet
ですが、順序どおりに宛先に到達することに依存するパケットを転送する場合は 好ましくないと思われます。
R3-R4間を接続する
R3-R4間を接続し、OSPFの設定をします。
すると、R4からR6への経路は
R4#show ip route 172.16.0.6 Routing entry for 172.16.0.6/32 Known via "ospf 1", distance 110, metric 3, type intra area Last update from 172.16.2.33 on GigabitEthernet5/0, 00:00:19 ago Routing Descriptor Blocks: * 172.16.2.33, from 172.16.0.6, 00:00:19 ago, via GigabitEthernet5/0 Route metric is 3, traffic share count is 1
R4 → R3 → R6
が最短コストとなり、ループを回避できます。
- PC1からPC4にPing確認
PC1> ping 192.168.1.4 84 bytes from 192.168.1.4 icmp_seq=1 ttl=60 time=56.416 ms 84 bytes from 192.168.1.4 icmp_seq=2 ttl=60 time=55.600 ms 84 bytes from 192.168.1.4 icmp_seq=3 ttl=60 time=45.527 ms 84 bytes from 192.168.1.4 icmp_seq=4 ttl=60 time=46.231 ms 84 bytes from 192.168.1.4 icmp_seq=5 ttl=60 time=54.954 ms
PC1からPC4(192.168.1.4)に疎通がとれるようになりました。
- PC1からPC4にトレースルート確認
PC1> trace 192.168.1.4 -P 6 trace to 192.168.1.4, 8 hops max (TCP), press Ctrl+C to stop 1 172.16.1.254 7.163 ms 9.817 ms 9.203 ms 2 172.16.2.10 19.678 ms 19.724 ms 19.881 ms 3 172.16.2.33 30.137 ms 29.743 ms 29.326 ms 4 172.16.2.26 39.208 ms 39.358 ms 39.566 ms 5 10.0.2.2 50.041 ms 49.836 ms 49.548 ms 6 192.168.1.4 59.727 ms 59.395 ms 60.496 ms
R1 → R4 → R3 → R6 → R8 と想定通りの経路になっています。
おわりに
冗長性のある構成にすることは大事ですが、設計を誤るとループ構成にしてしまう恐れがあります。 今後も、安定したネットワークを構築できるように日々精進してまいります。