2005-06-26

λ [FreeBSD] CARP と OSPF

CARP 自体は別の人におまかせしてしまったのだが、FreeBSD-5.4の carp は、カーネルモジュールがなくて、 カーネルのコンフィグファイルに以下の行を入れた以外は、マニュアル通りで特に悩むところはなかった模様。

device  carp
device  pf
device  pflog
device  pfsync

ついでに PF: Firewall Redundancy with CARP and pfsync を見て、pfsync の設定もしていた。 pf のステート情報を同期させてくれるらしい。

そこまではよかったが、OSPFの設定で難儀する。

サブネットが同じなので、carpインターフェースと em(普通のNIC)インターフェース の両方で有効になり、OSPFが「変なとこからパケット来るで」と文句を言う。

2005/06/26 17:08:24 OSPF: can't setsockopt IP_MULTICAST_IF(fd 5, addr 192.168.182.1, ifindex 10): Can't assign requested address
2005/06/26 17:08:26 OSPF: Packet from [192.168.182.2] received on wrong link em2
2005/06/26 17:08:26 OSPF: Packet from [192.168.182.252] received on wrong link em2
2005/06/26 17:08:27 OSPF: Packet from [192.168.182.5] received on wrong link em2
2005/06/26 17:08:27 OSPF: Packet from [192.168.182.251] received on wrong link em2
2005/06/26 17:08:28 OSPF: Packet from [192.168.182.249] received on wrong link em2
2005/06/26 17:08:28 OSPF: Packet from [192.168.182.252] received on wrong link em2

[quagga-users 3927] Re: VRRP-OSPF Interoperability によるとインターフェースをシャットダウンすればいいらしいのだが、 OSPFv2 の設定にはそんなものが見つからない。 (後から読み返してみたら、"Shut off quagga on that interface" だから、zebra.conf 側の設定のような気がするが、 interface hoge に shutdown なんかして普通の通信ができるのだろうか? 少なくともCISCOだったら出来ないよなー)

zebra の設定によると、ip address A.B.C.D/M secondary とセカンダリとして設定されたIPアドレスだったらOSPFの対象外になる、 というのを発見したが、これはLinuxの流儀で「セカンダリ用に独立したインターフェースが出来る」場合の対処だった。 BSD では ip address A.B.C.D/M secondary というコマンドがそもそも実行できない。

OSPF を有効にする2つのインターフェースのうち、1つはOSPF有効な上流のルータにつなぐだけ(デフォルトルートを利用するマシンが存在しない)、 という状況だったので、そのインターフェースはCARPは使わずOSPFでのみ冗長性を確保するということにした。

で、CARP を1つ削除したところ…削除した方のOSPFがちゃんとリンクした。 削除しなかった方は「バックアップ側」のマシンにのみリンク…

結局 quagga の ospfd.c にパッチを当ててインターフェース名が carp ではじまる奴は無理矢理無効にすることになった。

=--- ospfd/ospfd.c.bak   Sun Jun 26 17:20:01 2005
+++ ospfd/ospfd.c       Sun Jun 26 17:20:33 2005
@@ -735,6 +735,9 @@
       if ((ifp = getdata (node)) == NULL)
        continue;

+      if (memcmp (ifp->name, "carp", 4) == 0)
+       continue;
+
       if (memcmp (ifp->name, "VLINK", 5) == 0)
        continue;

しかし、こんなパッチよりか ospfd.conf の interface carp? に shutdown と書ければベストだよなあ。

[]