皆様ルータはVRRPとかで冗長化しているかと思いますが、NATしているルータの場合failoverしてVIP引き継いでもNATテーブルが亡くなるとその瞬間の通信は途絶してしまいますよね。そこでNAT stateful failoverです。
基本はVyattaのドキュメントを参照。Vyattaで普通にNATルータを作れるくらいの知識が前提。全部Vyattaのドキュメントに書かれているので、わからなければそっちを見てください。
2台のVyattaルータをVRRPで冗長化する際に問題となるNATテーブルの消失を解消するのが目的。
条件・概要
- Vyatta Core 6.1を利用して構築する
- NAT配下にクライアントが存在する
- WAN側のIPアドレスは固定
- 固定アドレスであればPPPoEでも同様のことは可能と思われるが、ここではPPPoEの冗長化は考慮せず、Ethernetによる接続回線を想定する
- NATテーブル同期の直結接続を用意する(WAN/LANで代用してもいいのかも)
Configの要点
- 2台で基本的には同一設定にする。異なる点は以下。
- ホスト名
- 物理NICに割り当てるIPアドレス
- VRRPのpriority
- firewallの部分は必要最低限の設定。SNATしているけど、一応最低限として。
- interface ethernet eth0 vrrpとinterface ethernet eth2 vrrpは同一のグループにする。interface ethernet ethX vrrpの中でVIPを指定する。
- eth1は冗長構成ペアを直接接続。
- service conntrack-syncでstateful failoverを実現。service conntrack-sync interface eth1が同期するためのNIC指定。
- service conntrack-sync failover-mechanism vrrp sync groupでVRRPで冗長化することと、冗長化するVRRPのグループを指定。
- NATはmasquaradeではなくsourceを指定する。動的にWAN側のIPアドレスが変わる環境はmasquaradeが必要だけどそれだとNATテーブルの保持は意味が無いので。WAN側のIPアドレスが変更されないならmasquaradeよりsourceのほうがパフォーマンスがいい。
- DNATの設定はここでは扱わない。設定してあれば同様にNATテーブルは同期するので動作はすると思うが未検証。Config-syncの検証を行うときに検証する。
これで、運用系ルータが止まってVRRPで待機系に切り替わっても通信中のセッションは大丈夫。とはいえ、VRRPの切り替わりは数秒かかるので、映像とか音声は途切れちゃうと思いますけどね。
Network構成図
—-
Global Network 10.10.0.0/24 (dummy)
VRRP Heartbeat Network 10.10.10.0/24
Protected Network 192.168.100.0/24
+----------------------------------------+ | L3 SW / internet | +----------------------------------------+ | 10.10.0.1 | +----------------------------------------+ | L2 SW | +----------------------------------------+ | | | - - (VRRP VIP:10.10.0.101) - - - | | | | | |eth0(10.10.0.102) |eth0(10.10.0.103) +-----------+eth1(10.10.10.2) +-------------+ |R1(primary)|------CULSTER--------|R2(secondary)| +-----------+ eth1(10.10.10.3)+-------------+ |eth2(192.168.100.2) |eth2(192.168.200.3) | | | - - (VRRP VIP:192.168.100.1) - - | | | +----------------------------------------+ | L2 SW / 192.168.100.0/24 | +----------------------------------------+
—-
Configuration
R1
—-
firewall { name internet_to_protected { default-action drop description "Internet to Protected" rule 10 { action accept state { established enable } } } name protected_to_internet { default-action accept description "Protected to Internet" rule 10 { action drop state { invalid enable } } } } interfaces { ethernet eth0 { address 10.10.0.102/24 firewall { in { name internet_to_protected } } vrrp { vrrp-group 1 { advertise-interval 1 preempt true priority 200 sync-group MAIN-GW virtual-address 10.10.0.101 } } } ethernet eth1 { address 10.10.10.2/24 } ethernet eth2 { address 192.168.100.2/24 firewall { in { name protected_to_internet } } vrrp { vrrp-group 2 { advertise-interval 1 preempt true priority 200 sync-group MAIN-GW virtual-address 192.168.100.1 } } } loopback lo { } } service { conntrack-sync { failover-mechanism { vrrp { sync-group MAIN-GW } } interface eth1 } nat { rule 10 { description SNAT outbound-interface eth0 outside-address { address 10.10.0.101 } source { address 192.168.100.0/24 } type source } } ssh { port 22 protocol-version v2 } } system { gateway-address 10.10.0.1 host-name R1 }
—-
R2
—-
firewall { name internet_to_protected { default-action drop description "Internet to Protected" rule 10 { action accept state { established enable } } } name protected_to_internet { default-action accept description "Protected to Internet" rule 10 { action drop state { invalid enable } } } } interfaces { ethernet eth0 { address 10.10.0.103/24 firewall { in { name internet_to_protected } } vrrp { vrrp-group 1 { advertise-interval 1 preempt true priority 100 sync-group MAIN-GW virtual-address 10.10.0.101 } } } ethernet eth1 { address 10.10.10.3/24 } ethernet eth2 { address 192.168.100.3/24 firewall { in { name protected_to_internet } } vrrp { vrrp-group 2 { advertise-interval 1 preempt true priority 100 sync-group MAIN-GW virtual-address 192.168.100.1 } } } loopback lo { } } service { conntrack-sync { failover-mechanism { vrrp { sync-group MAIN-GW } } interface eth1 } nat { rule 10 { description SNAT outbound-interface eth0 outside-address { address 10.10.0.101 } source { address 192.168.100.0/24 } type source } } ssh { port 22 protocol-version v2 } } system { gateway-address 10.10.0.1 host-name R2 }
—-
Hi
Please recommend if we want to add VLAN
L2 SW / 192.168.100.0/24,192.168.101.0/24,192.168.102.0/24
Thanks
Ley