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

別のプログラムから送信したパケットと、現在のすべてのマルチキャスト トラフィックの両方が表示されます。出力は次のようになります...

# 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.200VLAN ではありません。(ローカル IP と tcpdump コマンドはすべて で実行eth2.200されます。この質問では、簡単にするために変更しました。)この回答に基づいて、問題になる可能性がありますか?

編集#2:

netstat -ngプログラムの実行中はeth2.200、224.0.0.1 および 6.7.8.9 にサブスクライブされていることが示されます。

tshark -i eth2.200 igmp1.2.3.4 -> 6.7.8.9 IGMP 46 V2 Membership Report / Join group 6.7.8.9プログラムが最初に開始されたときに繰り返される 3 つを示します。プログラム プロセスが強制終了されると、 が表示されます1.2.3.4 -> 224.0.0.2 IGMP 46 V2 Leave group 6.7.8.91.2.3.1 -> 224.0.0.1 IGMP 60 V2 Membership Query, general1.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

ありがとうございました!

4

1 に答える 1

7

ついに!同じ問題に対処する ServerFault でこの質問を見つけました。基本的に、カーネルは送信元のアドレスがスプーフィングされていると考えたため、パケットを転送していませんでした / フィルタリングしていました。

/etc/sysctl.conf の設定を一致するように変更しました。

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

再起動し、すべてが機能します。

于 2012-12-12T20:59:47.353 に答える