2012-03-12 13 views
3

ICMPパケットでメッセージを送信しようとしていますが、その方法はわかりません。ICMPパケットをソケット経由で送信するには?

これは私が現在持っているコードですが、明らかに動作しません:

s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) 
s.setsockopt(IPPROTO_IP, IP_HDRINCL, 1) 
s.settimeout(3.0) 
s.sendto("Hello!" + "\r\n", (server, 7)) 
msg = s.recvfrom(buff_size) 
s.close() 

私は文字列の場合は、サーバーからの回答を受信する必要があり、「こんにちは!」送信されますが、私はそれを取得しません。 「こんにちは!文字列は、データフィールドにカプセル化されます。

enter image description here

答えて

4

ICMPパケットを構築するには、rawソケットを使用してパケット全体を作成する必要があります。 struct moduleはこれに便利です。

第2に、最初の場所でrawソケットを使用するには、root権限で実行する必要があります(これは十分な条件ですが、私は100%確実ではありませんそれが必要条件であること)。 実行可能ファイルは、実行時にルートとして実行されるsetuid実行可能ファイルなので、これを行うことができます。 Linuxではスクリプトをsetuidにすることはできないので、CでPythonスクリプトを実行するラッパーsetuidプログラムを作成する必要があります。

1

私はSOCK_RAWはあなたがIPPROTO_ICMPにプロトコルフィールドを設定するという理由だけであなたのためのICMPデータグラムを起こっているとは思いません!自分でパケットを構築する必要があります。

pingのソースを確認してください。

GNU/Linuxオペレーティングシステムでpingを提供する2つの一般的なパッケージがあります。 1つはnetkitで、もう1つはiputilsです。 (netkit-comboは、netkitのユーティリティを1つにまとめたtarballです:telnet、FTP、...)* BSDのユーザーはおそらく独自のユーティリティを持っています。

関連する問題