web-dev-qa-db-ja.com

iptablesを使用して2つの異なるLAN間でマルチキャストトラフィックを転送するにはどうすればよいですか?

目標:

Iptablesを使用してLinuxゲートウェイによって分離された2つのLANで動作するには、lmcまたは "LAN Messenger" が必要です。

情報:

  • このプログラム「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サーバー。 LAN間でトラフィックを転送する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はマルチキャストトラフィックを転送しますかic?

pimdsmcrouteなどのマルチキャストルーティングデーモンまたはプロキシを使用する必要がありますか?

4
jc__

2つのネットワーク名前空間と2つの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をインストールしました。 smcrouteの-​​ マルチキャストルートhowto も非常に役立ちます。

ssmpingパッケージを使用してマルチキャストをテストしました。 ns1からssmping -4 -I veth0b 10.0.1.1を使用してpingを実行しているときに、ns2でssmpingdを実行しました。これらは、グループ232.43.211.234を使用したソース固有のマルチキャスト(SSM)です。asmpingを使用して、任意のソースマルチキャスト(ASM)をテストすることもできます。 LANメッセンジャーが何を使っているのかわかりません。

メインの名前空間で転送を有効にして、ユニキャストpingリクエストが通過できるようにしてから、

smcroutectl add veth1a 10.0.1.1 232.43.211.234 veth0a

そしてすべてがうまくいきました。マルチキャストを適切に転送するようにスイッチに通知するためにsmcroutectl joinが必要になる場合もありますが、これも機能し、セットアップに合わせて調整されます。関連するすべてのインターフェイスに複数のtcpdumpターミナルウィンドウがあると、デバッグに非常に役立ちます。

次の情報は興味深いものでした。

マルチキャストルートをセットアップできるようにするには、プログラムがカーネル内のマルチキャストルーティングソケットに接続する必要があります。ソケットが閉じられると、UNIXプログラムが終了すると自動的にソケットが閉じられ、カーネルがすべてのルートをクリーンアップします。

つまり、カーネルのマルチキャストルーティング機能を使用する場合は、コマンドラインツールではなくデーモンを使用する必要があります。

スタティックルーティングとダイナミックルーティングの場合、次のようになります。

Smcrouteの目的は、動的マルチキャストルーティングが適切に機能しない状況を支援することです。ただし、ほとんどの場合、ダイナミックマルチキャストルーティングプロトコルが推奨されるソリューションです。これは、レイヤ3シグナリングをレイヤ2に、またはその逆に(IGMPまたはMLD)変換する能力があるためです。

最後に、LANメッセンジャーによって生成されるTTLに注意してください。最後にある マルチキャストFAQ を参照してください。

4
dirkt

さて、iptablesaloneは進むべき道ではないようです。

Ubuntuリポジトリからsmcroutepimdを試します。これまでのところ、どちらの作品も作成できていません。

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 troglobitから。

/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では、マルチホームPCはルートを変更する必要がありました:

route add 224.0.0.0 mask 240.0.0.0 10.10.10.153

nic 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

すべてが機能しているようです。ランダムな再起動と時々のネットワーク停止、通常のものでしばらくの間物事を実行させます。

[〜#〜] todo [〜#〜]

  • Smcrouteをデーモンにする
  • ルートの追加を永続的にする
  • Iptablesルールを確認してください...が必要です
  • Win7 PCにサブネットを表示させる
1
jc__