LinuxカーネルがマルチキャストUDPパケットを通過しない


35

最近、新しいUbuntu Server 10.04をセットアップしましたが、マルチキャストグループに参加した後でも、UDPサーバーがインターフェイスに送信されたマルチキャストデータを表示できなくなっていることに気付きました。他の2台のUbuntu 8.04.4 LTSマシンでもまったく同じセットアップを行っており、同じマルチキャストグループに参加した後にデータを受信するのに問題はありません。

イーサネットカードはBroadcom netXtreme II BCM5709であり、使用されるドライバーは次のとおりです。

b $ ethtool -i eth1
driver: bnx2
version: 2.0.2
firmware-version: 5.0.11 NCSI 2.0.5
bus-info: 0000:01:00.1

smcrouteを使用して、マルチキャスト登録を管理しています。

b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71

グループに参加すると、ip maddrに新しく追加された登録が表示されます。

b$ ip maddr

    1:  lo
        inet  224.0.0.1
        inet6 ff02::1
    2:  eth0
        link  33:33:ff:40:c6:ad
        link  01:00:5e:00:00:01
        link  33:33:00:00:00:01
        inet  224.0.0.1
        inet6 ff02::1:ff40:c6ad
        inet6 ff02::1
    3:  eth1
        link  01:00:5e:25:36:47
        link  01:00:5e:25:36:3e
        link  01:00:5e:25:36:3d
        link  33:33:ff:40:c6:af
        link  01:00:5e:00:00:01
        link  33:33:00:00:00:01
        inet  233.37.54.71 <------- McastGroup.
        inet  224.0.0.1
        inet6 ff02::1:ff40:c6af
        inet6 ff02::1

これまでのところ、このマルチキャストグループのデータを受信して​​いることがわかります。

b$ sudo tcpdump -i eth1 -s 65534 host 233.37.54.71
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65534 bytes
09:30:09.924337 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
09:30:09.947547 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
09:30:10.108378 IP 192.164.1.120.58866 > 233.37.54.71.15574: UDP, length 268
09:30:10.196841 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
...

インターフェイスがmcastパケットを受信して​​いることも確認できます。

b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33

ここに問題があります。単純なルビーUDPサーバーを使用してトラフィックをキャプチャしようとすると、データがゼロになります!ポート15572で送信されたデータを読み取り、最初の2文字を出力する単純なサーバーを次に示します。これは、2つの8.04.4 Ubuntuサーバーで機能しますが、10.04サーバーでは機能しません。

require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
  text, sender = s.recvfrom(2)
  puts text
end

ルビーで作成されたUDPパケットをローカルホストに送信すると、サーバーはそれを受信し、最初の2文字を出力します。したがって、上記のサーバーが正常に機能していることがわかります。

irb(main):001:0> require 'socket'
=> true
irb(main):002:0> s = UDPSocket.new
=> #<UDPSocket:0x7f3ccd6615f0>
irb(main):003:0> s.send("I2 XXX", 0, 'localhost', 15572)

プロトコル統計を確認すると、InMcastPktsが増加していないことがわかります。同じネットワーク上の他の8.04サーバーでは、10秒で数千のパケットを受信しました。

b $ netstat -sgu ; sleep 10 ; netstat -sgu
IcmpMsg:
    InType3: 11
    OutType3: 11
Udp:
    446 packets received
    4 packets to unknown port received.
    0 packet receive errors
    461 packets sent
UdpLite:
IpExt:
    InMcastPkts: 4654 <--------- Same as below
    OutMcastPkts: 3426
    InBcastPkts: 9854
    InOctets: -1691733021
    OutOctets: 51187936
    InMcastOctets: 145207
    OutMcastOctets: 109680
    InBcastOctets: 1246341
IcmpMsg:
    InType3: 11
    OutType3: 11
Udp:
    446 packets received
    4 packets to unknown port received.
    0 packet receive errors
    461 packets sent
UdpLite:
IpExt:
    InMcastPkts: 4656  <-------------- Same as above
    OutMcastPkts: 3427
    InBcastPkts: 9854
    InOctets: -1690886265
    OutOctets: 51188788
    InMcastOctets: 145267
    OutMcastOctets: 109712
    InBcastOctets: 1246341

インターフェイスを無差別モードに強制しても、何も変わりません。

この時点で立ち往生しています。カーネル構成でマルチキャストが有効になっていることを確認しました。おそらく、チェックする必要がある他の設定オプションがありますか?

b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y

ここからどこに行くべきかについての考えはありますか?


