2009-12-09 31 views
1

我有一個綁定到eth0的應用程序,它將端口A上的UDP數據包發送到255.255.255.255。同時,我有一個UDP服務器綁定到eth0,0.0.0.0和端口A.在Linux上過濾UDP環回C

我想要做的是確保服務器不會接收應用程序生成的消息(純粹處理軟件由內核提供),但它會接收由網絡中其他主機生成的消息。

我無法更改UDP數據包的有效負載,也無法向其添加任何標頭。

我已經實現了一個解決方案,使用RTNETLINK獲取我所坐的機器的所有IP地址(並根據recvfrom()的地址進行過濾),但是我想知道是否可能有一個更簡單的清潔解決方案

編輯:我想過類似標記skb的東西 - 標籤在離開物理接口後會消失,但如果只是在軟件中路由,則不會。

任何想法?

+0

似乎它仍然不可能在Linux上:http://www.mail-archive.com/[email protected]/msg196866.html – Pawel

回答

1

如果您可以修補您的Linux內核,您可以使用setsockopt()選項來選擇是否要環回您要發送的廣播數據包。

這個patch正是爲了這個目的重複使用IP_MULTICAST_LOOP選項。

此外,您可以輕鬆地添加您自己的setsockopt()選項,也可以將其稱爲IP_BROADCAST_NO_LOOP,而不是「與」IP_MULTICAST_LOOP選項「混淆」。這可以保證你不會改變任何其他應用程序的行爲。

+0

我等待的答案!非常感謝你!不過,我已經在一週前找到了這個補丁 - 看到我的評論:P – Pawel

+0

@Pawel:啊,是的,你說的對,我的壞! –

0

您可以在有效負載上計算校驗和或CRC(更好)並對此進行過濾。

+0

這可能會導致無效行爲 - 完全可能我收到相同我剛剛發送的內容,但來自遠程主機。 – Pawel

+0

@Pawel:看起來你面對的是一個「不友好」的協議,至少可以說。祝你好運。 – jldupont

0

您可以在防火牆級別通過將數據包丟棄到源地址爲eth0的廣播地址端口A來執行此操作。

+0

這比我當前的解決方法更糟糕,因爲這需要root權限和其他配置。其實,我已經在我的軟件中做了防火牆。 – Pawel

+0

嗯,防火牆不是用戶級業務,不是一般情況。網絡堆棧在內核中實現是有原因的。這就是性能。在你的設置中,每個數據包向下和向上移動,至少有兩個副本。使用簡單的防火牆規則,您可以將「up」部分與副本一起剪切回用戶空間。看起來你的應用程序可以使用更好的設計。 –

+0

您提出的設計強制要求具有root權限並確保我的防火牆規則不會干擾系統的其餘部分 - 如果有一個進程也發送廣播並且*希望*具有回送會怎麼樣?當然,爲了設計的純粹性,我可以使用高級netfilter匹配,破解內核等,但我更喜歡簡單而通用的解決方案。另外,就設計而言,系統級防火牆並不是實現某些用戶空間程序所需功能的地方,但這僅僅是我的愚見。 – Pawel