2012-01-05 11 views
2

私はPythonでプラットフォームを作成しています(プラットフォームはLinuxです)。タスクの1つはライブTCPストリームをキャプチャし、各行に機能を適用することです。現在、私はこれが(の/ etc/sudoersファイルに適切なエントリで)非常によく動作しますPythonで純粋にtcpflow機能(tcpストリームに従う)を達成する方法

import subprocess 
proc = subprocess.Popen(['sudo','tcpflow', '-C', '-i', interface, '-p', 'src', 'host', ip],stdout=subprocess.PIPE) 

for line in iter(proc.stdout.readline,''): 
    do_something(line) 

を使用していますが、私は外部プログラムを呼び出さないようしたいと思います。

これまでのところ、私は以下のような可能性に見てきた:

  • flowgrep:ちょうど私が必要なもののように見えるのPythonツール:しかし、それはかなり7歳と思われる、内部pynids を使用しています多くは放棄された。私のgentooシステムにはpynidsパッケージ はありません。それ以上の調整をせずにコンパイルできなかったlibnids のパッチバージョンが同梱されています。

  • scapy:これは私はTCPストリーム 再構築がサポートされているかどうかはわからないのpythonのパッケージ操作プログラム/ライブラリ、 です。

  • pypcapまたはpylibpcapをlibpcapのラッパーとして使用します。ここでも、libpcapはパケット のキャプチャであり、ここでは 〜this questionに従ったストリーム再アセンブリが必要です。

私は深く、これらのライブラリのいずれかに飛び込む前に、私は多分誰か は、作業コードスニペットを持っているかどうかを知りたいと思います(これはかなり一般的な問題のように思えます)。 誰かが適切な方法について助言を与えることができれば、私はまた感謝しています。

おかげ

答えて

1

ジョンOberheideがでかなり最新である、pynidsを維持するための取り組みをリードしてきました:だから http://jon.oberheide.org/pynids/

、これはさらにflowgrepを探索することを許可することがあります。 Pynids自体は、ストリームの再構築をかなりエレガントに処理します。いくつかの良い例については、http://monkey.org/~jose/presentations/pysniff04.d/を参照してください。

+0

リンクありがとうございます。私はpynidsのこの新しいvesionを完全に見逃しました、私はこのバージョンをコンパイルすることができました。しかし、最初のテストでは、libnidsでは、コールバック関数の働きにより、新しく確立されたtcp接続をキャプチャすることしかできないことを示しています(私は進行中のストリームをキャプチャする必要があります)。さて、これはこの質問の範囲外です... – PiQuer

1

フォローアップと同じように、私はtcp層のストリームを監視する考えを放棄しました。代わりに、私はPythonでプロキシを書いて、私が監視したい接続(httpセッション)をこのプロキシを通して接続させます。結果はより安定し、実行にはroot特権は必要ありません。この解決方法はpymiproxyに依存します。

これはスタンドアロンプ​​ログラムに入ります。 helper_proxy.py

python helper_proxy.pyで始まります。これは、ポート8080でhttp接続をリッスンし、ポート6000で別のpythonプログラムをリッスンするプロキシを作成します。他のpythonプログラムがそのポートに接続されると、ヘルパープロキシはそれにすべてのhttp応答を送信します。このようにして、ヘルパープロキシはhttp接続を維持したまま実行し続けることができ、リスナをデバッグのために再起動することができます。

リスナーの仕組みは次のとおりです。listener.py

from multiprocessing.connection import Client 

def main(): 
    address = ('localhost', 6000) 
    conn = Client(address, authkey='some_secret_password') 
    while True: 
     print conn.recv() 

if __name__ == '__main__': 
    main() 

これはすべての応答を印刷するだけです。次に、ブラウザでポート8080上で実行されているプロキシにアクセスし、監視したいHTTP接続を確立します。

関連する問題