図を移動します。新しい質問を入力します。関連するアルゴリズムはこの質問の存在を喜んで示していますが、意味のある答えはありません。ブー:(。
VxJasonxV

賞金をどのくらい正確に授与するかはわかりません。同僚が問題を発見し、なぜそれが起こったのかを見つけました。賞金の授与方法についての提案を喜んで歓迎します。
VxJasonxV

あなたはまだ周りにいますか?いくつか質問があります。
VxJasonxV

私にもこの問題があります。親愛なるバッキング、あなたはそれを解決しますか?

この問題が発生した他の人に-修正が必要な2-3のO / S設定があるため、この質問に関するすべての回答をお読みください。私たちは、変更することで、この問題を解決rp_filterし、/proc/sys/net/ipv4/icmp_echo_ignore_broadcastsそして、それが仕事を始めました。
サムゴールドバーグ

回答:


35

この例では、Maciejとは異なるsysctlパラメーターによって問題が解決されました。

OP(buecking)の代弁者ではないことに注意してください。基本的な詳細(ユーザーランドにマルチキャストトラフィックがない)に関連する問題があるため、この投稿に出ました。

受信サーバーのインターフェイスに(通常)直接接続されているアプライアンスから、4つのマルチキャストアドレスに送信されたデータと、マルチキャストアドレスごとに一意のポートを読み取るアプリケーションがあります。

未知の理由で不審に失敗したときに、このソフトウェアを顧客サイトに展開しようとしました。このソフトウェアをデバッグしようとすると、すべてのシステムコールが検査され、最終的にはすべて同じことがわかりました。

当社のソフトウェアはデータを要求しますが、OSは一切提供しません。

マルチキャストパケットカウンターが増加し、tcpdumpはトラフィックがボックス/特定のインターフェイスに到達したことを示しましたが、何もできませんでした。SELinuxは無効で、iptablesは実行されていましたが、どのテーブルにもルールがありませんでした。

困った、私たちはいた。

ランダムに調べてみると、sysctlが処理するカーネルパラメーターについて考え始めましたが、文書化された機能は特に関連していないか、マルチキャストトラフィックに関係する場合は有効になっています。ああ、そしてifconfigは機能行に「MULTICAST」をリストしました(up、broadcast、running、multicast)。好奇心から見ていた/etc/sysctl.conf。「見よ、この顧客のベースイメージには、下部に追加の行がいくつか追加されていました。

私たちの場合、顧客はを設定していましたnet.ipv4.all.rp_filter = 1。rp_filterはルートパスフィルタであり、このボックスに到達できなかったすべてのトラフィックを(私が理解しているように)拒否します。送信元IPがスプーフィングされていると考えられるネットワークサブネットホッピング。

さて、このサーバーは192.168.1 / 24サブネット上にあり、マルチキャストトラフィックのアプライアンスのソースIPアドレスは10. *ネットワークのどこかにありました。したがって、フィルターは、サーバーがトラフィックに対して意味のあることを実行できないようにしました。

顧客によって承認されたいくつかの調整。net.ipv4.eth0.rp_filter = 1そしてnet.ipv4.eth1.rp_filter = 0、私たちは幸せに走っていました。


2
これはうまくいきました!rp_filter私たちの10ギガビット・ネットワーク・インタフェースのためには、私たちのUDPマルチキャストパケットの全てをダンプました。フィルターをオフにすると、すべてが流れます。
-chrisaycock

UbuntuレシーバーのtunデバイスでAMTマルチキャストを介したストリーミングを設定する際に問題が発生し、tcpdumpを介してデバイスにパケットが配信されるのを見ることができましたが、アプリケーションはストリーミングを望んでいません。この投稿は私たちを救った!
ソフトウェアエンジニア

2
Ubuntu 14.04で実行すると、これもを設定して初めて機能しましたnet.ipv4.all.rp_filter = 0。具体的には、マルチキャストデータがeth2に到着すると、との両方を設定する必要がnet.ipv4.eth2.rp_filter = 0ありましたnet.ipv4.all.rp_filter = 0
Tホーク

4

TL / DRまた、マルチキャストがVLANから来ていないことを確認してください。tcpdump -e彼らが行うかどうかを判断するのに役立ちます。

公平を期すために、誰かがマルチキャストをユーザーランドに到達させないようにするためのチェックリストを含むページを作成する必要があります。私はこれに数日間苦労してきましたが、当然のことながらウェブ上で見つけることができるものは何も助けませんでした。

でパケットを見ることができるだけでなくtcpdump、実際には他のプロデューサー向けに他のマルチキャストパケットを別のインターフェイスで受信することができました。マルチキャストを受信できるかどうかをテストするために使用することになったコマンドは次のとおりです。

$ GRP=224.x.x.x # set me to the group
$ PORT=yyyy # set me to the receiving port
$ IFACE=mmmm # set me to the name or IP address of the interface
$ strace -f socat -  UDP4-DATAGRAM:$GRP:$PORT,ip-add-membership=$GRP:$IFACE,bind=0.0.0.0:$PORT,multicast-loop=0

理由straceここでは、私が実際に作ることができなかったということですsocatstdoutにパケットをプリントアウトし、しかしでstraceあれば、出力あなたがはっきりと見ることができますsocatバインドされたソケット(それは初期のカップルの後にそれ以外の場合はミュートになるだろうから、実際のデータを受信しているselect通話)

  • rp_filtersysctl-適用されず、システムは同じIPネットワーク上にあります(私はそれらを0すべて同じに1設定し、少なくともUbuntuの場合はデフォルト設定になっているようです)。
  • firewalls / etc-受信システムにはファイアウォールがありません(パケットがファイアウォールで保護されていればtcpdumpに表示されるとは思いませんが、ファイアウォールがおかしい場合は可能だと思います)
  • IP /マルチキャストルーティングと複数のインターフェイス-正しいインターフェイスでグループに明示的に参加しました
  • 奇抜なネットワークハードウェア-これは私の最後の手段でしたが、一部のラップトップをIntel NUCに変更しても解決しませんでした。これは、私が肘をかみ、これをSEに投稿し始めたところです。
  • 私の場合の問題は、これらのマルチキャストパケットを生成する専用ハードウェアによるVLANの使用でした。これが問題かどうかを確認するには、必ずに-eフラグを含めてtcpdump、vlanタグを確認してください。ユーザーランドがこれらのパケットを取得する前に、インターフェイスを正しいVLANに設定する必要があります。実際のところ、マルチキャストプロデューサーはpingを実行せず、ARPの応答を明確に見ることができますが、ARPキャッシュにアクセスすることさえできませんでした。

VLANで実行するには、このリンクがマルチキャストルーティングの構成に役立つ場合があります。(残念ながら私はこれが初めてなので、レピュテーションでは答えを追加できません。したがって、この編集です。)

ここに私がやったことがあります(必要に応じてsudoを使用してください):

ip link add link eth0 name eth0_100 type vlan id 100
ip addr add 192.168.100.2/24 brd 192.168.100.255 dev eth0_100
ip link set dev eth0_100 up
ip maddr add 01:00:5e:01:01:01 dev eth0_100
route -n add -net 224.0.0.0 netmask 240.0.0.0 dev eth0_100

このように、vlan id 100のvlanトラフィック用に作成された場合、追加のインターフェイス。vlanipは不要な場合があります。次に、新しいインターフェイスにマルチキャストアドレスが構成され(01:00:5e:01:01:01は239.1.1.1のリンク層アドレスです)、すべての着信マルチキャストトラフィックはeth0_100にバインドされます。また、上記の回答で可能なすべての手順を実行しました(iptables、rp_filterなどを確認してください)。


@Gero:マルチキャストルートを追加すると、着信マルチキャストではなく発信マルチキャストが設定されます。マルチキャストIPアドレスをインターフェイスに直接バインドするべきではありません。ファンキーなことをしていない限り、通常はアプリケーションの仕事です。
パヴェルヴェセロフ

2

次の設定を試してみてください。

proc

echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

sysctl.conf

sed -i -e 's|^net.ipv4.icmp_echo_ignore_broadcasts =.*|net.ipv4.icmp_echo_ignore_broadcasts = 0|g' /etc/sysctl.conf

これらは、RHELでマルチキャストを有効にするために使用されています。

ファイアウォールがマルチキャストトラフィックを許可していることを確認したい場合があります。再びRHELで次を有効にしました:

# allow anything in on multicast addresses
-A INPUT -s 224.0.0.0/4 -j ACCEPT
-A INPUT -p igmp -d 224.0.0.0/4 -j ACCEPT
# needed for multicast ping responses
-A INPUT -p icmp --icmp-type 0 -j ACCEPT

「ブロードキャスト」オプションは「マルチキャスト」にも適用されますか?
レイドヴァルト

0

マネージドスイッチを使用していますか?一部には、「ブロードキャストストーム」またはその他のマルチキャストの問題を防ぐオプションがあります。これにより、特定のタイプのパケットを防ぐことができます。スイッチのドキュメントをご覧になることをお勧めします。


0
s.bind("", 15572)

について)わかっている ""?マルチキャストIPアドレスを使用してバインドしないのはなぜですか?


空のホストアドレスは、一般に「すべてのインターフェイス」を意味します。
VxJasonxV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.