【问题标题】:Intercepting/Rerouting TCP SYN packets to C++ program in linux拦截/重新路由 TCP SYN 数据包到 Linux 中的 C++ 程序
【发布时间】:2010-10-10 07:10:34
【问题描述】:

我试图找到最简单的方法来拦截我的计算机在 c++ 程序中发送的 TCP SYN 数据包。我知道有几个选择。一种是监控所有流量,只选择性地处理 SYN 数据包,其余的不做任何事情。我遇到的另一个选择是使用数据包过滤实用程序,它将 SYN 数据包转发到我的程序。有人建议我使用netfilter 来做同样的事情。

我想知道是否还有其他选择,或者我应该深入研究 netfilter。此外,有关如何使用 netfilter 执行此操作的任何指示都会有所帮助。

编辑:我想拦截 SYN 数据包,可能需要修改它(重新路由到不同的目的地,更改目标端口等),然后再将其重新注入网络

编辑:我能够使用 iptables 和 libnetfilter_queue 的组合来做到这一点。我使用 ipfilter 将所有 TCP SYN 数据包重定向到特定队列(这是使用简单命令)
然后在一个 C 程序中,我能够使用 libnetfilter_queue API 访问队列中的数据包,分析它们并将它们重新注入网络。

【问题讨论】:

  • 请澄清您是否真的想重新路由 - 您建议您做这个主题,但不要在问题中提及这一点
  • 我想拦截 SYN 数据包,可能需要对其进行修改(重新路由到不同的目标,更改目标端口等),然后再将其重新注入网络
  • 您也可以使用原始套接字注入数据包。
  • 虽然你仍然需要 netfilter 来阻止原始数据包被转发

标签: c++ linux tcp


【解决方案1】:

如果您只想查看数据包,请使用libpcap 和数据包过滤 - 这适用于大多数 UNIX 变体。

如果您想以某种方式拦截和重写数据包,请提供更多信息,说明您正在尝试做什么,以及之后数据包会发生什么。

正如您所建议的,这可能是 netfilter 及其 queue 模块的应用程序,尽管这需要 2.6.14 或更高版本的内核:

主要特点

  • 从内核 nfnetlink_queue 子系统接收排队的数据包
  • 发布判决和/或将更改的数据包重新注入内核 nfnetlink_queue 子系统

【讨论】:

  • 请查看我的回答,了解我究竟是如何做到这一点的。太长了,无法作为评论添加到此回复
【解决方案2】:

您可以使用原始套接字或例如 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++ 包装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2017-10-12
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多