[英]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.