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

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

目标:

需要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 会转发多播流量吗我知道了?

我是否需要使用多播路由守护程序或代理(例如pimdsmcroute)?

答案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电脑看到子网

相关内容