当 --to 选项小于 52 时,iptables 字符串匹配不起作用

当 --to 选项小于 52 时,iptables 字符串匹配不起作用

当我输入匹配字符串的 iptables 规则时,--to选项是>= 52

例子

iptables -I FORWARD 1 -m string --string anypattern --algo bm --to 100 -j DROP

上述代码正常运行,并阻止包含“anypattern”字符串的 IP 数据包。

现在,如果我将更改为--to某个值< 52,那么它将不起作用

iptables -I FORWARD 1 -m string --string anypattern --algo bm --to 50 -j DROP

而且ip包不会被拦截!

我是否遗漏了什么?或者这是一个 iptables 问题?

例子:

linux:~$ sudo iptables -I OUTPUT 1 -m string --algo bm --string 7oula --to 52 -j DROP
linux:~$ echo 7oulaaaaaaaaaaa | nc  212.227.247.109 80
^C  #<---- Blocked here ==> Good
linux:~$ sudo iptables -I OUTPUT 1 -m string --algo bm --string coula --to 51 -j DROP
linux:~$ echo coulaaaaaaaaaaa | nc  212.227.247.109 80
HTTP/1.1 400 Bad Request
Server: nginx
Date: Sun, 26 Jan 2020 15:35:55 GMT
Content-Type: text/html
Content-Length: 150
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>

答案1

--to选项为您提供最大字符串可以开始的偏移量。偏移量相对于 IP 数据包的开头。如果您添加:

  • 20IP 标头的字节数,
  • 20TCP 标头的字节数,
  • 12一些 TCP 选项的字节数

最终会得到 52 个字节。因此,TCP 有效负载的起始位置为偏移量 52,任何小于该偏移量的内容都将仅匹配 TCP/IP 标头。

注意,TCP 选项没有固定的长度。数字 12 是通过以下方式实验获得的tcpdump,但每个系统可以发送不同数量的选项。

相关内容