Raspberry PiのマルチキャストUDP
私の問題がDebian、特にRaspbianによるものなのか、それとも何かが完全に欠けているのかを知るのに十分な範囲を狭めていませんでした。
マルチキャストUDPを使用してアプリケーションが実行されており、特定のIPアドレスで使用できることをネットワーク上の他のデバイスに通知するPythonアプリケーションがあります。
UDPマルチキャストグループは239.255.250.250、ポートは9131です。 tcpdumpを実行すると、送信したいパケットが実際にデータを送信していることがわかりますが、ネットワーク上の他のコンピュータでは何も通過できないことがわかります。
同じマルチキャストグループとポートを持つ同じタイプの「ビーコン」を使用する他のデバイスがあり、これらのパケットが別のコンピュータを通過することがわかります。ルータにはファイアウォールがないため、現在では選択肢はありません。
実行方法を知っている基本的な診断は次のとおりです。間違ったudp chksumは役に立たないようですが、これについて何も知りません。
ifconfigの出力
eth0 Link encap:Ethernet HWaddr b8:27:eb:b2:79:12
inet addr:192.168.2.7 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1682 errors:0 dropped:0 overruns:0 frame:0
TX packets:1686 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:119105 (116.3 KiB) TX bytes:169570 (165.5 KiB)
アプリケーションの実行中にtcpdumpの出力
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
03:29:15.722653 IP (tos 0x0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 221)
192.168.2.7.33335 > 239.255.250.250.9131: [bad udp cksum 0xae84 -> 0xaabe!] UDP, length 193
0x0000: 4500 00dd 0000 4000 0111 cb66 c0a8 0207 [email protected]....
0x0010: efff fafa 8237 23ab 00c9 ae84 414d 5842 .....7#.....AMXB
0x0020: 3c4d 4143 2d41 4444 523d 6238 3a32 373a <MAC-ADDR=b8:27:
0x0030: 6562 3a62 323a 3739 3a31 323e 3c2d 5555 eb:b2:79:12><-UU
0x0040: 4944 3d32 3032 3438 3135 3937 3537 3734 ID=2024815975774
0x0050: 3930 3e3c 2d53 444b 436c 6173 733d 5574 90><-SDKClass=Ut
0x0060: 696c 6974 793e 3c2d 4d61 6b65 3d69 5275 ility><-Make=iRu
0x0070: 6c65 426f 783e 3c2d 4d6f 6465 6c3d 5265 leBox><-Model=Re
0x0080: 6d6f 7465 426f 783e 3c2d 5265 7669 7369 moteBox><-Revisi
0x0090: 6f6e 3d30 2e31 3e3c 2d50 6b67 5f4c 6576 on=0.1><-Pkg_Lev
0x00a0: 656c 3d47 4350 4b30 3032 3e3c 2d43 6f6e el=GCPK002><-Con
0x00b0: 6669 672d 5552 4c3d 6874 7470 3a2f 2f31 fig-URL=http://1
0x00c0: 3932 2e31 3638 2e32 2e37 3a38 303e 3c2d 92.168.2.7:80><-
0x00d0: 5374 6174 7573 3d52 6561 6479 3e Status=Ready>
^C
1 packet captured
1 packet received by filter
0 packets dropped by kernel
プログラム実行中のNetstat出力
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:31144 0.0.0.0:* 1510/dhclient
udp 0 0 0.0.0.0:33335 0.0.0.0:* 2089/python
udp 0 0 0.0.0.0:68 0.0.0.0:* 1510/dhclient
udp 0 0 192.168.2.7:123 0.0.0.0:* 1911/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1911/ntpd
答え1
あなたのホスト192.168.2.7は、ポート9131からマルチキャストパケットをグループ239.255.250.250に送信することを知っています。
注:しかし、サーバーがポート9131でリッスンしているとします。関連情報を提供していません。
ifconfig出力でMULTICASTが有効になっていることがわかり、tcpdumpはこれを確認します。
まず、サーバーを実行しているホスト(マルチキャストパケットを受信するホスト)がマルチキャストグループに参加していることを確認してください。
各サーバーホストで、次のように入力します。
netstat -gn
マルチキャストアドレスが表示されたら、グループに参加しました。そうでない場合は、サーバープログラムに問題があるか、カーネル設定に問題がある可能性があります。
サーバーがグループに参加してもクライアントからのパケットが表示されない場合は、アクティブなルーターを確認してください。免疫組織化学(ルーターはigmpをサポートする必要があります)
たとえば、Cisco ルータでは
enable
conf t
ip multicast-routing
For each interface involved.
int <NIC>
ip pim sparse-dense-mode
ルータでigmpが有効になっている場合は、パケットを追跡するデバッグ機能を見つけます。
サーバー側でパケットのキャプチャを開始します。
tcpdump -i <NIC> host 239.255.250.250
着信パケットが表示されない場合、マルチキャストパケットは転送されません(仮定)。
その後、クライアント側でマルチキャストパケットを送信します。問題を解決するには、以下のリンクのスクリプトを使用してください。
注:UDPパケットの形式が間違っているように見えるため、サーバーがパケットを読み取ることができるかどうかはわかりません。以下のリンクのスクリプトを使用して、tcpdumpのメッセージが誤った形式で表示されることを確認できます(私の場合はそうではありませんでした)。
マルチキャストを使用するPythonコードの例:
https://stackoverflow.com/questions/603852/multicast-in-python
注:私はこのスクリプトをdebian raspiで使用しています(raspbianではなく、サーバーは上記で設定したようにルーターを介してパケットを受信します)。
答え2
ハードウェアおよび/またはドライバの問題かもしれないことがわかりました。 C、Java、および/またはPythonプログラムを使用して、問題なくraspberryPIでマルチキャストUDP(送受信)を使用しています。
しかし、UDPマルチキャスト受信がEDIMAXの小さなUSBナノWiFiアダプタでは機能しないことがわかりました。 UDP(マルチキャスト)送信は、独自の(ローカル)メッセージの受信と同様に機能します。
lsusbのUSBスティックの詳細:
UDPマルチキャスト受信が機能しない:ID 7392:7811 Edimax Technology Co.、Ltd EW-7811Un 802.11nワイヤレスアダプタ[Realtek RTL8188CUS]
UDPマルチキャスト受信が正しく機能する:ID 148f:3070 Ralink Technology、Corp。 RT2870/RT3070ワイヤレスアダプタ
答え3
同様の問題がありましたが、パケットが入っていて見ることはできませんでしたが、tcpdump
どのプログラムもデータを受信できませんでした。
この場合の問題は、以前はiptables
ローカルサブネットからのトラフィックのみを許可していましたが、192.168.0.0/24
当然マルチキャストもローカルサブネットから出てくることです224.0.0.0/4
。サブネット全体を開くのではなく(おそらくファイアウォールも開かない)、マルチキャストに使用していた特定のUDPポートのすべてのホストからのトラフィックを許可することで問題を解決しました。
答え4
私たちにも同様の問題がありました。マルチキャストグループはうまく参加しましたが、メッセージは受信されませんでした。
ルータのigmp設定を確認した結果、すべてが大丈夫です。
最後に、IPv6マルチキャストアドレスの使用をIPv4に切り替えて、特定のシステムの問題を解決しました。