2009-02-27 11 views
1

私のコンピュータから送信されたTCP SYNパケットをC++プログラムで傍受する最も簡単な方法を見つけることを試みています。私が知っているオプションのカップルがあります。 1つはすべてのトラフィックを監視し、残りのものを何もしないSYNパケットで選択的に処理するだけです。私が遭遇したもう一つの選択肢は、SYNパケットを私のプログラムに転送するパケットフィルタリングユーティリティを使うことでした。誰かが私に同じものにnetfilterを使うように勧めました。LinuxのC++プログラムへのTCP SYNパケットの傍受/リルート

他のオプションがあるかどうか、またはnetfilterを調べる必要があるのだろうかと思っていました。また、netfilterを使ってこれを行う方法については、参考にしてください。

編集:私は戻って、ネットワークへ

編集し、それを再注入する前に(異なる宛先、変更先のポートなどに再ルーティング)SYNパケットを傍受したいし、それを修正する必要があるかもしれません:私は使用してこれを行うことができましたiptablesとlibnetfilter_queueの組み合わせ。私はipfilterを使用してすべてのTCP SYNパケットを特定のキューにリダイレクトしました(これは単純なコマンドを使用していました)
Cプログラムでlibnetfilter_queue APIを使用してキュー内のパケットにアクセスし、それらを分析してネットワーク。

+0

実際に経路を変更したいかどうかを明確にしてください - 件名を教えてくださいが、質問に言及しないことをお勧めします – Alnitak

+0

私はSYNパケットを傍受したいので、変更する必要があります送信先ポートなど)に転送することができます。 –

+0

Rawソケットを使用してパケットを注入することもできます。 – Anonymous

答えて

4

にパケットをだけ表示させたい場合は、libpcapとパケットフィルタリングを使用してください。これはほとんどのUNIXで動作します。

何らかの理由でパケットを傍受して書き換えたい場合は、何をしようとしているのか、後でパケットに何が起きるのかについて、より多くの情報を提供してください。

あなたが示唆したようことが2.6.14以降のカーネルを必要とするが、それは、netfilterのとそのqueueモジュールのためのアプリケーションであるかもしれない:

主な特長から、キューに入れられたパケットを受信

  • カーネルnfnetlink_queueサブシステム
  • 変更のパケットをカーネルに再発行するか、または変更したパケットをカーネルに再投入する nfnetlink_queueサブシステム
+0

私は正確にこれをどのように詳細に行ったか調べるために私の答えを見てください。この応答へのコメントとして追加するには時間がかかりすぎた –

0

rawソケットまたはpcapライブラリなどを使用できます。例えば、いくつかの異なる方法があり、

#include <pcap.h> 
... 
pcap_t* reader_handle; 
char errbuf[PCAP_ERRBUF_SIZE]; 
if ((reader_handle = pcap_open_live(device_string, capture_size, 0, timeout, errbuf)) == NULL) 
{ 
    //ooops 
} 
struct bpf_program fp; 
if (pcap_compile(reader_handle, &fp, filter_string, 1, 0) == -1) 
{ 
    //ooops, cleanup 
} 
if (pcap_setfilter(reader_handle, &fp) == -1) 
{ 
    //ooops, cleanup 
} 
pcap_freecode(&fp); 

、その後、あなただけのキャプチャ:PCAPを使用すると、フィルタを設定し、興味深いトラフィックをキャプチャ

pcap_pkthdr* header; 
u_char* pkt_data; 
const int status = pcap_next_ex(reader_handle, &header, &pkt_data); 
// Check the status 

キャプチャを終了した後、

pcap_close(reader_handle); 

rawソケットで再生する権限が必要です。上記の例は、C++で素早くラップすることができます。