CentOS 6.2(カーネル2.6.32-220)でルーティングの問題が発生しています
設定は次のとおりです。1つのホストがローカルネットワーク上にあります。離れた場所にある2つのほぼ同一のホストと通信しています。 2つのリモートホストはすべて同じネットワーク上にあり、相互の冗長バックアップとして機能します。
ローカルホストから各リモートホストへの2つのGREトンネルを設定しました。
ip tunnel add name tunnel1 mode gre local 10.2.1.2 remote 10.2.1.1
ip link set dev tunnel1 up
ip route add 172.16.1.0/24 dev tunnel1 metric 101
ip tunnel add name tunnel2 mode gre local 10.2.1.4 remote 10.2.1.3
ip link set dev tunnel2 up
ip route add 172.16.1.0/24 dev tunnel2 metric 102
送信パケットは正しくルーティングされます。問題ありません。着信パケットがおかしい。より高いメトリック(上記の例ではtunnel2)のルートを持つトンネルは、着信パケットを無視するようです。それらは問題なく動作し、「tcpdump -i tunnel2」を使用してローカルマシンで確認できますが、ローカルネットワークに適切にルーティングされていません。それらは単に落とされます。 2つのメトリックを切り替えると、tunnel1はすべての着信パケットをドロップします。ルートメトリックが低いトンネルは、着信と発信の両方でパケットを適切にルーティングします。
これは「設計どおりに機能していますか?」もちろん、私が望んでいるのは、両方のトンネルのすべてのパケットが適切に転送されることです。これは可能ですか?
クイックアップデート:ある人が「iptunnel」コマンドに「key」パラメータを追加することを提案しました(理由はわかりません)。トンネルごとに異なるキーと両方のトンネルに同じキーを使用してこれを試しましたが、どちらの試行も効果がありませんでした。
Netdevメーリングリストのおかげで、私は答えがあります。 「リバースパスフィルタリング」と呼ばれる、私が聞いたことのない機能があります。オンにすると、このカーネルルーティング機能は、送信パケットが送信元アドレスに使用するインターフェイス以外のインターフェイスに到着した場合、着信パケットをサイレントにドロップします。これはセキュリティ機能として意図されており、ほとんどの状況で、特にiptablesを注意深く設定していない場合に適したデフォルトです。
CentOS(およびおそらくRHEL)は、/ etc/sysctl.conf(net.ipv4.conf.default.rp_filter = 1)でデフォルトでリバースパスフィルタリングをオンにします。セットアップスクリプトに次のコマンドを追加しました。
echo 0 > /proc/sys/net/ipv4/conf/tunnel1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/tunnel2/rp_filter
これにより、両方の疑似インターフェイスのリバースパスフィルタリングがオフになり、すべてが機能するようになりました。
これらのインターフェースは「オンザフライ」で作成され、sysctl.confは起動時にのみ読み取られるため、特定のインターフェースのsysctl.confへの追加は機能しなかったことに注意してください。もちろん、sysctl.confのデフォルトを変更することもできましたが、他のインターフェースの機能を無効にしたくありませんでした。