2012-12-12 34 views
5

tcmpdump可以查看所有組播流量到eth2上的特定組和端口,但是我的Python程序不能。 Python程序,在Ubuntu 12.04上運行:在特定接口上接收組播數據

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

# Multicast port is 52122 
sock.bind(('', 52122)) 

# Interface eth2 IP is 1.2.3.4, multicast group is 6.7.8.9 
mreq = socket.inet_aton('6.7.8.9')+socket.inet_aton('1.2.3.4') 
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

while True: 
    print '\nwaiting to receive message' 
    data, address = sock.recvfrom(1024) 
    print data 

當我使用其他程序的多播數據包發送到ETH2,它的工作原理和打印數據包。但它無法看到所有當前的組播流量。如果我同一個端口和組作爲上述程序上eth2上運行的tcpdump:

sudo tcpdump -i eth2 host 6.7.8.9 and port 52122 

它看到我都從另一個程序和所有當前的多播流量發送的數據包。它的輸出看起來喜歡這個...

# Packet sent from my other program 
09:52:51.952714 IP 1.2.3.4.57940 > 6.7.8.9.52122: UDP, length 19 
# Packet send from the outside world 
09:52:52.143339 IP 9.9.9.9.39295 > 6.7.8.9.52122: UDP, length 62 

爲什麼我的程序從外界看到的數據包?我怎樣才能修改它(或其他)來解決這個問題?

編輯:

我應該提到,這要通過接口不是eth2eth2.200一個VLAN。 (本地IP和tcpdump命令都運行在eth2.200,我只是改變了這個問題,使其更簡單。)基於this answer這可能是問題嗎?

編輯#2:

在程序運行時顯示

netstat -ngeth2.200訂閱224.0.0.1和6.7.8.9`。

tshark -i eth2.200 igmp顯示當程序第一次啓動時重複三次1.2.3.4 -> 6.7.8.9 IGMP 46 V2 Membership Report/Join group 6.7.8.9。當程序進程終止時,它顯示1.2.3.4 -> 224.0.0.2 IGMP 46 V2 Leave group 6.7.8.9。還有一個不頻繁的1.2.3.1 -> 224.0.0.1 IGMP 60 V2 Membership Query, general,其中1.2.3.1是1.2.3.4的網關。

不知道是否會有所幫助,但路由表的樣子:

Destination  Gateway   Genmask   Flags MSS Window irtt Iface 
0.0.0.0   1.2.5.6   0.0.0.0   UG  0 0   0 eth1 
1.2.3.0   0.0.0.0   255.255.255.240 U   0 0   0 eth2.200 

謝謝!

+1

運行程序時'netstat -ng'說了什麼? –

+0

你不需要'mreq'上的struct.pack(「= 4sl」,...)嗎?參考文獻:[UdpCommunication](http://wiki.python.org/moin/UdpCommunication)。 –

+0

@NikolaiNFetissov:在eth2下運行時,它列出: 'eth2 1 23.13.16.41','eth2 2 6.7.8.9','eth2 1 224.0.0.1'。 23.13.16.41是我不久前試圖訂閱的另一個小組。 – Albeit

回答

7

終於!在ServerFault上找到this question,它解決了同樣的問題。基本上內核沒有轉發/正在過濾數據包,因爲它認爲源地址被欺騙了。

更改的設置/etc/sysctl.conf中匹配:

net.ipv4.conf.default.rp_filter = 0 
net.ipv4.conf.all.rp_filter = 0 
net.ipv4.ip_forward = 1 

重新啓動,一切正常。

+2

你的回答在沮喪2天后救了我! :) – tkarls

相關問題