Linux 忽略环回上的多播路由

Linux 忽略环回上的多播路由

我正在尝试在一台机器上测试一些多播代码。我正在尝试通过环回设备 (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 的接口时,我可以知道实际使用的是哪个接口。该路线有时确实有效。这个问题描述了它不起作用的情况。

相关内容