簡體   English   中英

在Linux中攔截/重新路由TCP SYN數據包到C ++程序

[英]Intercepting/Rerouting TCP SYN packets to C++ program in linux

我試圖找到最簡單的方法來攔截我的計算機在c ++程序中發送的TCP SYN數據包。 我知道有幾種選擇。 一個是監控所有流量,只是選擇性地使用SYN數據包,其余部分不做任何事情。 我遇到的另一個選擇是使用包過濾實用程序,它將SYN包轉發到我的程序。 有人建議我使用netfilter

我想知道是否還有其他選擇,或者我應該深入研究netfilter。 此外,有關如何使用netfilter執行此操作的任何指示都會有所幫助。

編輯:我想攔截SYN數據包,可能需要修改它(重新路由到不同的目的地,更改目標端口等),然后再將其重新注入網絡

編輯:我能夠使用iptables和libnetfilter_queue的組合來完成此操作。 我使用ipfilter將所有TCP SYN數據包重定向到特定隊列(這是使用一個簡單的命令)
然后在C程序中,我能夠使用libnetfilter_queue API訪問隊列中的數據包,分析它們並將它們重新注入網絡。

如果您只想查看數據包,請使用libpcap和數據包過濾 - 這適用於大多數UNIX變體。

如果您想以某種方式攔截和重寫數據包,請提供有關您嘗試執行的操作的更多信息,以及之后應該對數據包執行的操作。

正如您所建議的那樣,這可能是netfilter及其隊列模塊的應用程序,盡管這需要2.6.14或更高版本的內核:

主要特點

  • 從內核nfnetlink_queue子系統接收排隊的數據包
  • 發出判決和/或將更改的數據包重新注入內核nfnetlink_queue子系統

您可以使用原始套接字或例如pcap庫。 使用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_pkthdr* header; 
u_char* pkt_data;
const int status = pcap_next_ex(reader_handle, &header, &pkt_data);
// Check the status

結束捕獲后:

pcap_close(reader_handle);

您需要使用原始套接字的權限。 上面的例子可以很好地包裝在C ++中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM