特定のルーティングテーブルを使用するとUDP sendtoが失敗する

特定のルーティングテーブルを使用するとUDP sendtoが失敗する

複数のインターフェースを持つシステムがあります。いくつかのsysctlオプションとルーティング テーブルおよびルールを使用して、それらのインターフェースすべてを相互に分離しました。

各インターフェースには、デフォルト ルートを定義する独自のルーティング テーブルがあります。

各ルーティング テーブルには、どのパケットがどのテーブルに送信されるかを定義する 4 つのルールのセットがあります。

eth0 (192.168.1.1)簡単にするために、と があるとしますeth1 (192.168.1.2)

192.168.1.1表からeth0

192.168.1.1テーブルへeth0

eth0の場合table eth0

oif eth0table eth0

eth2それは同じだから。

オプションはsysctl次のとおりです:

net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.arp_ignore = 2
net.ipv4.conf.all.arp_announce = 1
net.ipv4.conf.all.rp_filter = 1

これは、私が意図した使用例の 99% でうまく機能しますが、1 つ失敗します。「sendto」を使用して UDP クライアントに応答するなど、バインドされていないソケットからパケットが生成されると、呼び出しは「ネットワークに到達できません」で失敗します。sendto を呼び出す前に特定の IP アドレスがバインドされている場合、呼び出しは期待どおりに成功します。

このような状況で包括的なデフォルト ルートを設定する以外に、ポリシー ルーティング (iptables、ip ルールなど) を使用してこの問題を解決する方法はありますか?

ありがとう

関連情報