VyattaはWAN Load Balancing機能を持っているのだけど、この機能はクライアントネットワークにもサーバネットワークにも適用できる。
簡単なのはクライアントネットワークで、マニュアルにある例の通りにやれば、マルチホーム環境でWANの冗長化ができる。
サーバネットワークも企業内のNATを挟まないようなネットワークならdisable-source-natを設定して、LAN内でOSPFでもつかってやれば一つのネットワーク内で完結するのでそれなりにうごくのだけど、インターネットに対して複数のISPやWAN回線を使おうとすると、AS取得してBGPで・・・ってなってそれをできるだけのいろんなリソースが足りない。
そこで、独立した2つ以上のIPアドレスを同じFQDNに登録してDNSラウンドロビンしてやればAS持ってない末端のネットワークでも外からのアクセス経路を冗長化できるのだけど、そうするといずれかの回線に障害が起きた時に、そのIPアドレスはラウンドロビンからはずしてやらないと困ったことになる。
つまり、それぞれの回線の疎通を定期的に確認して、その状況に応じてDNSのラウンドロビンを適切に変更してやり、ユーザに対して常に生きているアドレスだけを返せばよいのだけど、それを一つの箱でやってくれるのがBIGIPのLink ControllerやradwareのLink Proofになる。実際にはこれらの箱はもっとたくさんの機能をもっているのだけど、とりあえずこのWAN冗長化をVyattaで実現するにはWAN Load Balancing機能が持っているhook script機能を使ってラウンドロビンの更新をやってやればいい。BINDだったらnsupdateで、unboundだったらunbound-controlを使えばよくて、試しにunboundでやってみたらそれなりにうまく動いてくれた。
要点はだいたいこんなかんじで、詳細は次の更新以降でまとめます。
- 複数のグローバルアドレスを持ったルータとしてセットアップして、実サーバはプライベートアドレス空間に両側からNATする
- WAN Load Balancingはper-packet-balaningでやる
- UnboundはDNSラウンドロビンに対応したバージョンをsqueeze-backportsから入れる
- hook scriptは状態変化したInterfaceとそのstateを教えてくれる、一方unbound-controlのレコード削除は指定の名前のレコード全削除なので、その他のActiveなInterfaceのIPアドレスは再登録になる。そのためにhook script外に情報を保持しておく必要がある。
それから、この構成ではこんなことは実現できません(していません)
- 下位の実サーバの冗長化、負荷分散
- Vyatta箱の冗長化
- WAN側アドレスとNATのセッションはVRRP NAT Stateful Failoverでできるかも
- 複数の回線がActiveなときに、リターンパケットを正しいインタフェースに戻す
- フラットなインターネットだからいいけど、NATが絡むと少し厄介(そういうときはdisable-source-nat)
- あるいはISPがSource Addressをチェックしてるとだめかもしれない