2016-07-25 12 views
2

これは私の初めての生ソケットの使用です(ネットワークヘッダー内のフィールドを変更する必要があるので使用する必要があります)。私が読んだドキュメントやチュートリアルではパケットをスニッフィングするソリューションについて説明していますが、必要。私は、パケットを傍受し、処理してそれを宛先にさらに送るスクリプトを作成する必要があります。つまり、スクリプトが決定しない限り、パケットは宛先に到達しません。ネットワークパケットをrawソケットで傍受することはできますか?

学習するために、私はpingを検出し、単に「PING」を印刷する小さなプロトタイプを作成しました。パケットを傍受するときにpingが機能しないと思っています。パケットを宛先に送信するロジックは含まれていません。しかし、pingは動作しています(パケットをスニッフィング/ミラーリングしているようです)。私の目標は、スクリプト内でpingパケットが「トラップ」されていて、その方法を知らないということです。これは、誰かがどのように私は私の目標を達成するか、右文書に私を指すことができます説明でき

sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003)) 
sock.bind((eth0, 0)) 
packet = sock.recvfrom(65565) 
decode_eth(packet) 
decode_ip(packet) 

if (ipheader.ip_proto == 1): 
      print("\nPING") 

(私は簡単にするためのデコードを行う方法書き込まないよう)私は私の現在のPythonスクリプトでは何ですか?

答えて

0

あなたの説明は、あなたのタイトルが示唆しているものとは異なるようです。私の理解はあなたが受信し、変更し、場合によっては着信ネットワークパケットをドロップしたいということです。これはLinux上で行われます。その場合は、netfilter preroutingフックを使用することをお勧めします。これにより、よりシンプルな(そしてより安定した)ものになります。 Netfilterは十分に文書化されており、要件に関連する情報を含むすばらしい概要がhereで表示されます。重要な機能はnf_register_hook()です。this質問への答えを読んで、設定方法を知ってください。

0

Linuxボックスがルータ(ブリッジではない)として設定されているとします。 IP転送を有効にしているため、パケットはLinuxを通過します。

解決方法1::だから2つの解決策がある

無効にIPフォワーディング、その後、一つのインタフェースからパケットを受信し、適切なタスク(他のインターフェイスに転送するか、それをドロップ)を行います。

解決方法2:

使用NetFilterQueue

すると、あなたのLinuxボックス(私の例でのDebian/Ubuntuの)でそれをインストールします。

apt-get install build-essential python-dev libnetfilter-queue-dev 

使用iptables入力インターフェース(私の例ではeth0)からのパケットを送信する:

iptables -I INPUT -i eth0 -j NFQUEUE --queue-num 1 

ランQueue No.1に転送されたパケットを処理するこのスクリプト:

from netfilterqueue import NetfilterQueue 

def print_and_accept(pkt): 
    print pkt 
    pkt.accept() 

nfqueue = NetfilterQueue() 
nfqueue.bind(1, print_and_accept) 
try: 
    nfqueue.run() 
except KeyboardInterrupt: 
    print 

注意してくださいはパケットを廃棄します。また、すべてのパケットを受け入れ/ドロップする必要があります。

関連する問題