◆解決したい課題
UDP通信をスニッファしたい。
◆事象
kaliLinuxのターミナルでプログラム(sniffer2.py)を実行すると
以下エラーが出力される。

◆設定内容
udpclient.py
import socket client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client.sendto(b'12345',('127.0.0.1', 80)) data,addr = clientfrom(4096) print(data)
sniffer2.py
import socket sniff = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) sniff.bind(('192.168.11.3', 0)) sniff.setsockeopt(socket.IPPROTO_IP, socket.IP_HORINCL,1) print('Sniffer is Listenning!') print(niff.recvfrom(4096))
いろいろ調べたり試したりしているのですが、解決できません。
難しいです(>_<)
どなたかアドバイスいただけませんでしょうか。
よろしくお願いいたします。
追記
sniffer2.pyのIPアドレスを127.0.0.1に変更すると、想定通りスニッファできます。
> sniff.bind(('192.168.11.3', 0))
のIPアドレス、'192.168.11.3'はどこを指していますか。接続を待ち受けるサーバー自身(つまり、動かしているPC自身)のIPアドレスである必要があります。
ご回答ありがとうございます!dodox86さん☺
192.168.11.3は動かしているPC自身でございます。
> 192.168.11.3は動かしているPC自身でございます。
では、正しそうですね。こちらでWindows10 WSL/Ubuntu上で試した限りではIPアドレスが正しければエラーはおきませんでした。(python3.6.9)
# 自PCのIPアドレスで正しくbindした場合
>>> import socket
>>> sniff = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
>>> sniff.bind(('192.168.11.102', 0))
# 不正なIPアドレスの場合(同じエラー)
>>> sniff = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
>>> sniff.bind(('192.168.11.111', 0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 99] Cannot assign requested address
>>>
linuxカーネルの違いのせいもあるかもしれません。socketのオプションを変えるとエラーを回避できるかも、です。
再現までしていただき恐縮です。
今回VirtualBox上でkalilinuxを動かしているため、kalilinxに設定しているIPアドレスをsniffer.pyに設定する必要があったようです。
そして、その通りに設定しましたら、想定通りスニッファできるようになりました。
私の理解不足が招いた質問に対し、真摯にアドバイスしてくださり、ありがとうございました。
なるほど、いただいた回答にもとづいて解決されたと思いますので、BAを差し上げて、質問を閉じてもらえればと思います。
はい。その予定です。
ただ、1点だけ疑問がありまして、、
kalilinuxのネットワーク設定でブリッジモードに変更し、windows(192.168.11.3 /24)とkalilinux(192.168.11.5 /24)で同じセグメントにIPを割り当てており、双方向で通信できる状態なのです。
よって、192.168.11.5ではスニッファできて、192.168.11.3ではスニッファできない理由がわかりません。。。
bindしているのはどちらのIPアドレスですか。kalilinuxにとっては、NICがプロミスキャスモードで動いていないと、違う宛先のパケットはカーネルで処理されないと思います。
処理されない、と言うかそもそもNICがはじいてしまうので届かないというか。
bindさせているIP192.168.11.3を192.168.11.5に変更しました。
ふむふむ、kalilinuxではプロミスキャスモードは動いていないんですね。確かにwikipediaではプロミスキャスモード利用一覧にはVirtualBoxは記載されていますが、kalilinuxは記載されていないです。
アドバイスありがとうございます。
助かります!
> bindさせているIP192.168.11.3を192.168.11.5に変更しました。
では、192.168.11.5 ではスニッファできるということに合致していますね。wiresharkなど、その手の専門のパケットキャプチャーソフトは、ソフトからドライバーを介してNICのプロミスキャスモードをONにし、動作させます。質問者さんが同じセグメント内のあらゆるパケットを覗きたいのであれば、VirtualBoxの設定も含め、ソフト内からそのような操作をする必要があります。
今までプロミスキャスモードについてあまり意識しておりませんでした。
プロミスキャスモード設定できるんですね。
これを機にプロミスキャスモードの設定についても調べてみます。
とても勉強になります。ありがとうございました!????
ああ、でも今のネットワークのハブ(HUB)は頭の良いスイッチングハブがほぼ100%なので、NICをプロミスキャスモードにしてもブロードキャスト以外は別の宛先のパケットは自分には届かないと思います。(<ハブが適切な宛先に振り分けます)すっかり忘れていました。届かなくても「アレっ???」って思わないでください。(このコメントへのレスは不要です)
回答1件
あなたの回答
tips
プレビュー