目标:
需要lmc或“局域网信使”使用 iptables 在由 Linux 网关分隔的 2 个局域网上工作。
信息:
- 必须是“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盒子
- 网关电脑 = Ubuntu 14 服务器。 iptables 在 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
NAT表:
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -j MASQUERAD
我认为应该转发多播流量的规则:
-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
使用 tcpdump 监控网关的流量,当我更改 iptable 规则时,我从未看到多播流量通过。
iptables 会转发多播流量吗我知道了?
我是否需要使用多播路由守护程序或代理(例如pimd
或smcroute
)?
答案1
我刚刚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
Debiansmcroute
软件包是2.0.0版本,似乎不支持虚拟eth,所以我从以下位置安装了2.3.1版本smcroute主页。这组播路由指南的smcroute
也很有帮助。
我使用该ssmping
包来测试多播。我ssmpingd
在 ns2 中运行,同时ssmping -4 -I veth0b 10.0.1.1
从 ns1 进行 ping 操作。这些是使用 group 的源特定多播 (SSM) 232.43.211.234
,您还可以使用 测试任意源多播 (ASM) asmping
。我不知道 LAN Messenger 使用什么。
我在主命名空间中启用转发以允许单播 ping 请求通过,然后执行
smcroutectl add veth1a 10.0.1.1 232.43.211.234 veth0a
一切都很好。我希望它也能工作,根据您的设置进行调整,尽管您可能还必须smcroutectl join
告诉您的交换机它们应该正确转发多播。所有相关接口上的多个tcpdump
终端窗口极大地有助于调试。
我发现以下信息很有趣:
为了能够设置多播路由,程序必须连接到内核中的多播路由套接字,当该套接字关闭时(UNIX 程序结束时会自动完成),内核会清除所有路由。
这意味着如果您打算使用内核的多播路由功能,您必须使用恶魔,而不是命令行工具。
对于静态路由与动态路由,它表示:
smcroute 的预期目的是在动态多播路由无法正常工作的情况下提供帮助。然而,动态多播路由协议几乎在所有情况下都是首选解决方案。其原因是它们能够将第 3 层信令转换为第 2 层信令,反之亦然(IGMP 或 MLD)。
最后,密切关注 LAN Messenger 生成的 TTL,请参阅组播常见问题解答在最后。
答案2
好吧,看起来像iptables
独自的这不是要走的路。
我将尝试smcroute
和/或pimd
从 ubuntu 存储库。到目前为止,我还没有能够使任何一个工作。
使用smcroute:
iptables
-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 -p igmp -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 PREROUTING -d 239.255.100.100/32 -j TTL --ttl-set 64
smcroute 2.3.1来自穴居人。
提取到/opt
./configure
使用默认选项。
配置文件位于:
/usr/local/etc/smcroute.conf
#phyint olan1 enable ttl-threshold 1
phyint olan1 enable ttl-threshold 5
phyint slan1 enable ttl-threshold 5
mgroup from olan1 group 239.255.100.100
mgroup from slan1 group 239.255.100.100
mroute from olan1 group 239.255.100.100 to slan1
mroute from slan1 group 239.255.100.100 to olan
- ttl-threshold——这是最小阈值吗?
- 如果我的数据包上的 TTL 为 1,这是否意味着 phyint 将...忽略它。以防万一改为5。
sudo smcrouted
sudo smcroutectl show groups
GROUP (S,G) INBOUND
(*, 239.255.100.100) slan1
(*, 239.255.100.100) olan1
sudo smcroutectl show routs
ROUTE (S,G) INBOUND PACKETS BYTES OUTBOUND
(*, 239.255.100.100) slan1 0 0 olan1
(*, 239.255.100.100) olan1 0 0 slan1
(10.10.10.154, 239.255.100.100) slan1 2 344 olan1
(192.168.2.53, 239.255.255.250) olan1 4 776
(10.10.10.101, 239.255.100.100) slan1 1 32 olan1
(192.168.2.101, 239.255.100.100) olan1 1 32 slan1
(10.10.10.1, 239.255.100.100) slan1 2 64 olan1
不完全是每个人...
在 WinXP 多宿主电脑上必须更改路由:
route add 224.0.0.0 mask 240.0.0.0 10.10.10.153
需要使用接口号代替网卡IP地址...
- 指标变为 1。这是 TTL 问题吗...
sudo smcroutectl show routs
ROUTE (S,G) INBOUND PACKETS BYTES OUTBOUND
(*, 239.255.100.100) slan1 0 0 olan1
(*, 239.255.100.100) olan1 0 0 slan1
(192.168.2.53, 239.255.255.250) olan1 4 776
(10.10.10.153, 239.255.100.100) slan1 1 32 olan1
LAN Messenger 1.2.32 network preferences
- 连接超时(秒)——最大输出值
- 最大重试次数--最大输出值
在 Ubuntu 14 上使用 Upstart 将 smcroute 设为守护进程
/etc/init/smcroute.conf
# Upstart for custom compiled smcroute
## jc 2017 08 24
description "SMCRoute, a static multicast router"
author "jc"
# Stanzas
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
# When to start the service
# start on runlevel [2345]
start on (local-filesystems and net-device-up IFACE!=lo) or runlevel [2345]
# When to stop the service
#stop on runlevel [016]
stop on runlevel [!2345]
# Automatically restart process if crashed
expect fork
respawn
exec /usr/local/sbin/smcrouted -N -f /usr/local/etc/smcroute.conf -d 10 -l notice
一切似乎都有效。会让事情运行一段时间,随机重启和偶尔的网络中断,正常的事情。
去做
使 smcroute 成为守护进程使路由添加持久化- 验证 iptables 规则...是必需的
让Win7电脑看到子网