UDP багатоадресної передачі не працює


11

Multicast UDP на малиновому пі

Я недостатньо звузив речі, щоб знати, чи є моя проблема через debian, конкретно raspbian, чи я просто щось зовсім пропускаю.

У мене є програма python, яка використовує UDP багатоадресної передачі, щоб інформувати інші пристрої в мережі про те, що моя програма запущена та доступна за певною IP-адресою.

Група багатоадресної передачі 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  E.....@....f....
    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  

Чи можете ви забезпечити вихід netstat -gn на 2 хости?
UnX

Можливо, корисно: superuser.com/questions/324824/…
cpugeniusmv

Відповіді:


13

Я розумію, що ваш хост, 192.168.2.7 надсилає пакет багатоадресної передачі в групу 239.255.250.250 на порт 9131

ПРИМІТКА. Однак я припускаю, що сервери прослуховують порт 9131. Ви не надали інформацію про це.

З виводу ifconfig я бачу, що MULTICAST увімкнено і tcpdump це підтверджує.

Спочатку переконайтеся, що хост із серверами (той, хто отримує пакет багатоадресної передачі) приєднався до групи багатоадресної передачі.

Для кожного типу хостів сервера:

netstat -gn

Якщо ви бачите свою групу адрес, він приєднався до групи. Якщо ні, то або щось не в порядку з вашою серверною програмою або, можливо, налаштуваннями ядра.

Якщо сервер приєднався до групи, але ви не бачите жодного пакета, що надходить від клієнта, тоді перевірте на своєму маршрутизаторі, що ви включили igmp (ваш маршрутизатор повинен бути включений 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 неправильним чи ні (у моєму випадку вони відсутні)

Приклад пітонного коду з використанням багатоадресної передачі:

/programming/603852/multicast-in-python

ПРИМІТКА: Я використовував цей скрипт на debian raspi (а не raspbian і сервер отримував пакети через маршрутизатор - як налаштування вище - добре)

Посібник для Linux: http://stlinux.com/howto/network/short-guide

Cisco: http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst3750/software/release/12-2_52_se/configuration/guide/3750scg/swmcast.html#wp1024278


Дуже довга відповідь і найдрібніша частина - це те, що насправді виявилося проблемою. Згадані вами проблеми з усунення несправностей я вже робив, але це було після того, як я опублікував це. Все виглядало добре на сервері та клієнті. IGMP на маршрутизаторі була проблемою, але ця настройка була прихованою
Алекс

2
ваш опис був недостатньо зрозумілим, щоб дати чітку відповідь, тому я подумав, що можу написати міні-посібник з усунення несправностей.
UnX

1

Я помітив, що це також може бути проблемою з обладнанням та / або драйвером. Я без жодних проблем використовував UDP багатоадресної передачі (передачу та отримання) на своїх малинових програмах - з програмами C, Java та / або Python.

Однак я щойно дізнався, що UDP-приймач багатоадресної передачі НЕ ПРАЦЮЄ з приємним маленьким USB-нано-wifi-адаптером від EDIMAX - передача UDP (багатоадресної передачі) працює, а також отримує власні (локальні) повідомлення.

реквізити USB-накопичувачів від lsusb:

Прийом багатоадресної передачі UDP не працює: ID 7392: 7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]

UDP багатоадресна передача працює добре: ID 148f: 3070 Ralink Technology, Corp. RT2870 / RT3070 Бездротовий адаптер


також працює: ця палиця від ASUS з ID 0b05: 1791 ASUSTek Computer, Inc. Адаптер WL-167G v3 802.11n [Realtek RTL8188SU]
Майкл

0

Я зіткнувся з подібною проблемою, коли пакети надходили, і я міг їх бачити, tcpdumpале жодна програма не могла отримувати дані.

Проблема в цьому випадку полягала в тому, що я раніше iptablesдозволював трафік лише з моєї локальної підмережі, 192.168.0.0/24але, звичайно, 224.0.0.0/4замість цього надходить багатоадресна передача . Замість того, щоб відкривати всю підмережу (можливо, і не мати брандмауера тоді), я просто дозволив трафік з усіх хостів на конкретному порту UDP, який я використовував для багатоадресної передачі, і це виправило проблему.


0

Для нас був аналогічний випуск, коли групу групових повідомлень було приєднано добре, але повідомлення не надходили.

Ми перевірили налаштування igmp на маршрутизаторі, начебто в порядку.

Врешті-решт ми перейшли з використання багатоадресної адреси IPv6 до IPv4, і це вирішило її для цієї конкретної системи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.