![使用 iptables u32 模块匹配 AAAA 记录](https://linux22.com/image/208713/%E4%BD%BF%E7%94%A8%20iptables%20u32%20%E6%A8%A1%E5%9D%97%E5%8C%B9%E9%85%8D%20AAAA%20%E8%AE%B0%E5%BD%95.png)
我需要匹配 UDP 负载末尾的两个字节 4,并根据 0x001c 检查它们。如果 UDP 有效负载没有可变长度,这将很容易。如何获取 UDP 有效负载的长度并跳转到相对于有效负载 END 的字节?
iptables -t raw -A OUTPUT -p udp --dport 53 -m u32 --u32 "$foo" -j AAAA
我想知道要输入什么内容,$foo
以便它匹配传出的 AAAA 查询并跳转到 iptables target AAAA
。
答案1
我认为这不是xt_u32
适合这项工作的工具。您可以使用以下命令更轻松地完成此操作xt_bpf
:
iptables -t raw -A OUTPUT -p udp --dport 53 -m bpf --bytecode "7,128 0 0 0,20 0 0 4,7 0 0 0,72 0 0 0,21 0 1 28,6 0 0 65535,6 0 0 0" -j AAAA
字节码来自以下 BPF 程序集:
ld #len ; get the total length of the packet
sub #4 ; subtract 4 to get the offset of the Type code
tax ; transfer the contents of register A to register X
ldh [x + 0] ; load the Type code (a half-word) into register A
jneq #0x001c, fail ; check if Type == AAAA
ret #65535 ; return success (match)
fail: ret #0 ; return failure (no match)
我在中解释了有关 BPF 的更多信息另一个答案。