如何使用 iptables 在 2 個不同的 LAN 之間轉發多播流量?
目標:
需要 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盒子
- 網關 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
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
orsmcroute
?
我剛剛
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
Debian
smcroute
軟體包是 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
一切正常。我希望它也可以工作,根據您的設置進行調整,儘管您可能還必須
smcroutectl join
告訴您的交換機它們應該正確轉發多播。所有相關界面上的多個tcpdump
終端視窗極大地幫助了調試。我發現以下資訊很有趣:
為了能夠設置多播路由,程序必須連接到核心中的多播路由套接字,當該套接字關閉時,這是在 UNIX 程序結束時自動完成的,核心會清除所有路由。
這意味著如果您打算使用核心的多播路由功能,您必須使用惡魔,而不是命令行工具。
對於靜態與動態路由,它說:
smcroute 的預期目的是在動態多播路由無法正常工作的情況下提供幫助。然而,動態多播路由協議幾乎在所有情況下都是首選解決方案。原因是它們能夠將第 3 層信令轉換為第 2 層,反之亦然(IGMP 或 MLD)。
最後,密切關注 LAN Messenger 生成的 TTL,請參閱最後的多播常見問題解答。