シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

検証中にOSPFのロードバランシングでループが発生した話

シナプスの技術部ネットワーク課の福山と申します。

今回シナプスのバックボーン見直しをするにあたって、GNS3で模擬環境を構築してテストをしていたのですが、パケットがループし、到達性が失われるという事象が発生しました。
ループした原因と対策した内容についてご紹介したいと思います。

テスト用の模擬環境

f:id:chamesan:20210125071616p:plain

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

f:id:chamesan:20210125071655p:plain

検証中にループが発生

冗長性に問題がないかテストを実施しました。
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

のいずれかの経路をたどると思われます。

f:id:chamesan:20210125071728p:plain

しかし、そううまくいかないケースがありました。

  • 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によりロードバランシングされます。

www.cisco.com

デフォルトでは宛先単位のロードバランシングです。 次のコマンドを使用して、どのルートに転送されるか確認することができます。

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に転送されるためループします。

f:id:chamesan:20210125071824p:plain

対策

パケット単位のロードバランシングに変更する

インターフェイス コンフィギュレーションモードで以下のコマンドで変更できます。

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 と想定通りの経路になっています。

f:id:chamesan:20210125065618p:plain

おわりに

冗長性のある構成にすることは大事ですが、設計を誤るとループ構成にしてしまう恐れがあります。 今後も、安定したネットワークを構築できるように日々精進してまいります。