TCPホストからのトラフィックを簡単に「編集」する方法(Linux)


9

接続を処理するプロセスがストリームを取得する前に、既知のtcp host:portからの着信トラフィックに小さな変更を加える必要があります。

たとえば、192.168.1.88をWebサーバーを実行するリモートホストとします。
ローカルホストのプロセスが192.168.1.88:80(例:ブラウザー)からデータを受信すると、データはまず次のようにに置き換えtext-Aられて変更されtext-Bます。

  • 127.0.0.1:...は192.168.1.88:80に接続します
  • 127.0.0.1:...は192.168.1.88:80に送信します。

    GET /
    
  • 192.168.1.88:80は127.0.0.1に送信します:...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • そのデータはシステムによっていくらか傍受され、出力が次のようなプログラムに渡されます。

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • システムは、変更されたデータを、192.168.1.88:80からのように、127.0.0.1:...を処理するプロセスに渡します。

ストリームベースの方法でこの変更を行う(sedたとえば、使用する)と仮定すると、着信tcpストリームを前処理する最も簡単な方法は何ですか?

これにはが含まれると思いますが、iptables私はあまり得意ではありません。

アプリケーションは元のホストを処理するように感じる必要があるため、プロキシの設定はおそらく解決策ではないことに注意してください。


これらのHTTPリクエストはありますか?
多項式

あなたの質問は十分に明確ではありません。詳細を入力する必要があります。
ハレド

1
パケットレベルではできません。1つのパケットには「text-」が含まれ、次のパケットには「A」が含まれる場合があります。プロトコルに従う非表示のプロキシを開発する必要があります。(「text-」を取得し、それが「text-A」の一部である場合、次のチャンクが渡されるまで待機する必要があるか、フィルターが機能しないため、プロトコルに従う必要があります。しかし、それが最後の場合論理的なメッセージの場合、あなたは永遠に待っているので待つことができません。)これを行う簡単な方法はないと私は思います。
David Schwartz

NAT全体で機能するようにFTPトラフィックの書き換えなどを実行できるステートフルパケットインスペクションシステムはすでに存在します。そこから始めましょう。
pjc50

私は主にhttp応答で動作する必要がありますが、任意のアプリケーション層で動作する場合は良いでしょう。
etuardu 2011年

回答:


21

netsedおよびiptablesプロキシを使用します。

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

次に実行します:

netsed tcp 10101 desthost 80 s/text-A/text-B

NetSEDは、ネットワークを介して転送されるパケットの内容をリアルタイムで変更するように設計された、小さくて便利なユーティリティです。これは、ネットワークパケットの変更、偽造、または操作に非常に役立ちます。NetSEDは以下をサポートします:

  • ブラックボックスプロトコル監査-文書化されていないプロトコルを使用して通信する2つ以上の専用ボックスがある場合。進行中の送信に変更を適用することにより、調査したアプリケーションが安全であると主張できるかどうかをテストできます。

  • ファズ生成実験、整合性テスト-アプリケーションの安定性テストを実行して、データの整合性をどのように処理するかを確認します。

  • その他の一般的な使用例:不正な転送、コンテンツフィルタリング、プロトコル変換-目前のタスクに最適なもの。


それは本当にシンプルでクールです。
mbrownnyc 2011年

知りませんでしたnetsed。私の目的にはほぼぴったりです。私が得られない唯一のことは、「ローカル透過プロキシ」を設定する方法です(質問を参照)。おそらく、それを取得するために別の(仮想)ネットワークインターフェイスをセットアップする必要があります。ちなみに、今のところこれが最も満足のいく答えです。
etuardu 2011年

一般的なディストリビューションカーネルを実行していますか?iptablesのサポートはおそらくすでに組み込まれています。透過プロキシを設定するには、ホスト/ポートの適切な詳細を入力する必要があります。readmeを見て、詳細の一部が入力されているかどうかを確認してください。 silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
DFC

netsedは一度に1つのパケットでしか機能しないと思いましたか?したがって、http要求が2つのパケットに分割された場合、置換の正規表現は一致せず、要求は変更されずにサーバーに渡されます。
paulos

1
さて、誰かがこれをいつか必要とする場合に備えて:私がそれを完全に理解しているわけではありませんが、実際にOUTGOINGパケット(これはopが実行したくないことです)を変更するにはOUTPUT、ではなくを変更する必要がありPREROUTINGます。また、-Dオプションは-A 私のためでなければなりませんでした。また、-jオプションとして、DNAT --to-destination (ip) またはを使用する必要がありましたREDIRECT --to-port。最後に、netsedのセグメンテーションエラーを修正できませんでした。参照:ubuntuforums.org/showthread.php
t


3

iptables+ libnetfilter_quの使用は、あなたが望むことをする別のオプションです:

「... [再注入]カーネルnfnetlink_queueサブシステムへの変更されたパケット。」

ソフトウェアのコーディングはあなた次第なので、拡張性が最も高くなるでしょう。

ありますラッパーのpythonとしても利用可能に。


2
netfilter_queueを使用しているサンプルアプリケーション:github.com/rgerganov/nfqsed
rgerganov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.