jc_*_*c__ 5 iptables multicast
目标:
需要 lmc 或“LAN Messenger”才能使用 iptables 在由 Linux 网关分隔的 2 个LAN上工作。
信息:
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 会转发组播流量吗?
我是否需要使用多播路由守护进程或代理,例如pimd
或smcroute
?
我刚刚测试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 版。该组播路由HOWTO的smcroute
也是非常有帮助的。
我用这个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,请参阅最后的多播常见问题解答。