c++ - 使用 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 困住了。