使用特定路由表時 UDP sendto 失敗

使用特定路由表時 UDP sendto 失敗

我有一個具有多個介面的系統。我使用一些sysctl選項以及路由表和規則將所有這些介面相互隔離。

每個介面都有自己的路由表,定義預設路由。

每個路由表都有一組 4 條規則,用於定義哪些資料包應傳送至哪個表。

為了簡單起見,假設我有eth0 (192.168.1.1)eth1 (192.168.1.2)

192.168.1.1eth0

192.168.1.1餐桌eth0

eth0table eth0

歐伊夫 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% 的預期用例都非常有效,但有一個失敗了。如果封包是從未綁定的套接字產生的,例如使用「sendto」回覆 UDP 用戶端,則呼叫會失敗並顯示「網路無法存取」。如果在呼叫sendto之前綁定了特定的IP位址,則呼叫會如預期般成功。

如果無法為此類情況設定包羅萬象的預設路由,是否可以使用策略路由(例如 iptables、ip 規則)來解決此問題?

謝謝

相關內容