パケットの送信元に適切なルーティング経路を通知するICMP Redirectの動きについて記載します。
下記のネットワーク構成で検証します。異なるセグメント間をルータを挟んでMac端末からUbuntu端末へPing疎通を行います。
往きのパケットはYamahaルータを経由しますが、帰りのパケットは経由しないので、非対称ルーティングが発生します。
その際に、YamahaルータからICMP redirectが送信元に送られ、送信元のルーティングテーブルに最適ルートが登録されることで非対称ルーティングが矯正されるかを検証します。検証の結果、矯正はされませんでした。
構成図
Mac端末のデフォルトゲートウェイはYamahルータ、Ubuntu端末のデフォルトゲートウェイはCiscoルータに設定しています。
パケットの流れ
Mac端末からUbuntu端末へPing疎通を行う際のMACアドレスの向き(A > B)になります
- echo-request(Mac > Yamaha)1回目
- ICMP-redirect(Yamaha > Mac)
- echo-request(Yamaha > Cisco)
- echo-reply(Cisco > Mac)
- echo-request(Mac > Yamaha)2回目
- echo-request(Yamaha > Cisco)
- echo-reply(Cisco > Mac)
1.echo request(Mac > Yamaha)
Mac端末のデフォルトゲートウェイはYamahaルータになっています。
2.ICMP Redirect(Yamaha > Mac)
Yamahaルータは適切なネクストホップであるCiscoルータのIPを通知します。
赤枠が実際のICMP Redirectパケットです
3.echo request(Yamaha > Cisco)
Yamahaルータには192.168.8.0/24へのStatic routeを設定しています
4.echo reply(Cisco > Mac)
Ubuntu端末からMac端末にreplyが返されます。行きと帰りで異経路になり、非対称ルーティングが発生します
5.echo request(Mac > Yamaha)
適したルートがMac端末に追加されて、下図のように直接Ciscoルータへパケットを送り、非対称ルーティングが解消されると思いましたが、変わらずMacからYamahaへICMP echoが投げられていました。Mac OSはセキュリティの観点から、ICMP Redirectをデフォルトで無視して最適ルートをルーティングテーブルに登録しない可能性があり、実際に登録されていませんでした。送信元やルータを変えても同じ挙動か検証してみます
Mac端末のルーティングテーブル
% netstat -nr | grep 192
default 192.168.9.254 UGScg en6
192.168.9 link#24 UCS en6 !
192.168.9.1/32 link#24 UCS en6 !
192.168.9.254/32 link#24 UCS en6 !
192.168.9.254 0:a0:de:c0:b9:e UHLWIir en6 1198
MacとUbuntuの位置を入れ替えて疎通テスト
以下のようにIPを入れ替えて、UbuntuからMacへPing疎通を行います
Ubuntu(192.168.8.1 → 192.168.9.1に変更)
Mac(192.168.9.1 → 192.168.8.1に変更)
ICMP Redirectで、最適ルートのCiscoルータのIPが、YamahaルータからUbuntu端末へ通知されていました。
その後、Ubuntu端末からBroadcastでARP解決が行われており、Ciscoルータが応答して自身のMACアドレスを通知しています。
しかし、Ubuntuのルーティングテーブルには登録されず、echo-requestは再びYamahaルータへ送信されていました。
ICMP Redirectで登録されるルートは、デフォルトゲートウェイよりもメトリックが高くない?のか、OSの仕様で無視してる可能性があります。
Fortigateの非対称ルーティング拒否設定
Fortigateのデフォルト設定では、非対称ルーティングにより、往きまたは帰りのパケットのどちらかがFortigateを通らない場合にブロックします(set asymroute disable)。ICMP Redirectでルートの矯正が行われる場合はFortigateがブロックすることはありませんが、そうならない場合はブロックされることになります。通信できない際に切り分けした結果、この機能が原因の場合があるようです。
FGT60C3G12028266 (vdom) # edit root
current vf=root:0
FGT60C3G12028266 (root) #
FGT60C3G12028266 (root) # config system settings
FGT60C3G12028266 (settings) #
FGT60C3G12028266 (settings) # show
config system settings
set opmode transparent
set manageip 192.168.9.7/255.255.255.0
end
FGT60C3G12028266 (settings) #
FGT60C3G12028266 (settings) #
FGT60C3G12028266 (settings) # set asymroute
enable Enable asymmetric route.
disable Disable asymmetric route.
FGT60C3G12028266 (settings) #
|
|
|
|
|
|
|
|
|
|
|