3

TCP と通信する Linux アプリケーションがあり、分析と統計に役立てるために、送信する TCP パケットの一部のデータを変更したいと考えています。Linux TCP スタックをハッキングせずにこれを行うことをお勧めします。

これまでのアイデアは、「TCP パケット修飾子」として機能するブリッジを作成することです。私のアイデアは、ブリッジの片側にある tun/tap デバイスを介してアプリケーションに接続し、ブリッジの反対側にある raw ソケットを介してネットワーク カードに接続することです。

私の懸念は、未加工のソケットを開くと、依然として Linux の TCP スタックにパケットを送信することです。これは正しいです?

ブリッジの疑似 C コード スケッチは次のようになります。

tap_fd = open_tap_device("/dev/net/tun");
raw_fd = open_raw_socket();
for (;;) {
    select(fds = [tap_fd, raw_fd]);
    if (FD_ISSET(tap_fd, &fds)) {
        read_packet(tap_fd);
        modify_packet_if_needed();
        write_packet(raw_fd);
    }
    if (FD_ISSET(raw_fd, &fds)) {
        read_packet(raw_fd);
        modify_packet_if_needed();
        write_packet(tap_fd);
    }
}

これは可能に見えますか、それとも同じことを達成するための他のより良い方法はありますか? (TCP パケットのブリッジングと変更。)

4

3 に答える 3

1

LD_PRELOADライブラリを使用して、データの送信に使用する関数(send()、write()など)をフックすることを検討することをお勧めします。

これには、カーネルの混乱はまったく含まれません。

もう1つのオプションは、データを読み取り、変更を加えて、すべてを実際の宛先に送信できるローカルプロキシへのアウトバウンド接続をNATすることです(NATが再度行われ、円を描くのを防ぐためのいくつかのオプションがあります)

于 2010-04-19T10:39:29.480 に答える
1

何年も前に、ファイアウォールをテストするための TCP/IP パケット操作を行うために使用したアプリがいくつかありました: fragoute と fragtest。何年も触れられていないように見えますが、コードで何をすべきかについてのアイデアが得られるかもしれません。

于 2010-04-19T03:42:39.007 に答える
0

クリックモジュラールーターを使用できます。これは、完全にC++で実装されたソフトウェアルーターです。Clickを使用すると、ルーターを通過するパケットをキャプチャしてelements、必要に応じて統計を変更または収集できます。カーネルモジュールとして、Linuxルーティングメカニズムを完全にオーバーライドし、ユーザーランドバイナリとして、インターフェイスから各パケットの複製を取得します(投稿で言及しているように)。パケットは、 pcapフィルターやその他のさまざまなメカニズムを介してクリックグラフを介して送信できます。

ブリッジルートを進んでいる場合は、必要に応じてtun / tap、ホストとの間、またはデバイスキャプチャ方法との間で使用できるため、これにより、実行しようとしていることを最も直接的にサポートできると思います。

于 2010-04-19T11:03:38.873 に答える