2011-06-11 100 views
0

我有2個基於Linux的系統 - 一個帶2個接口(1個LAN,1個調制解調器)和一個服務器的客戶端。
我打開2個UDP套接字,並使用setsockopt和SO_BINDTODEVICE將每個套接字綁定到它的接口。
然後我通過每個套接字發送一條消息,從客戶端到服務器。
他們都到達服務器。服務器套接字讀取它們,並向它們中的每一個發送回覆。
然後我嘗試讀取客戶端上的服務器回覆。
但是,只有1個回覆。

此外,如果我運行tcpdump,我看到這兩個答覆是在他們相關的接口上,在他們離開的同一個端口上接收到的。然而,只有其中一個到達插座。另一個丟失了?

「丟失」數據包不是隨機的,而是「非」默認數據包。如果我的路由表爲空,則調制解調器丟失。如果我從調制解調器接口添加到服務器ip的路由,丟失的數據包將成爲局域網的一部分。

然而,他們總是到達服務器,總是返回,始終在tcpdump中看到,但1永遠不會到達套接字。怎麼可能?通過多個接口發送/接收數據

+0

我們需要了解您如何設置路由。 – ninjalj 2011-06-11 11:31:53

回答

2

有一個名爲rp_filter(反向路徑驗證過濾器)的ipv4網絡配置參數。基本上,如果對數據包的回覆不會出現這個數據包的接口,那麼這是一個僞造的數據包,應該被忽略。這就是爲什麼當我在tcpdump上看到數據包時,它從未到達套接字。禁用它做了伎倆。

sysctl -w net.ipv4.conf.all.rp_filter=0 
sysctl -w net.ipv4.conf.eth0.rp_filter=0 
sysctl -w net.ipv4.conf.ppp0.rp_filter=0