Сопоставление строк iptables не работает, если параметр --to < 52

Сопоставление строк iptables не работает, если параметр --to < 52

когда я ввожу правило iptables, которое соответствует строке, и --toопция>= 52

пример

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

Вышеуказанное работает правильно и блокирует IP-пакеты, содержащие строку «anypattern».

Теперь, если я изменю значение --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-пакета. Если вы сложите:

  • 20байты для заголовка IP,
  • 20байты для заголовка TCP,
  • 12байты для некоторых опций TCP

в итоге у вас получится 52 байта. Таким образом, начало полезной нагрузки TCP находится по смещению 52, все, что меньше этого, будет соответствовать только заголовкам TCP/IP.

Обратите внимание, что параметры TCP не имеют фиксированной длины. Число 12 было получено экспериментально черезtcpdump, но каждая система может отправлять разное количество вариантов.

Связанный контент