本日、客先でGenieATMのインストール作業をしていたのですが、GenieATMがなぜかどうしてもNetFlowを受け取ることができない、という事象に出くわしました。
設定は何度見直しても問題ないし、来ているNetFlow PDUも正しい。GenieATM上でtcpdumpで確認してもきちんとフローは来ているし、しかるべきポート番号でGenieATMはきちんとLISTENしている。これで受け取れないはずはないんだが・・・。
と、散々悩んでたときにふとヒラメキっ! 今回のお客さんのところではちょっとした事情で少々変わったルーティング設定になっていました。NetFlow PDUはGenieATMのeth1のインターフェースから受けるようなっていたのですが、ExporterたちのIPアドレスのNextHopはeth0に向いていました。NetFlow(sFlowもそうですが)はunidirectionalなUDPストリームなので、返りのパケットを返す必要がありません。よって、このようなルーティングでも問題ないと思っていたのですが、ここに落とし穴がありました。
GenieATMはLinuxベースなわけですが、LinuxのReverse Path Filter (rp_filter) が今回の怪現象の真犯人! Reverse Path Filterというのは、簡単に言うと、受け取ったIPパケットのソースIPアドレスを自分のルーティングテーブルでルックアップして、NextHopがそのパケットの入ってきたインターフェースと一致しているかどうかをチェックし、異なっていれば捨てる、というものです。主にIP Spoofingを防止するために使われるわけですが、今回のケースは意図せずこれに該当してしまっていたわけです。なので、tcpdumpでパケットは見えていたのにもかかわらず、rp_filter(カーネル)で捨てちゃってたので、一向にGenieATMではフローが見れなかった、という次第。rp_filterを止めればきちんとフローが見えるようになりました。
いやー、はまったはまった。