如何使用 iptables 在 2 个不同的 LAN 之间转发多播流量?

jc_*_*c__ 5 iptables multicast

目标:

需要 lmc 或“LAN Messenger”才能使用 iptables 在由 Linux 网关分隔的 2 个LAN上工作。

信息:

  • 必须是这个程序“LAN Messenger”。
  • Lmc 使用多播地址 239.255.100.100:50000 查看用户,然后创建一个 tcp 连接进行聊天。
  • lan1 = olan1 = 192.168.2.0/24:网关是一个智能交换机“Linksys Etherfast 路由器”,过滤器组播被禁用。
  • lan2 = slan1 = 10.10.10.0/24:网关是linux box
  • 网关 pc = Ubuntu 14 服务器。iptables 在局域网之间转发一些流量。

iptable 规则:

过滤表:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -i slan1 -o olan1 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m iprange --src-range 192.168.2.100-192.168.2.254 -j ACCEPT
-A FORWARD -i olan1 -o slan1 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i olan1 -o slan1 -p tcp -m tcp --dport 9696 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i olan1 -o slan1 -p tcp -m tcp --dport 50000 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i olan1 -o slan1 -p udp -m udp --dport 50000 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 224.0.0.0/4 -d 224.0.0.0/4 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -p igmp -j ACCEPT
-A FORWARD -i olan1 -o slan1 -j DROP
Run Code Online (Sandbox Code Playgroud)

自然表:

-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -j MASQUERAD
Run Code Online (Sandbox Code Playgroud)

我认为应该转发多播流量的规则:

-A FORWARD -i olan1 -o slan1 -p tcp -m tcp --dport 50000 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i olan1 -o slan1 -p udp -m udp --dport 50000 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 224.0.0.0/4 -d 224.0.0.0/4 -j ACCEPT
-A FORWARD -p igmp -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

使用 tcpdump 监控网关的流量,当我更改 iptable 规则时,我从未看到多播流量通过。

iptables 会转发组播流量吗?

我是否需要使用多播路由守护进程或代理,例如pimdsmcroute

dir*_*rkt 5

我刚刚测试smcroute了两个网络命名空间和两veth对。设置:

ns1         <-- main namespace -->    ns2
10.0.0.1 -- 10.0.0.254  10.0.1.254 -- 10.0.1.1
veth0b      veth0a          veth1a    veth1b
Run Code Online (Sandbox Code Playgroud)

Debiansmcroute软件包是 2.0.0 版,似乎不支持虚拟 eth,所以我从smcroute 主页安装了 2.3.1 版。该组播路由HOWTOsmcroute也是非常有帮助的。

我用这个ssmping包来测试多播。我ssmpingd在 ns2 中运行,同时ssmping -4 -I veth0b 10.0.1.1从 ns1 ping 。这些是使用 group 的特定于源的多播 (SSM) 232.43.211.234,您还可以使用asmping. 我不知道 LAN Messenger 使用什么。

我在主命名空间中启用了转发以允许单播 ping 请求通过,然后做了

smcroutectl add veth1a 10.0.1.1 232.43.211.234 veth0a
Run Code Online (Sandbox Code Playgroud)

一切正常。我希望它也能工作,并根据您的设置进行调整,但您可能还smcroutectl join必须告诉您的交换机他们应该正确转发多播。tcpdump所有相关界面上的多个终端窗口极大地有助于调试。

我发现以下信息很有趣:

为了能够设置多播路由,程序必须连接到内核中的多播路由套接字,当该套接字关闭时,内核会在 UNIX 程序结束时自动完成所有路由。

这意味着如果您打算使用内核的多播路由功能,您必须使用恶魔,而不是命令行工具。

对于静态与动态路由,它说:

smcroute 的预期目的是在动态多播路由无法正常工作的情况下提供帮助。然而,动态组播路由协议几乎在所有情况下都是首选解决方案。这样做的原因是它们能够将第 3 层信令转换为第 2 层,反之亦然(IGMP 或 MLD)。

最后,请密切注意 LAN 信使产生的 TTL,请参阅最后的多播常见问题解答