B2B NAT HA with Cisco IOS-XE
概要
ステートを保持するNATの冗長化というのは、ステートを持っていない静的なNATに比べるといくつか考慮する点があります。ポート番号を含めた動的なアドレスの変換する場所を両方の系で処理するのか、片方の系で処理するのかです。つまり、片側で処理するなら必ず往復のパケットが特定の片側のみ通過するようにネットワークを組まないといけないし、両側で処理するなら動的なテーブルエントリーを同期する必要があります。同期するということは、なにかしらのクラスタを組むということになります。
NATにおいては、ステートフルな状態を維持するために、接続されたデバイス間で情報をリアルタイムに共有することが重要です。これにより、いずれかのデバイスが障害を起こした場合でも、他のデバイスが同じNATエントリーを維持し、通信の中断を防ぐことができます。今回のシナリオでは、これを実現するために、Ciscoのデバイスを用いた冗長構成を設定します。
今回のシナリオとしては、内部のLinuxインスタンスから外部に設置されたサーバにアクセスし、外部に出るときにPAT(Source NAT)を行います。ただし、ネットワークは冗長化されており外部に露出するIPは1GlobalIPのみとします。これをLAN-WANシナリオで実現するためには冗長系で同じアドレス(プール)を保持するためには動的なテーブルエントリーの同期が必要となります。
※使用するアドレスは、インターネット上の実在するアドレスとは関連はありません。あくまで、Lab用途で使用したのみです。
※他にも実現方法はありますが、ここではStatefull NATの実装を解決方法としました。
ネットワークの構成例
今回はCiscoのIOX-XEを用いて組むことになりますが、公式のドキュメントで該当するのはB2B(Box-to-Box) NAT HAシナリオあたりとなります。
この構成例では、二台のNATデバイスが冗長化されて配置されます。各デバイスはWANおよびLAN側にインターフェースを持ち、通常は片方のデバイスがアクティブ(ACTIVE)状態、もう片方がスタンバイ(STANDBY)状態で動作します。万が一、アクティブなデバイスが障害を起こした場合、自動的にスタンバイデバイスがアクティブになり、NATの継続的な運用が確保されます。このプロセスを「フェイルオーバー」と呼びます。
高可用性を確保するため、組み込みのクラスタ機能を利用して冗長化されたNATデバイス間で状態を同期します。この構成では、デバイス間の通信は「GigabitEthernet3」インターフェースを通じて行われ、対称ルーティングと非対称ルーティングの両方がサポートされています。これは、故障時の迅速な復旧において重要な役割を果たします。
構成図は以下の通りになります。今回は、機材の都合で渡の物理を冗長化していませんが本番で設計する場合には物理的に異なるポートで冗長化をすべきところです。このようなクラスタ構成では、ストレートのDataPlaneよりも渡の通信は信頼性を高くする必要があります。
┌─────────┐
│ SW ├─────────────────────────────┐
┌───────┼ ├────────┐ │ 192.168.x.0/24
│ └─────────┘ │ │
│ x=30 │ │
│.1 │.2 │
AS │e0/1 │e0/1 │
65002┌────┼────┐ ┌─────┴───┐ │
│ │e0/2 e0/2│ │ │.10
│ cpe0 ┼───────────────┼ cpe1 │ │eth2
│ │.1 .2│ │ ┌─────┼───────┐
└─────┬───┘ └─────┬───┘ │ NS1 │
.2 │e0/0 .2 │e0/0 │ │
│ │ │ │
│x=10 │ x=20 │ LINUX │
│ │ │ │
│ │ │ │
.1 │gi2 .1 │gi2 │ NS2 │
┌─────┴───┐ x=100 ┌─────┴───┐ └─────┬───────┘
AS │ │gi3 gi3│ │ │eth3
65001│ nat0 ├───────────────┼ nat1 │ │.10,.20
│ │.1 .2│ │ │
└─────┬───┘ └─────┬───┘ │
│gi1 VIP:.1 │gi1 │
│.2 x=200 │.3 │
│ │ │
│ ┌─────────┐ │ │
└──────┤ ┼────────┘ │
│ SW ├─────────────────────────────┴
└─────────┘
前提条件、制限事項については公式のドキュメントを参照ください。VRF機能やMPLS機能などとNATの組み合わせは使用するOSによりサポートされる範囲が違いますので該当のバージョンのドキュメントを参照ください。今回、用意したのはこちらのOSになります。
Router#sh ver | i IOS XE
Cisco IOS XE Software, Version 17.04.01a
NAT0/1の設定例
NAT0およびNAT1のデバイスには、それぞれ異なる役割が与えられています。NAT0はアクティブ状態で、NAT1はスタンバイ状態です。これにより、通常時はNAT0が全てのトラフィックを処理し、NAT1はNAT0がダウンした際のバックアップとして機能します。以下の設定例は、NAT0およびNAT1の設定を示しており、それぞれのインターフェースの設定、ルーティング、NATプールの設定、BGPの設定などが含まれています。
一般的にBGPは同一AS内部のスピーカ同士はフルメッシュで接続することが基本になりますが、今回は渡部分はクラスタ動作に任せますので、あえてピアしておりません。
!#### NAT0
hostname NAT0
redundancy
application redundancy
group 1
name RG1
preempt
priority 105
timers delay 1 reload 3
control GigabitEthernet3 protocol 1
data GigabitEthernet3
asymmetric-routing interface GigabitEthernet3
asymmetric-routing always-divert enable
track 10 decrement 100
protocol 1
timers hellotime 1 holdtime 3
authentication text cisco
!
track 1 ip sla 1 reachability
track 2 ip route 192.168.30.0 255.255.255.0 reachability
track 10 list boolean and
object 1
object 2
!
interface Loopback0
ip address 1.1.1.1 255.255.255.255
!
interface GigabitEthernet1
ip address 192.168.200.2 255.255.255.0
ip nat inside
negotiation auto
redundancy rii 100
redundancy group 1 ip 192.168.200.1 exclusive decrement 100
ip virtual-reassembly
!
interface GigabitEthernet2
ip address 192.168.10.1 255.255.255.0
ip nat outside
negotiation auto
redundancy rii 101
redundancy asymmetric-routing enable
ip virtual-reassembly
!
interface GigabitEthernet3
ip address 192.168.100.1 255.255.255.0
negotiation auto
!
router bgp 65001
bgp router-id interface Loopback0
bgp log-neighbor-changes
network 200.0.0.1 mask 255.255.255.255
neighbor 192.168.10.2 remote-as 65002
!
ip nat switchover replication http
ip nat pool POOL 200.0.0.1 200.0.0.1 netmask 255.255.255.252
ip nat inside source list 1 pool POOL redundancy 1 mapping-id 120 overload
ip route 200.0.0.1 255.255.255.255 Null0
!
ip sla 1
icmp-echo 192.168.200.10 source-interface GigabitEthernet1
threshold 1000
timeout 2000
frequency 5
ip sla schedule 1 life forever start-time now
ip access-list standard 1
10 permit 192.168.200.0 0.0.0.255
!#### NAT1
hostname NAT1
redundancy
application redundancy
group 1
name RG1
preempt
timers delay 1 reload 3
control GigabitEthernet3 protocol 1
data GigabitEthernet3
asymmetric-routing interface GigabitEthernet3
asymmetric-routing always-divert enable
protocol 1
timers hellotime 1 holdtime 3
authentication text cisco
!
interface Loopback0
ip address 2.2.2.2 255.255.255.255
!
interface GigabitEthernet1
ip address 192.168.200.3 255.255.255.0
ip nat inside
negotiation auto
redundancy rii 100
redundancy group 1 ip 192.168.200.1 exclusive decrement 100
ip virtual-reassembly
!
interface GigabitEthernet2
ip address 192.168.20.1 255.255.255.0
ip nat outside
negotiation auto
redundancy rii 101
redundancy asymmetric-routing enable
ip virtual-reassembly
!
interface GigabitEthernet3
ip address 192.168.100.2 255.255.255.0
negotiation auto
!
router bgp 65001
bgp router-id interface Loopback0
bgp log-neighbor-changes
network 200.0.0.1 mask 255.255.255.255
neighbor 192.168.20.2 remote-as 65002
!
ip nat switchover replication http
ip nat pool POOL 200.0.0.1 200.0.0.1 netmask 255.255.255.252
ip nat inside source list 1 pool POOL redundancy 1 mapping-id 120 overload
ip route 200.0.0.1 255.255.255.255 Null0
!
!
ip access-list standard 1
10 permit 192.168.200.0 0.0.0.255
CPE0/1の設定例
WANを経由した先に顧客側の設備の想定としてCustomer Premises Equipment(CPE)をCPE0とCPE1を配置しています。CPE0およびCPE1の設定には、BGPネイバーの設定やネットワーク広告の設定が含まれており、外部との通信が途切れないように冗長化されています。この冗長化構成により、一方のCPEが障害を起こした場合でも、もう一方のCPEが引き継いで通信を継続することができます。
!#CPE0
hostname CPE0
interface Loopback0
ip address 3.3.3.3 255.255.255.255
!
interface Ethernet0/0
ip address 192.168.10.2 255.255.255.0
!
interface Ethernet0/1
ip address 192.168.30.1 255.255.255.0
!
interface Ethernet0/2
ip address 192.168.40.1 255.255.255.0
!
interface Ethernet0/3
no ip address
shutdown
!
router bgp 65002
bgp router-id 3.3.3.3
bgp log-neighbor-changes
network 192.168.30.0
neighbor 192.168.10.1 remote-as 65001
neighbor 192.168.40.2 remote-as 65002
neighbor 192.168.40.2 next-hop-self
!#CPE1
interface Loopback0
ip address 4.4.4.4 255.255.255.255
!
interface Ethernet0/0
ip address 192.168.20.2 255.255.255.0
!
interface Ethernet0/1
ip address 192.168.30.2 255.255.255.0
!
interface Ethernet0/2
ip address 192.168.40.2 255.255.255.0
!
interface Ethernet0/3
no ip address
shutdown
!
router bgp 65002
bgp router-id 4.4.4.4
bgp log-neighbor-changes
network 192.168.30.0
neighbor 192.168.20.1 remote-as 65001
neighbor 192.168.40.1 remote-as 65002
neighbor 192.168.40.1 next-hop-self
LINUXインスタンス設定
Linuxインスタンスは、ネットワークネームスペース(netns)を使用して、異なるネットワーク環境をエミュレートしています。ここでは、NS1およびNS2という二つの名前空間が作成され、一方を内部に他方を外部に接続しています。これにより、内部ネットワークと外部ネットワーク間の通信をテストすることができます。
$ sudo ip netns add NS1
$ sudo ip netns add NS2
$ sudo ip link set eth2 netns NS1
$ sudo ip link set eth3 netns NS2
$ sudo ip netns exec NS1 ip addr add 192.168.30.10/24 dev eth2
$ sudo ip netns exec NS2 ip addr add 192.168.200.10/24 dev eth3
$ sudo ip netns exec NS1 ip link set dev eth2 up
$ sudo ip netns exec NS1 ip link set dev lo up
$ sudo ip netns exec NS2 ip link set dev eth3 up
$ sudo ip netns exec NS2 ip link set dev lo up
$ sudo ip -n NS1 route add 200.0.0.1/32 via 192.168.30.1
$ sudo ip -n NS2 route add 192.168.30.0/24 via 192.168.200.1
動作検証
正常状態での状態確認
まずは、正常状態での各デバイスのステータスを確認します。NAT0はActive状態、NAT1はStandby状態であることが確認できます。また、各デバイスのインターフェースやルーティングテーブルの状態を確認することで、設定が正しく適用されていることがわかります。
!#### NAT0
NAT0#sh ip int brie | i up
GigabitEthernet1 192.168.200.2 YES manual up up
GigabitEthernet2 192.168.10.1 YES NVRAM up up
GigabitEthernet5 192.168.100.1 YES manual up up
Loopback0 1.1.1.1 YES manual up up
NAT0#sh ip route | b Gateway
Gateway of last resort is not set
1.0.0.0/32 is subnetted, 1 subnets
C 1.1.1.1 is directly connected, Loopback0
192.168.10.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.10.0/24 is directly connected, GigabitEthernet2
L 192.168.10.1/32 is directly connected, GigabitEthernet2
B 192.168.30.0/24 [20/0] via 192.168.10.2, 02:30:19
192.168.100.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.100.0/24 is directly connected, GigabitEthernet5
L 192.168.100.1/32 is directly connected, GigabitEthernet5
192.168.200.0/24 is variably subnetted, 3 subnets, 2 masks
C 192.168.200.0/24 is directly connected, GigabitEthernet1
L 192.168.200.1/32 is directly connected, GigabitEthernet1
L 192.168.200.2/32 is directly connected, GigabitEthernet1
200.0.0.0/32 is subnetted, 1 subnets
S 200.0.0.1 is directly connected, Null0
NAT0#sh ip bgp sum | B Neigh
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
192.168.10.2 4 65002 172 171 15 0 0 02:30:56 1
NAT0#sh ip bgp | b Netw
Network Next Hop Metric LocPrf Weight Path
*> 192.168.30.0 192.168.10.2 0 0 65002 i
*> 200.0.0.1/32 0.0.0.0 0 32768 i
NAT0#sh redundancy application group 1
Group ID:1
Group Name:RG1
Administrative State: No Shutdown
Aggregate operational state : Up
My Role: ACTIVE
Peer Role: STANDBY
Peer Presence: Yes
Peer Comm: Yes
Peer Progression Started: Yes
RF Domain: btob-one
RF state: ACTIVE
Peer RF state: STANDBY HOT
NAT0#sh ip nat translations redundancy 1
Total number of translations: 0
NAT0#sh redu app if-mgr group 1
RG ID: 1
==========
interface GigabitEthernet1
---------------------------------------
BIA_MAC 50ab.e800.0e00
VIP 192.168.200.1
Shut no shut!<=============no shut(ACTIVEという意味)
Decrement 100
!#### NAT1
NAT1#sh ip int brie | i up
GigabitEthernet1 192.168.200.3 YES manual up up
GigabitEthernet2 192.168.20.1 YES manual up up
GigabitEthernet5 192.168.100.2 YES manual up up
Loopback0 2.2.2.2 YES manual up up
NAT1#sh ip route | b Gateway
Gateway of last resort is not set
2.0.0.0/32 is subnetted, 1 subnets
C 2.2.2.2 is directly connected, Loopback0
192.168.20.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.20.0/24 is directly connected, GigabitEthernet2
L 192.168.20.1/32 is directly connected, GigabitEthernet2
B 192.168.30.0/24 [20/0] via 192.168.20.2, 03:43:23
192.168.100.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.100.0/24 is directly connected, GigabitEthernet5
L 192.168.100.2/32 is directly connected, GigabitEthernet5
192.168.200.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.200.0/24 is directly connected, GigabitEthernet1
L 192.168.200.3/32 is directly connected, GigabitEthernet1
200.0.0.0/32 is subnetted, 1 subnets
S 200.0.0.1 is directly connected, Null0
NAT1#sh ip bgp sum | B Neigh
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
192.168.20.2 4 65002 250 249 7 0 0 03:43:28 1
NAT1#sh ip bgp | b Netw
Network Next Hop Metric LocPrf Weight Path
*> 192.168.30.0 192.168.20.2 0 0 65002 i
*> 200.0.0.1/32 0.0.0.0 0 32768 i
NAT1#sh redundancy application group 1
Group ID:1
Group Name:RG1
Administrative State: No Shutdown
Aggregate operational state : Up
My Role: STANDBY
Peer Role: ACTIVE
Peer Presence: Yes
Peer Comm: Yes
Peer Progression Started: Yes
RF Domain: btob-one
RF state: STANDBY HOT
Peer RF state: ACTIVE
NAT1#sh redu app if-mgr group 1
RG ID: 1
==========
interface GigabitEthernet1
---------------------------------------
BIA_MAC 50b9.3c00.0f00
VIP 192.168.200.1
Shut shut
Decrement 100
!#### LINUXホスト
$ sudo ip -all netns exec ip -4 -br add show
netns: NS1
lo UNKNOWN 127.0.0.1/8
eth2@if75 UP 192.168.30.10/24
netns: NS2
lo UNKNOWN 127.0.0.1/8 192.168.200.20/32
eth3@if77 UP 192.168.200.10/24
$ sudo ip -all netns exec ip -4 -br route show
netns: NS1
192.168.30.0/24 dev eth2 proto kernel scope link src 192.168.30.10
200.0.0.0/30 via 192.168.30.1 dev eth2
netns: NS2
192.168.30.0/24 via 192.168.200.1 dev eth3
192.168.200.0/24 dev eth3 proto kernel scope link src 192.168.200.10
正常状態での動作確認
正常時において、疎通ができるかを確認します。正常時には、トラフィックはNAT0を通過し、スタンバイのNAT1は待機状態となります。Linuxインスタンスからの通信が、期待通りにNAT0経由で外部ネットワークに到達できることを確認します。
試験方法としてUDP、TCPで試験しています。UDPでの試験はソースポートを故意に重複させてOverloadが効いているかを確認します。TCPにおいてはWEBサーバを想定したアクセスを試行して正しく、疎通できることを確認します。ポートを重複させるために、LoにセカンダリIPを用意します。
!#LINUXホスト
!#UDPでの疎通を行います。5001ポートを重複させています。
$ sudo ip netns exec NS2 ip addr add 192.168.30.20/32 dev lo
$ sudo ip netns exec NS2 ip addr show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.200.20/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
$ sudo ip netns exec NS1 nc -lu 10000 &
$ echo 'hello' | sudo ip netns exec NS2 nc -u -p 5001 -s 192.168.200.20 192.168.30.10 10000 &\
echo 'hello' | sudo ip netns exec NS2 nc -u -p 5001 -s 192.168.200.10 192.168.30.10 10000 &
!#TCPでの疎通を行います、WEBSVを想定した疎通を行いました。
$ cat << EOS | tee index.html
<html>
<body>
<P>Test Server</P>
</body>
</html>
EOS
$ sudo ip netns exec NS1 python3 -m http.server 80&
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
$ sudo ip netns exec NS2 curl http://192.168.30.10
200.0.0.1 - - [29/Aug/2024 03:51:51] "GET / HTTP/1.1" 200 -
<html>
<body>
<P>Test Server </P>
</body>
</html>
NAT0#sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
udp 200.0.0.1:4992 192.168.200.20:5001 192.168.30.10:10000 192.168.30.10:10000
udp 200.0.0.1:5001 192.168.200.10:5001 192.168.30.10:10000 192.168.30.10:10000
tcp 200.0.0.1:38842 192.168.200.10:38842 192.168.30.10:80 192.168.30.10:80
Total number of translations: 3
NAT1#sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
udp 200.0.0.1:4992 192.168.200.20:5001 192.168.30.10:10000 192.168.30.10:10000
udp 200.0.0.1:5001 192.168.200.10:5001 192.168.30.10:10000 192.168.30.10:10000
tcp 200.0.0.1:38842 192.168.200.10:38842 192.168.30.10:80 192.168.30.10:80
Total number of translations: 3
非対称ルートにおける疎通
今度はCPEからの復路を往路とは異なる経路にして疎通ができるか確認します。以降、試行前には一テーブルをクリアしておくことを推奨します。
!#CPE1からの往路がWANを向いていることを確認
CPE1#sh ip bgp | b Net
Network Next Hop Metric LocPrf Weight Path
* i 192.168.30.0 192.168.40.1 0 100 0 i
*> 0.0.0.0 0 32768 i
*> 200.0.0.1/32 192.168.20.1 0 0 65001 i
* i 192.168.40.1 0 100 0 65001 i
CPE1#sh ip route 200.0.0.1
Routing entry for 200.0.0.1/32
Known via "bgp 65002", distance 20, metric 0
Tag 65001, type external
Last update from 192.168.20.1 1d11h ago
Routing Descriptor Blocks:
* 192.168.20.1, from 192.168.20.1, 1d11h ago
Route metric is 0, traffic share count is 1
AS Hops 1
Route tag 65001
MPLS label: none
!#経路のうち復路について異なる経路に変更します。Nexthop CPE0->CPE1
$ sudo ip -n NS1 route change 200.0.0.0/30 via 192.168.30.2
$ sudo ip -n NS1 route show
192.168.30.0/24 dev eth2 proto kernel scope link src 192.168.30.10
200.0.0.0/30 via 192.168.30.2 dev eth2
$ sudo ip netns exec NS1 nc -luk 10000 &
$ echo 'hello' | sudo ip netns exec NS2 nc -u -p 5001 -s 192.168.200.20 192.168.30.10 10000 &\
echo 'hello' | sudo ip netns exec NS2 nc -u -p 5001 -s 192.168.200.10 192.168.30.10 10000 &
!#NATで疎通できていることを確認
NAT0#sh ip nat translations redundancy 1
Pro Inside global Inside local Outside local Outside global
udp 200.0.0.1:5001 192.168.200.20:5001 192.168.30.10:10000 192.168.30.10:10000
udp 200.0.0.1:4992 192.168.200.10:5001 192.168.30.10:10000 192.168.30.10:10000
Total number of translations: 2
NAT1#sh ip nat translations redundancy 1
Pro Inside global Inside local Outside local Outside global
udp 200.0.0.1:4992 192.168.200.10:5001 192.168.30.10:10000 192.168.30.10:10000
udp 200.0.0.1:5001 192.168.200.20:5001 192.168.30.10:10000 192.168.30.10:10000
Total number of translations: 2
障害時の疎通
WAN側障害
WAN切断の代わりに、より厳しい条件としてBGPを切断して状態の確認と疎通を確認します。BGPを切断すると、RIBへインストールされていた192.168.30.0/24
エントリが削除されますので、これをトリガとしてTrackのreachabilityがDown状態になります。Track10のDownによりRGでの優先度が低下して、NAT0の状態がActive
->Standby
に遷移します。
時間を確認するために、疎通方法をPINGに切り替えています。切り替えに要する時間は、プロトコルが関わっているため手元の時計では20s程度で切り替わっていました。ここでは手動でPeerをShutしており実際にはBGPのHolddownがあり、そのタイマ分が加算される想定をしてください。
※切替時間については上記の設定で実施した場合の結果であり、タイマのチューニングにより改善できる可能性はありますが要件により内容が変化してきますので今回のスコープ外としています。
!#障害を発生させます
NAT0(config)#router bgp 65001
NAT0(config-router)#neighbor 192.168.10.2 shut
NAT0(config-router)#
*Aug 29 01:16:43.033: %BGP-5-ADJCHANGE: neighbor 192.168.10.2 Up
*Aug 29 01:16:44.946: %TRACK-6-STATE: 2 ip route 192.168.30.0/24 reachability Down -> Up
*Aug 29 01:16:45.297: %TRACK-6-STATE: 10 list boolean and Down -> Up
*Aug 29 01:16:45.298: %RG_FAULTS-6-PRICHANGE: RG Infra RG[1] Priority update. new priority [105] old priority [5] Reason: Tracked object changed its state
*Aug 29 01:16:46.286: %RG_PROTOCOL-5-ROLECHANGE: RG id 1 role change from Standby to Active
*Aug 29 01:16:49.520: %RG_VP-6-BULK_SYNC_DONE: RG group 1 BULK SYNC to standby complete.
*Aug 29 01:16:49.520: %RG_VP-6-STANDBY_READY: RG group 1 Standby router is in SSO state
NAT0#sh redundancy application group 1
Group ID:1
Group Name:RG1
Administrative State: No Shutdown
Aggregate operational state : Up
My Role: STANDBY
Peer Role: ACTIVE
Peer Presence: Yes
Peer Comm: Yes
Peer Progression Started: Yes
RF Domain: btob-one
RF state: STANDBY HOT
Peer RF state: ACTIVE
NAT1#sh redundancy application group 1
Group ID:1
Group Name:RG1
Administrative State: No Shutdown
Aggregate operational state : Up
My Role: ACTIVE
Peer Role: STANDBY
Peer Presence: Yes
Peer Comm: Yes
Peer Progression Started: Yes
RF Domain: btob-one
RF state: ACTIVE
Peer RF state: STANDBY HOT
NAT0#sh redundancy application if-mgr group 1
RG ID: 1
==========
interface GigabitEthernet1
---------------------------------------
BIA_MAC 50ab.e800.0e00
VIP 192.168.200.1
Shut shut
Decrement 100
NAT1#sh redundancy application if-mgr group 1
RG ID: 1
==========
interface GigabitEthernet1
---------------------------------------
BIA_MAC 50b9.3c00.0f00
VIP 192.168.200.1
Shut no shut
Decrement 100
NAT0#sh track brief
Track Type Instance Parameter State Last Change
1 ip sla 1 reachability Up 09:58:28
2 ip route 192.168.30.0/24 reachability Down 00:03:42
10 list boolean Down 00:03:42
NAT0#do sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
icmp 200.0.0.1:937 192.168.200.10:937 192.168.30.10:937 192.168.30.10:937
Total number of translations: 1
NAT1# sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
icmp 200.0.0.1:937 192.168.200.10:937 192.168.30.10:937 192.168.30.10:937
Total number of translations: 1
!#LINUX側で継続PING
$ sudo ip netns exec NS2 ping 192.168.30.10
PING 192.168.30.10 (192.168.30.10) 56(84) bytes of data.
(snip)
64 bytes from 192.168.30.10: icmp_seq=27 ttl=62 time=1.35 ms
64 bytes from 192.168.30.10: icmp_seq=28 ttl=62 time=1.17 ms
64 bytes from 192.168.30.10: icmp_seq=29 ttl=62 time=1.06 ms
From 192.168.200.2 icmp_seq=30 Destination Host Unreachable
From 192.168.200.2 icmp_seq=31 Destination Host Unreachable
From 192.168.200.2 icmp_seq=32 Destination Host Unreachable
From 192.168.200.2 icmp_seq=33 Destination Host Unreachable
From 192.168.200.2 icmp_seq=34 Destination Host Unreachable
From 192.168.200.2 icmp_seq=35 Destination Host Unreachable
From 192.168.200.2 icmp_seq=36 Destination Host Unreachable
From 192.168.200.2 icmp_seq=37 Destination Host Unreachable
From 192.168.200.2 icmp_seq=38 Destination Host Unreachable
From 192.168.200.2 icmp_seq=39 Destination Host Unreachable
From 192.168.200.2 icmp_seq=40 Destination Host Unreachable
From 192.168.200.2 icmp_seq=41 Destination Host Unreachable
64 bytes from 192.168.30.10: icmp_seq=43 ttl=61 time=1.67 ms
64 bytes from 192.168.30.10: icmp_seq=44 ttl=61 time=1.77 ms
64 bytes from 192.168.30.10: icmp_seq=45 ttl=61 time=2.14 ms
64 bytes from 192.168.30.10: icmp_seq=46 ttl=61 time=2.33 ms
LAN側障害
続いて、LAN側のインターフェース障害を発生させて切り替わり動作を確認します。
こちらのケースではルーチングプロトコルが関わっていないため1s以下で切り替わっているようです。
NAT0(config)#int gi1
NAT0(config-if)#shut
NAT0(config-if)#
*Aug 29 03:25:01.675: %RG_FAULTS-6-PRICHANGE: RG Infra RG[1] Priority update. new priority [5] old priority [105] Reason: Fault occurred on the traffic interface
*Aug 29 03:25:01.720: %RG_PROTOCOL-5-ROLECHANGE: RG id 1 role change from Active to Init
*Aug 29 03:25:03.686: %LINK-5-CHANGED: Interface GigabitEthernet1, changed state to administratively down
*Aug 29 03:25:04.688: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet1, changed state to down
*Aug 29 03:25:04.720: %RG_PROTOCOL-5-ROLECHANGE: RG id 1 role change from Init to Standby
*Aug 29 03:25:07.076: %TRACK-6-STATE: 1 ip sla 1 reachability Up -> Down
*Aug 29 03:25:07.730: %TRACK-6-STATE: 10 list boolean and Up -> Down
*Aug 29 03:25:07.730: %RG_FAULTS-6-PRICHANGE: RG Infra RG[1] Priority update. new priority [0] old priority [5] Reason: Tracked object changed its state
!#LINUXホストから継続PING (特に見える断はありません)
$ sudo ip netns exec NS2 ping 192.168.30.10
PING 192.168.30.10 (192.168.30.10) 56(84) bytes of data.
64 bytes from 192.168.30.10: icmp_seq=1 ttl=62 time=2.47 ms
64 bytes from 192.168.30.10: icmp_seq=2 ttl=62 time=1.48 ms
64 bytes from 192.168.30.10: icmp_seq=3 ttl=62 time=1.25 ms
64 bytes from 192.168.30.10: icmp_seq=4 ttl=62 time=1.08 ms
64 bytes from 192.168.30.10: icmp_seq=5 ttl=62 time=1.70 ms
64 bytes from 192.168.30.10: icmp_seq=6 ttl=62 time=1.25 ms
64 bytes from 192.168.30.10: icmp_seq=7 ttl=62 time=1.62 ms
64 bytes from 192.168.30.10: icmp_seq=8 ttl=62 time=0.980 ms
(snip)
NAT0#sh redundancy application group 1
Group ID:1
Group Name:RG1
Administrative State: No Shutdown
Aggregate operational state : Up
My Role: STANDBY
Peer Role: ACTIVE
Peer Presence: Yes
Peer Comm: Yes
Peer Progression Started: Yes
RF Domain: btob-one
RF state: STANDBY HOT
Peer RF state: ACTIVE
NAT1#sh redundancy application group 1
Group ID:1
Group Name:RG1
Administrative State: No Shutdown
Aggregate operational state : Up
My Role: ACTIVE
Peer Role: STANDBY
Peer Presence: Yes
Peer Comm: Yes
Peer Progression Started: Yes
RF Domain: btob-one
RF state: ACTIVE
Peer RF state: STANDBY HOT
NAT1#
NAT0#sh redundancy application if-mgr group 1
RG ID: 1
==========
interface GigabitEthernet1
---------------------------------------
BIA_MAC 50eb.8600.1500
VIP 192.168.200.1
Shut shut
Decrement 100
NAT1#sh redundancy application if-mgr group 1
RG ID: 1
==========
interface GigabitEthernet1
---------------------------------------
BIA_MAC 503e.b800.1400
VIP 192.168.200.1
Shut no shut
Decrement 100
NAT0#sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
icmp 200.0.0.1:945 192.168.200.10:945 192.168.30.10:945 192.168.30.10:945
Total number of translations: 1
NAT1#sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
icmp 200.0.0.1:945 192.168.200.10:945 192.168.30.10:945 192.168.30.10:945
Total number of translations: 1
!#NAT1へフェイルオーバー後に疎通を確認
sudo ip netns exec NS1 nc -luk 10000 &
echo 'hello' | sudo ip netns exec NS2 nc -u -p 5001 -s 192.168.200.20 192.168.30.10 10000 &\
echo 'hello' | sudo ip netns exec NS2 nc -u -p 5001 -s 192.168.200.10 192.168.30.10 10000 &
NAT0#sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
udp 200.0.0.1:4992 192.168.200.20:5001 192.168.30.10:10000 192.168.30.10:10000
icmp 200.0.0.1:945 192.168.200.10:945 192.168.30.10:945 192.168.30.10:945
udp 200.0.0.1:5001 192.168.200.10:5001 192.168.30.10:10000 192.168.30.10:10000
Total number of translations: 3
NAT1#sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
icmp 200.0.0.1:945 192.168.200.10:945 192.168.30.10:945 192.168.30.10:945
udp 200.0.0.1:4992 192.168.200.20:5001 192.168.30.10:10000 192.168.30.10:10000
udp 200.0.0.1:5001 192.168.200.10:5001 192.168.30.10:10000 192.168.30.10:10000
Total number of translations: 3
(参考)渡り(フェールオーバーリンク)障害
一般的にはこの状態はクラスタでの正常性を担保できない状態になります。この状態が発生した場合には、どちらかのディバイス(例えばActiveではない方)をシャットダウンすることを検討すべきです。または、この状態を発生させないように、Portchannelで冗長化したり、DataとControlパスの使用する物理を分離することを検討してください。検証はしていませんが、クラスタ製品の中には正しく構成すればスプリット状態を回避する動作を行うものもありますので製品リファレンスを確認されることを勧めします。
今回はNAT0側のGi3を閉塞してみました。その結果としては、NAT0はInit状態となり、NAT1がActiveとなりました。ただし、クラスタとBGPの状態が連動しないため疎通としてはNGとなります。
!#障害を発生させます
NAT0(config)#int gi3
NAT0(config-if)#shut
NAT0(config-if)#
*Aug 29 05:44:21.140: %RG_PROTOCOL-5-ROLECHANGE: RG id 1 role change from Active to Init
*Aug 29 05:44:21.164: %IP-4-DUPADDR: Duplicate address 192.168.200.1 on GigabitEthernet1, sourced by 503e.b800.1400
*Aug 29 05:44:23.145: %LINK-5-CHANGED: Interface GigabitEthernet3, changed state to administratively down
*Aug 29 05:44:24.146: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet3, changed state to down
NAT0(config-if)#
NAT1#
*Aug 29 05:44:21.191: %RG_PROTOCOL-5-ROLECHANGE: RG id 1 role change from Standby to Active
*Aug 29 05:44:21.215: %IP-4-DUPADDR: Duplicate address 192.168.200.1 on GigabitEthernet1, sourced by 50eb.8600.1500
!#NAT0はINITになりますので、NATの動作はしません。
NAT0#sh ip nat trans redu 1
Total number of translations: 0
NAT1#
NAT1#sh ip nat trans redu 1
Pro Inside global Inside local Outside local Outside global
icmp 200.0.0.1:987 192.168.200.10:987 192.168.30.10:987 192.168.30.10:987
Total number of translations: 1
!#クラスタの状態ではNAT0はINIT、NAT1はActiveになりました。
NAT0#sh redundancy application group 1
Group ID:1
Group Name:RG1
Administrative State: No Shutdown
Aggregate operational state : Down
My Role: INIT
Peer Role: UNKNOWN
Peer Presence: No
Peer Comm: No
Peer Progression Started: No
RF Domain: btob-one
RF state: NEGOTIATION
Peer RF state: DISABLED
NAT1#sh redundancy application group 1
Group ID:1
Group Name:RG1
Administrative State: No Shutdown
Aggregate operational state : Up
My Role: ACTIVE
Peer Role: UNKNOWN
Peer Presence: No
Peer Comm: No
Peer Progression Started: No
RF Domain: btob-one
RF state: ACTIVE
Peer RF state: DISABLED
まとめ
今回のシナリオでは、冗長化されたネットワーク環境において、ステートフルNATの冗長化設定を実装し、その動作を検証しました。Cisco IOX-XEを用いて動的なテーブルエントリーの同期を実現し、片方のデバイスがダウンした際にも、もう片方のデバイスが代替して機能を継続できる構成を構築しました。これにより、高可用性を維持しながら、内部ネットワークから外部への通信が可能であることを確認しました。また、正常時と障害時の動作確認を通じて、BGPの冗長性やNATのステート同期が適切に機能していることを確認しました。
※ 注)今回の構成例では渡りの物理的な冗長化は行っておらず、実運用環境での導入を考慮する場合には、ネットワーク全体の信頼性を高めるために物理的なポートや経路の冗長化を検討する必要があります。また、使用する機器やソフトウェアバージョンに応じて、設定やサポートされる機能が異なる場合があるため、適切なドキュメントの参照とテストを行うことを推奨します。
Discussion