VyattaでVRRP failover時にNAT stateful failover

皆様ルータは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 vrrpinterface 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
}

—-

VyattaでVRRP failover時にNAT stateful failover” への1件のフィードバック

  1. 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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください