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
Спасибо!