我正在尝试在一台机器上测试一些多播代码。我正在尝试通过环回设备 (lo) 而不是默认的 eth1 发送数据包。谷歌搜索不断出现咒语
route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
ifconfig lo multicast
但即使执行此操作后,数据包仍然通过 eth1 发出。示例代码(Python)
#!/usr/bin/env python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'hello world', ('225.100.101.0', 8888))
输出来自tcpdump -i any 'udp port 8888'
:
10:28:28.957679 IP 192.168.1.104.51159 > 225.100.101.0.8888: UDP, length 11
其中 192.168.1.104 是 eth1 的主机地址。我知道我可以使用 IP_MULTICAST_IF 套接字选项来强制它(并且这确实有效),但我更希望能够在计算机上设置一次路由策略,而不是在每个进行多播的应用程序中设置路由策略。
我正在运行带有内核 3.13.0-68-generic 的 Ubuntu 14.04。
答案1
事实证明,在 tcpdump 中查看 IP 地址是有误导性的:它似乎总是使用 192.168.1.104 作为源地址,即使在通过环回发送数据包时也是如此。当指定 tcpdump 的接口时,我可以知道实际使用的是哪个接口。该路线有时确实有效。这个问题描述了它不起作用的情况。