首页 > 解决方案 > 使用 libipt,如何为 TCP 数据包添加匹配规则,例如“dport”?

问题描述

我一直在尝试以编程方式添加 netfilter 规则而不调用 iptables 二进制文件。除了 libipt 的头文件之外,我找到的最接近文档的内容是here。奇怪的是,文档中没有任何内容描述我想要做什么。

在结构底部的 ip_tables.h 中ipt_entry有以下代码:

/* The matches (if any), then the target. */
    unsigned char elems[0];

但是,我还没有找到任何方法来正确阅读或修改elems.

我还尝试通过 iptables 添加规则iptables -A INPUT -p tcp --dest 192.168.1.10 --dport 8080 -j ACCEPT,然后运行一个调用 libipt 的程序,如下所示ipt_entry *rule = iptc_first_rule(chain, iptHandle);:我在 GDB 中运行它并在下面的行中中断 iptc_first_rule。转储 ipt_entry 结构给了我这个:

(gdb) p *rule
$4 = {
  ip = {
    src = {
      s_addr = 0
    }, 
    dst = {
      s_addr = 167880896
    }, 
    smsk = {
      s_addr = 0
    }, 
    dmsk = {
      s_addr = 4294967295
    }, 
    iniface = '\000' <repeats 15 times>, 
    outiface = '\000' <repeats 15 times>, 
    iniface_mask = '\000' <repeats 15 times>, 
    outiface_mask = '\000' <repeats 15 times>, 
    proto = 6, 
    flags = 0 '\000', 
    invflags = 0 '\000'
  }, 
  nfcache = 0, 
  target_offset = 160, 
  next_offset = 200, 
  comefrom = 2, 
  counters = {
    pcnt = 0, 
    bcnt = 0
  }, 
  elems = 0x77e85b58 "0"
}

我看到成员中有东西elems所以我也尝试转储它:

(gdb) x /10s rule->elems
0x77e85b58:     "0"
0x77e85b5a:     "tcp"
0x77e85b5e:     "%s"
0x77e85b61:     ""
0x77e85b62:     ""
0x77e85b63:     ""
0x77e85b64:     "%s(): set IP_HDRINC"
0x77e85b78:     ""
0x77e85b79:     ""
0x77e85b7a:     "\377\377P"

最后,我尝试查看 iptables 的源代码。然而,在从最近的窗户跳出之前,我不得不停止看那个意大利面汤。

您到底如何为规则指定目标端口?

编辑:我忘了提,目标平台是 openWRT,它不提供任何较新的 netfilter 库。我被 libipt/xtables 困住了。

标签: c++cnetfilter

解决方案


推荐阅读