概要
このドキュメントでは NAT ルータにて CEF を enable にした際にパケットが50% ロスする場合の発生原因とソリューションについて解説します。
前提条件
要件
次の項目に関する知識があることが推奨されます。
使用するコンポーネント
このドキュメントは、特定のソフトウェアやハードウェアのバージョンに限定されるものではありません。
表記法
ドキュメント表記の詳細は、『シスコ テクニカル ティップスの表記法』を参照してください。
障害内容
ip nat outside source static 設定時、inside 側から outside 側向けのパケットは、destination address を NAT 変換します。その際、まず、NAT 変換前の destination address を元に、ルーティングし、その後 NAT の処理が行われます。下記設定にある static route は、このように NAT 変換前の destination address を出力インターフェイスまでルーティングさせるために必要になります。
下記設定の場合、inside 側から outside 側へのパケットのため、NAT ルータ(R2) は、ip route 3.3.3.3 255.255.255.0 の static route を参照し、E1/0 へパケットをルーティングし、その後 destination address を3.3.3.3 から23.1.1.3 へ変換してパケットを送出します。
本ドキュメントでは、この設定において、ルーティングの方式に CEF を使用する場合、inside 側から outside 側へのパケットが50% の割合でドロップする事象について説明しています。
※ 画像をクリックすると、大きく表示されます。
R2#sh ip route
3.0.0.0/24 is subnetted, 1 subnets
S 3.3.3.0 is directly connected, Ethernet1/0
23.0.0.0/24 is subnetted, 1 subnets
C 23.1.1.0 is directly connected, Ethernet1/0
12.0.0.0/24 is subnetted, 1 subnets
C 12.1.1.0 is directly connected, Ethernet0/0
R2#sh ip nat translations
Pro Inside global Inside local Outside local Outside global
--- --- --- 3.3.3.3 23.1.1.3
--- 12.1.1.1 12.1.1.1 3.3.3.3 23.1.1.3
R2#sh ip cef 3.3.3.3
3.3.3.0/24, version 15, epoch 0, attached
0 packets, 0 bytes
via Ethernet1/0, 0 dependencies
valid glean adjacency
解説と解決策
解説
NAT 変換前のパケットを出力インターフェイスへルーティングさせる方式として CEF を使用する場合、destination address 3.3.3.3 の adjacency が解決されません(glean adjacency)。この場合、CEF はパケットを CPU に punt し、次の switching-path で ルーティングが行なわれます(詳細は、『How to Verify Cisco Express Forwarding Switching』をご参照ください)。
punt 処理には閾値が設けられております。具体的には、2秒に1パケットの割合で punt 処理を行います。これは、大量のパケットが punt されることによる CPU への負荷を軽減することを目的としています。ルータから Ping(timeout=2秒)を行なうと、上記 punt 閾値により、50% のパケットロスが発生します。
解決策
解決策1
static route において Next Hop を使用する
設定例) ip route 3.3.3.0 255.255.255.0 Ethernet1/0 23.1.1.3
static route にて Next Hop address が設定されている場合、下記の通り CEF にても Next hop が決定しており、Adjacency が解決されているため、punt 処理は行われず、本事象は発生しません。
R2#sho ip route
3.0.0.0/24 is subnetted, 1 subnets
S 3.3.3.0 [1/0] via 23.1.1.3, Ethernet1/0
23.0.0.0/24 is subnetted, 1 subnets
C 23.1.1.0 is directly connected, Ethernet1/0
12.0.0.0/24 is subnetted, 1 subnets
C 12.1.1.0 is directly connected, Ethernet0/0
R2#sho ip cef 3.3.3.3
3.3.3.0/24, version 12, epoch 0, cached adjacency 23.1.1.3
0 packets, 0 bytes
via 23.1.1.3, Ethernet1/0, 0 dependencies
next hop 23.1.1.3, Ethernet1/0
valid cached adjacency
解決策2
NAT に add-route オプションを設定する
設定例) ip nat outside source static 23.1.1.3 3.3.3.3 add-route
この add-route option を設定すると、指定した NAT に応じた static route が動的に作成され、ルーティングテーブルにインストールされます。このため、CEF での Next Hop が決定されることで Adjacency が解決され、3.3.3.3/32宛のパケットは punt 処理の対象とはならず、本事象は発生しません。