2012-12-12 3 views
5

tcmpdumpがeth2の上で特定のグループおよびポートへのすべてのマルチキャストトラフィックを表示することができ、特定のインターフェイス上でマルチキャストデータを受信するが、私のPythonプログラムはできません。 Ubuntuの12.04で実行されているPythonプログラム、:

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をするマルチキャストパケットを送信するために別のプログラムを使用する場合、それが動作してパケットを出力します。しかし、現在のマルチキャストトラフィックはすべて表示されません。私は上記のプログラムと同じポートとグループでのeth2上でtcpdumpを実行する場合:

sudo tcpdump -i eth2 host 6.7.8.9 and port 52122 

それは別のプログラムから、私が送るパケットと現在のすべてのマルチキャストトラフィックの両方を見ています。それはこのように見える出力です...

なぜ私のプログラムは外部からのパケットを見ることができませんか?これを修正するにはどうすればいいですか?

編集:

私が言及している必要があり、これはオーバー行くインターフェイスはVLANないeth2けどeth2.200です。 (ローカルIPとのtcpdumpコマンドは、私はこの質問には、それを簡単にすることに変更し、eth2.200を持つすべての実行されます。)問題がある可能性がthis answerに基づいて?

編集#2:

netstat -ngプログラムが224.0.0.1と6.7.8.9`に加入してショーをeth2.200実行されています。

tshark -i eth2.200 igmpは、プログラムの最初の起動時に3が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 

ありがとうございます!最後に

+1

あなたがプログラムを実行しながら、 'netstatの-ng'は何と言っていますか? –

+0

'mreq'に' struct.pack( "= 4sl"、...) 'は必要ありませんか?参考:[UdpCommunication](http://wiki.python.org/moin/UdpCommunication)。 –

+0

@NikolaiNFetissov:実行中、eth2の下に、それが一覧表示されます: 'eth2の1 23.13.16.41'、' eth2を2 6.7.8.9'、 'eth2を1 224.0.0.1'。 23.13.16.41はもう少し前に購読しようとした別のグループです。 – Albeit

答えて

7

! ServerFaultで同じことに対処するthis questionが見つかりました。基本的に、カーネルは、ソースアドレスがなりすましであると考えていたため、パケットを転送していない/フィルタリングしていませんでした。

が一致するに/etc/sysctl.confに設定を変更:

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

再起動し、すべてが動作します。

+2

あなたの答えは2日間の欲求不満の後で私を助けました! :) – tkarls