多播路由未链接到用户空间

多播路由未链接到用户空间

好的,我有一个用户空间应用程序需要从多播流量中获取数据,但是我似乎无法将流量从内核空间获取到应用程序可以利用数据的用户空间。我想知道对于 redhat,我是否可能缺少内核模块?正如我将在下面展示的那样,看起来我已经设置了所有内容来创建到用户空间的路由,但是当我创建路由时,它实际上并没有像我期望的那样创建任何类型的链接。

到目前为止我已经验证的内容:

sysctl file
# Kernel sysctl configuration file for Red Hat Linux

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth2.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476736

kernel.shmall = 4294967296

net.ipv4.icmp_echo_ignore_broadcasts = 0 #allow multicast through the kernel

所以如果我是正确的,我的内核不应该过滤流量。防火墙也被关闭,但是我确实修改了 iptable 规则以允许任何多播流量通过 INPUT 链我创建了一个route-eth2文件来创建我的路由

#create the persistent multicast route

224.0.0.0/4 via 0.0.0.0  dev eth2

我还将网关设置为 0.0.0.0,因为多播流量的目标和源之间没有路由器。这就是我缺乏多播经验的地方,我有一个软件,可以将 eth2 上的套接字连接到端口,并请求访问 224.0.0.70 上的多播组(仅供参考,该软件在不同的 Linux 机器相同操作系统和所有设备上使用多播之前已经工作过)我希望看到从我创建的子网 224.0.0.0/8 路由到我的多播地址 224.0.0.70 的某种链接,但至少现在情况并非如此。这是 ip route show 在打开程序之前的内容

10.50.100.0/24 dev eth2  proto kernel  scope link  src 10.50.100.3
192.168.11.0/24 dev eth3  proto kernel  scope link  src 192.168.11.3
//more stuff 
224.0.0.0/8 dev eth2
default via 149.97.48.3 dev eth0  proto static

打开程序后,我查看了 ip maddr,可以看到 224.0.0.70 显示在 eth2 上,这让我认为它已请求并加入了我相信的组,但是即使在 maddr 中看到此内容并使用 tcpdump 检查和验证我是将多播流量发送到该接口,我在用户方面看不到任何内容,也没有看到 ip route show 发生任何像我预期的变化。打开程序后显示ip路由

224.0.0.0/8 dev eth2

同样有趣的是,我没有 mroute 或 pimd 或 smcroute,我所看到的使用得相当多,但显然红帽尤其是红帽 6 不支持这些,所以 igmp 我“认为”是我要使用的,但我不知道如何使用我可以使用它,而不是启用它,我已经使用 ifconfig 完成并验证了它。

所以我认为我的路由创建有缺陷,或者可能我没有安装我需要的内核模块,以便完成将路由连接到程序?任何想法和澄清将不胜感激,谢谢。

答案1

我并不是真正的网络专家,但根据我的经验,启动并运行多播流量只需要以下几行:

sudo route add -net XXX.0.0.0 netmask 255.0.0.0 IFACE

其中 XXX 是子网,IFACE 是接口。这是我ip route show之前和之后的样子。

前:

default via 10.0.3.2 dev enp0s8 proto dhcp metric 109 
default via 192.168.14.1 dev enp0s3 proto dhcp metric 110 
10.0.3.0/24 dev enp0s8 proto kernel scope link src 10.0.3.15 metric 109 
169.254.0.0/16 dev enp0s8 scope link metric 1000 
192.168.14.0/24 dev enp0s3 proto kernel scope link src 192.168.14.146 metric 110 
192.168.56.0/24 dev enp0s9 proto kernel scope link src 192.168.56.102 metric 107

后:

default via 10.0.3.2 dev enp0s8 proto dhcp metric 109 
default via 192.168.14.1 dev enp0s3 proto dhcp metric 110 
10.0.3.0/24 dev enp0s8 proto kernel scope link src 10.0.3.15 metric 109 
169.254.0.0/16 dev enp0s8 scope link metric 1000 
192.168.14.0/24 dev enp0s3 proto kernel scope link src 192.168.14.146 metric 110 
192.168.56.0/24 dev enp0s9 proto kernel scope link src 192.168.56.102 metric 107 
224.0.0.0/8 dev enp0s3 scope link 

我也没有安装 pimd、smcroute 或 mroute 模块。如果您预计该端口上有流量,则可以通过socat.

我将对此进行更多讨论...如果您在尝试加入组之前没有正确配置路由并在程序中配置多播,则在尝试获得某个组的成员资格时,您应该会收到错误消息团体 (setsockopt( sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)))。

如果你能够加入该群组,那么这个要求就已经满足了。

您是否有专门为在软件中配置多播端口而编写的代码?

相关内容