Nano Hash - криптовалюты, майнинг, программирование

Получение многоадресных данных на определенном интерфейсе

tcmpdump может просматривать весь многоадресный трафик для определенной группы и порта на eth2, но моя программа Python не может. Программа Python, работающая в Ubuntu 12.04:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Multicast port is 52122
sock.bind(('', 52122))

# Interface eth2 IP is 1.2.3.4, multicast group is 6.7.8.9
mreq = socket.inet_aton('6.7.8.9')+socket.inet_aton('1.2.3.4')
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:
    print '\nwaiting to receive message'
    data, address = sock.recvfrom(1024)
    print data

Когда я использую другую программу для отправки многоадресного пакета на eth2, она работает и печатает пакет. Но он не видит весь текущий многоадресный трафик. Если я запускаю tcpdump на eth2 с тем же портом и группой, что и вышеприведенная программа:

sudo tcpdump -i eth2 host 6.7.8.9 and port 52122

он видит как пакеты, которые я отправляю из другой программы, так и весь текущий многоадресный трафик. Вывод выглядит так...

# Packet sent from my other program
09:52:51.952714 IP 1.2.3.4.57940 > 6.7.8.9.52122: UDP, length 19
# Packet send from the outside world
09:52:52.143339 IP 9.9.9.9.39295 > 6.7.8.9.52122: UDP, length 62

Почему моя программа не видит пакеты из внешнего мира? Как я могу изменить это (или что-то еще), чтобы исправить это?

Редактировать:

Я должен был упомянуть, что этот интерфейс не eth2, а eth2.200 VLAN. (Все команды локального IP-адреса и tcpdump запускаются с eth2.200, я просто изменил это в этом вопросе, чтобы сделать его проще.) На основе этого ответ в чем может быть проблема?

Редактировать № 2:

netstat -ng во время работы программы показывает, что eth2.200 подписан на 224.0.0.1 и 6.7.8.9`.

tshark -i eth2.200 igmp показывает три повторяющихся 1.2.3.4 -> 6.7.8.9 IGMP 46 V2 Membership Report / Join group 6.7.8.9 при первом запуске программы. Когда процесс программы убит, он показывает 1.2.3.4 -> 224.0.0.2 IGMP 46 V2 Leave group 6.7.8.9. Также встречается нечастый 1.2.3.1 -> 224.0.0.1 IGMP 60 V2 Membership Query, general, где 1.2.3.1 — это шлюз 1.2.3.4.

Не уверен, что это поможет, но таблица маршрутизации выглядит так:

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         1.2.5.6         0.0.0.0         UG        0 0          0 eth1
1.2.3.0         0.0.0.0         255.255.255.240 U         0 0          0 eth2.200

Спасибо!


  • Что говорит netstat -ng, когда вы запускаете свою программу? 12.12.2012
  • Разве вам не нужен struct.pack("=4sl", ...) на mreq? Ссылка: UdpCommunication. 12.12.2012
  • @NikolaiNFetissov: Во время работы под eth2 в нем перечислены: eth2 1 23.13.16.41, eth2 2 6.7.8.9, eth2 1 224.0.0.1. 23.13.16.41 — еще одна группа, на которую я недавно пытался подписаться. 12.12.2012
  • @Steve-o: я тоже использовал это, без разницы. 12.12.2012
  • Я предполагаю, что эти многоадресные адреса предназначены только для примера, верно? Они не являются действительными многоадресными адресами. 12.12.2012
  • @Neal: Да, это примеры. Настоящие версии все действительны. 12.12.2012
  • Что еще слушают в этой группе? 12.12.2012
  • @ Хотя когда вы запускаете свое приложение Python, видите ли вы, что сообщения о присоединении IGMP отправляются через eth2? 12.12.2012
  • @ Нил и Николай, я перезапустил сервер, чтобы ничего больше не работало, и опубликовал очищенные ответы на ваш вопрос в качестве изменений в исходном вопросе. 12.12.2012

Ответы:


1

Ну наконец то! Нашел этот вопрос на ServerFault, который касается того же самого. По сути, ядро ​​​​не пересылало/отфильтровывало пакеты, потому что считало исходный адрес поддельным.

Изменены настройки в /etc/sysctl.conf, чтобы они соответствовали:

net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward = 1

Перезагрузил и все работает.

12.12.2012
  • Ваш ответ спас меня после 2 дней разочарования! :) 24.05.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..