5

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.200VLAN。(本地 IP 和 tcpdump 命令都使用 运行eth2.200,我只是在这个问题中更改了它以使其更简单。)基于这个答案可能是问题吗?

编辑#2:

netstat -ng当程序运行时显示eth2.200订阅了 224.0.0.1 和 6.7.8.9`。

tshark -i eth2.200 igmp1.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. 还有一个 infrequent 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

谢谢!

4

1 回答 1

7

最后!在 ServerFault 上发现了这个问题,它解决了同样的问题。基本上内核没有转发/过滤掉数据包,因为它认为源地址被欺骗了。

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

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

重新启动,一切正常。

于 2012-12-12T20:59:47.353 回答