designetwork

ネットワークを軸としたIT技術メモ

Cisco ASAインターネットNAPT越しtraceroute設定

Cisco ASAをNATルータとして使用している環境でtracerouteを正常に動作させるためにはいくつかの設定が必要となる。
インターネット接続部分でNAPT、inspect、ACL、policy-mapといった各種設定を見直したためメモ。

Cisco, Linuxのtracerouteの仕組み、違い、FW通過させる設定はこちら。
Cisco,LinuxのtracerouteをFWで許可(通過)する - designetwork

前提条件

ネットワーク構成

Cisco ASAでフレッツとPPPoE(DynamicIP)接続。
インターネット通信はSrcNAPT(PAT)、DstNATなし。

セキュリティレベル
 inside(management):SecLevel 100
 outside(internet) :SecLevel 0

Access Rules
 inside -> outside : no access rules(SecLevel permission)
 outside -> inside : deny any

使用バージョン

Cisco ASA :9.2(3) Cisco ADSM:7.2(1)

ASAでtracerouteを通過させる設定

私の環境では次のような変更を実施した。
before/after項目を示すためDFの比較結果を記載する。

!
       |                                                  ||00084 R|object-group icmp-type DM_INLINE_ICMP_1           
       |                                                  ||00085 R| icmp-object time-exceeded                        
       |                                                  ||00086 R| icmp-object unreachable                          
!
00084  |access-list Web extended permit tcp any any eq www||00089  |access-list Web extended permit tcp any any eq www
       |                                                  ||00090 R|access-list Web extended permit icmp any any objec
!
00094 L|icmp unreachable rate-limit 1 burst-size 1        ||00100 R|icmp unreachable rate-limit 10 burst-size 5       
!
00100 L|nat (management,outside) source static any interfa||00106 R|nat (management,outside) source dynamic Internet-P
00101  |access-group Web in interface outside             ||00107  |access-group Web in interface outside             
!
       |                                                  ||00210 R|class-map ttl                                     
       |                                                  ||00211 R| match any                                        
!
00210  |policy-map global_policy                          ||00218  |policy-map global_policy                          
00211  | class inspection_default                         ||00219  | class inspection_default                         
       |                                                  ||00235 R|  inspect icmp                                    
       |                                                  ||00236 R|  inspect icmp error                              
       |                                                  ||00237 R| class ttl                                        
       |                                                  ||00238 R|  set connection decrement-ttl                    
!

outsideインタフェースでICMP戻りパケットを許可する

それぞれ許可すると次の表示が可能になる。
time-exceeded:経由ホップ
unreachable:目標ホスト

object-group icmp-type DM_INLINE_ICMP_1
 icmp-object time-exceeded
 icmp-object unreachable
access-list Web extended permit icmp any any object-group DM_INLINE_ICMP_1 
access-group Web in interface outside

ちなみに、ICMP Type tracerouteは許可/拒否でも動作に違いはなかった。

ICMPパケット受信バッファ調整

こちらの設定をしておかないと、ホップ表示に時間がかかる。

icmp unreachable rate-limit 10 burst-size 5

NAPT(PAT)時のICMP inspection設定

tracerouteのホップ検出時のICMPヘッダには元パケットのUDPヘッダが引き継がれる。
そのICMPヘッダの内容をinspectして確認することでNAT(NAPT/PAT)のコネクションと紐付ける。

policy-map global_policy
 class inspection_default
  inspect icmp 
  inspect icmp error 

NAPT設定誤り

初期構築時に設定を間違えたのか、NAPTが想定通りに設定できていなかった。

nat (management,outside) source static any interface  
↓
nat (management,outside) source dynamic Internet-PAT interface

ちなみに、NAPT設定誤り時Logは
 Src:(Global) Dst:0.0.0.0
と表示され、戻りパケットを処理できていなかった。
inspectionが正常に動作しないと考えられる。

ASAをtracerouteホップとしてカウントさせる

Cisco ASAはデフォルトでは通過パケットのTTLをdecrementしない。
そのため、tracerouteのパケットをそのまま転送し、ホップとしてカウントされず表示されない。

以下の設定でTTL decrement (=traceroute表示) が可能となる。

!
class-map ttl
 match any
!
policy-map global_policy
class ttl
  set connection decrement-ttl
!

クラス名は適宜変更する。

Ciscoオフィシャル情報

Ciscoのサポートコミュニティでも同様の議論あり。
ASA Versionが新しくなってからinspect icmp errorも必要になった?ような話がある。

supportforums.cisco.com

supportforums.cisco.com

traceroute出力結果

上記の設定変更後のLinuxからのtracerouteの結果は以下の通り。

Before

すぐにRequest Timed Out...

[root@CentOS-01 ~]# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *

After

正常にtraceroute表示されるようになった。
(直近のホストはマスク)

[root@CentOS-01 ~]# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 gateway (192.168.1.5) 3.603 ms 3.534 ms 4.618 ms
2 133.160.xx.xx (133.160.xx.xx) 6.507 ms 7.588 ms 7.583 ms
3 133.160.xx.xx (133.160.xx.xx) 6.430 ms 8.271 ms 8.244 ms
4 133.160.148.53 (133.160.148.53) 18.182 ms 27.957 ms 27.933 ms
5 133.160.182.41 (133.160.182.41) 8.054 ms 133.160.182.25 (133.160.182.25) 8.850 ms 9.808 ms
6 72.14.243.78 (72.14.243.78) 10.662 ms 4.739 ms 6.580 ms
7 216.239.54.13 (216.239.54.13) 7.627 ms 7.643 ms 7.614 ms
8 72.14.238.247 (72.14.238.247) 7.601 ms 209.85.243.49 (209.85.243.49) 7.597 ms 209.85.246.89 (209.85.246.89) 9.421 ms
9 google-public-dns-a.google.com (8.8.8.8) 10.523 ms 10.470 ms 10.373 ms