CiscoのACLでtracerouteを許可する

CiscoのACLでtracerouteを許可するポリシーで少しハマったのでメモ。

結論から言うと、ICMP応答メッセージの「Port Unreachable」を許可するポリシーを入れて解決しました。
以下、詳細。

そもそもtracerouteの仕組みとは?
tracerouteでは「TTL」の値を利用します。TTLはルータを経由すると値が1つ減ります。TTLが0になったら、ルータは送信元に対してなんらかのICMPメッセージを返します。
この特性を利用して。。。

1.まずは宛先ホストに対して、TTLを「1」にセットしたパケットを送ります。
2.すると最初のネクストホップのルータがTTLを1つ減らすので「0」にります。
3.TTLが「0」になったら、ルータは「Time Exceeded」メッセージを返します。「Time Exceeded」は「TTLが途中で0になったからパケットを破棄しました」という意味になります。
4.「Time Exceeded」メッセージには、メッセージを返したルータのIPが含まれているので、送信元ホストはそのIPを記憶します。
5.今度はTTLを「2」にセットして宛先ホストに送信します。
6.すると2つ先のルータでTTLが「0」になり、「Time Exceeded」メッセージが返されます。
7.「Time Exceeded」メッセージに含まれる2つ目のルータのIPを記憶します
8.宛先ホストに到達するまでTTLを1つずつ増やしながらパケットを送信し続けます。
9.宛先ホストにパケットが到達したら、宛先ホストは「Echo Reply」もしくは「Port Unreachable」メッセージを送って、パケットを受け取ったことを知らせます。

つまり、CiscoのACLでtracerouteを許可するには「Time Exceeded」、「Echo Reply」、「Port Unreachable」の3種類のICMP応答メッセージを許可するポリシーを入れる必要があります。
私の場合は「Time Exceeded」と「Echo Reply」は許可していたのですが、「Port Unreachable」を許可していなかったので最後の宛先ホストからのICMP応答メッセージを受け取れていませんでした。

以下のような感じでACLを入れました。

permit icmp [source] [destination] echo-reply
permit icmp [source] [destination] time-exceeded
permit icmp [source] [destination] port-unreachable

※宛先のネットワークでICMP応答メッセージを返さないようなフィルタリングがされていれば、当然応答はありません。

tracerouteの解説は以下のリンクが分かりやすいです。↓
http://www5e.biglobe.ne.jp/%257eaji/3min/36.html
http://atnetwork.info/tcpip/tcpip89.html

以上

Leave a Reply

Your email address will not be published. Required fields are marked *