Linux でつくったルータを冗長化する

Linux で仕立てたルータがあります。最初はお試しみたいな感じでいれてたものがなにげに重要な位置を占めるに至ってしまい落とすに落とせない機械になってしまったなんてことはよくあるでしょう。メンテで止めようものなら事前に面倒な調整が待ち受けていたりするでしょう。そんなめんどくさいことやってられますか。二重化しましょう。メンテで止めてる間別の機械に処理を受け継いでもらいましょう。冗長化しましょう。と思いました。

仕組みとしては VRRP ( Virtual Router Redundancy Protocol ) を使うのがいいのかなあ。検索して一発目に出てきたからです。実装としては keepalived でいいかな。使ったことあるからです。

とりあえず keepalived.org からソースをダウンロードしてきます。昔から動いている機械ですから古いディストリビューションでありカーネルが古いのも想像できるでしょう。というわけで keepalived v 1.1.20 を選択。これなら古い CentOS とかでもビルドできます。

ロードバランスするわけじゃないので細かい設定は要らないのです。VRRPが使えれば良いのです。 じゃあ ./configure してみよう。

# ./configure
~~
~~
Keepalived configuration
------------------------
Keepalived version       : 1.1.20
Compiler                 : gcc
Compiler flags           : -g -O2
Extra Lib                : -lpopt -lssl -lcrypto
Use IPVS Framework       : No
IPVS sync daemon support : No
Use VRRP Framework       : Yes
Use Debug flags          : No

機能が片っ端から No ですけどこれでいいです。ルータ冗長化するだけなら VRRP だけ有効になってりゃそれで良いです。このせっていで make しましょう。

rpm パッケージを作りたいなら make rpm でもいいです。このとき ipvs が無効だと(ipvs周りのパッケージが入っていないと)エラーで止まってしまいます。今回みたいな用途では(ロードバランスしない場合は)不要なので、keepalived.spec ファイル内のチェックしている個所をコメントアウトしてしまいましょう。これで rpm がつくれます。

あとは設定ファイルで internal 側と external 側のインタフェースについてそれぞれの仮想IPを指定してやりゃあできあがりです。バックエンドシステムの設定とかそういうのは無いので不要です。片方落とせばもう片方がIPアドレスを引き継いで動作してくれます。便利な世の中になったね。

keepalived.conf はこんな感じに設定しているよ。

vrrp_instance VE { ! 外部ネットワーク側のインタフェース設定
  state BACKUP
  interface eth1
  garp_master_delay 5
  virtual_router_id 101
  priority 100
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass xxxx
  }
  virtual_ipaddress {
    192.168.0.1/24   dev eth1 !実際使うインタフェースとアドレス
  }
}
vrrp_instance VI { ! 内部ネットワーク側のインタフェース設定
  state BACKUP
  interface eth0
  garp_master_delay 5
  virtual_router_id 102
  priority 100
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass xxxx
  }
  virtual_ipaddress {
    172.16.0.1/24 dev eth0 !実際使うインタフェースとアドレス
  }
}
vrrp_sync_group VG { ! フェイルオーバーするときは両インタフェースともセットで動く
  group {
    VE
    VI
  }
}