2016-08-16 8 views
2

私はPython RAWソケットを使ってTCPハンドシェイクを実装しています。しかし、Linuxカーネルはこのプロトコルの特定の側面を処理しようとしているため、かなり面倒です。Python RAWソケットを使ったTCPハンドシェイク

たとえば、SYNパケットを送信すると、サーバーはSYN、ACKパケットで応答しました。カーネルはRSTパケットで自動的に応答し、接続をリセットします。今私はSYN、サーバーから送信されたACKパケットを受信し、それをプリントアウトしたい

-A OUTPUT -p tcp -m tcp --sport 999 --tcp-flags RST RST -j DROP 

:私は、私は次のiptableのルールを使用して、すべてのそのようなリセットパケットをドロップし、これを克服しました。私は次の操作を実行したときにしかし、私は何も受け取らない:

a = self.s.recvfrom(4096) 

私はソケットを使用してrecvをする前に、カーネルはSYN、ACKを落としていると思われます。誰も合理的な回避策を知っていますか?

+0

Scapyを使用することを検討しますか? https://github.com/secdev/scapy/ –

+0

scapyはSYN、ACKを復活させ解析することができますか?信じられないことに、このパケットはカーネルによって削除されたということでした。 – SivaDotRender

+0

私はそれをすべて最初からやり直すのではなく、使用できる(または少なくとも学ぶ)可能な高レベルライブラリとして提案しました。 –

答えて

1

あなたはlibpcapのを使用することができ、Pythonで、このモジュールのようだ:http://pylibpcap.sourceforge.net/またはこの1:https://pypi.python.org/pypi/pypcap

あなたがカーネルからのメッセージを受信するために登録することができPCAPで。アプリケーションから正しいフィルタを提供することで、カーネルからTCPセグメントを受け取ることができます。私はC言語でlibpcapを使っていますが、同じ方法で指定されたモジュールを使うことができると思います。私にとってはこれはアプリケーションからきわめて標準的な方法で扱うことができる最高のソリューションです。

カーネルがRSTで応答しないようにするには、iptablesを使用するソリューションが最適です。

1

誰かがより便利な解決策を考えたら、iptablesを使って入ってくるTCP Synパケットをnfqueueに渡すことです。 Nfqueueには既存のPython bindingsがあるので、それを使用することは問題ではありません。

考えられるのは、入ってくるすべてのTCP SynsをカーネルのTCP実装に達する前に捕捉することです。次に、これらのパケットをあなたのユーザランドアプリケーションが監視できるnfqueueに渡します。アプリケーションがnfqueueから取得するパケットごとに、パケット自体を処理するかどうか(すなわち、OSが関係する限りパケットをドロップするか)、それを通常のTCP実装に渡すかどうかを決定する必要があります(return a verdict)。

私はこのアプローチがうまくいくという事実は知っていますが、面倒です。

+0

これは私にとって最も合理的な解決策のようです。 – SivaDotRender

1

生のパケットでこれをすべて実行しているので、自分のMACアドレスとIPアドレスを作成するだけではどうですか?パケットを受信するには、アダプターをプロミスキャスモードにする必要がありますが、そうした場合、カーネルは着信パケットを「他のシステム」に送信されるように見せないようにしてください。これにより、気になるパケットを他のパケットからフィルタリングすることが簡単になります。

また、他のシステムがMACアドレスを見つけるためには、ARPに適切に応答する必要があります。 IPアドレスを取得するためにDHCPが必要な場合は、これらのやりとりも処理する必要があります。

関連する問題