簡體   English   中英

在特定接口上接收組播數據

[英]Receiving multicast data on specific interface

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

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

為什么我的程序看不到來自外界的數據包? 如何修改它(或其他東西)來解決這個問題?

編輯:

我應該提到,這個接口不是eth2而是eth2.200是VLAN。 (本地IP和tcpdump命令都使用eth2.200運行,我只是在這個問題中改變它以使其更簡單。)基於這個答案可能是問題?

編輯#2:

netstat -ng在程序運行時顯示eth2.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

謝謝!

最后! 在ServerFault上找到了解決同樣問題的這個問題 基本上,內核沒有轉發/過濾掉數據包,因為它認為源地址是欺騙性的。

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

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

重新啟動,一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM