quand je saisi la règle iptables qui correspondent à la chaîne et à la --to
option est >= 52
exemple
iptables -I FORWARD 1 -m string --string anypattern --algo bm --to 100 -j DROP
Le ci-dessus fonctionne correctement et bloquez les paquets IP qui contiennent une chaîne "AnyPattern".
Maintenant si je change le --to
à une valeur < 52
alors ça ne fonctionnera pas
iptables -I FORWARD 1 -m string --string anypattern --algo bm --to 50 -j DROP
Et les paquets IP ne seront pas bloqués!
Est-ce que je manque quelque chose? ou ceci est un problème d'IPTABLES?
Exemple :
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
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>
Gardez en nature que le décalage ne soit pas relatif au début de la partie de charge utile du paquet, mais comprend la partie d'en-tête du paquet. Voici une capture de TCPDumM de l'un des exemples de paquets, c'est-à-dire
echo zoulaaaaaaaaaaa | nc 192.168.111.1 80
résultant en:
2020-01-26 11:51:10.606417 IP 192.168.111.122.43372 > 192.168.111.1.80: Flags [P.], seq 1:17, ack 1, win 502, options [nop,nop,TS val 3518227831 ecr 86824426], length 16: HTTP
0x0000: 4500 0044 048c 4000 4006 d65b c0a8 6f7a E..D..@.@..[..oz
src-ip--
0x0010: c0a8 6f01 a96c 0050 8a87 b04c 40e2 7841 [email protected]
dst-ip-- spt dpt
0x0020: 8018 01f6 ad1e 0000 0101 080a d1b3 e577 ...............w
0x0030: 052c d5ea 7a6f 756c 6161 6161 6161 6161 .,..zoulaaaaaaaa
^
|_ Offset 52
0x0040: 6161 610a aaa.
En modifiant vos règles d'IPTABLES expérimentales à ceci:
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string boula --from 46 --to 51 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string coula --from 47 --to 52 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string doula --from 48 --to 53 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string eoula --from 49 --to 54 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string foula --from 50 --to 55 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string goula --from 51 --to 56 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string houla --from 52 --to 57 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string ioula --from 53 --to 58 -j DROP
$ Sudo iptables -v -x -n -L
Chain INPUT (policy ACCEPT 23 packets, 1800 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 11 packets, 1816 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "ioula" ALGO name bm FROM 53 TO 58
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "houla" ALGO name bm FROM 52 TO 57
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "goula" ALGO name bm FROM 51 TO 56
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "foula" ALGO name bm FROM 50 TO 55
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "eoula" ALGO name bm FROM 49 TO 54
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "doula" ALGO name bm FROM 48 TO 53
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "coula" ALGO name bm FROM 47 TO 52
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "boula" ALGO name bm FROM 46 TO 51
Nous pouvons essayer de mieux comprendre l'interprétation des paramètres to
et from
:
doug@rpi01:~ $ echo boulaaaaaaaaaaa | nc 192.168.111.1 80
Worked...
doug@rpi01:~ $ echo coulaaaaaaaaaaa | nc 192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo doulaaaaaaaaaaa | nc 192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo eoulaaaaaaaaaaa | nc 192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo foulaaaaaaaaaaa | nc 192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo goulaaaaaaaaaaa | nc 192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo houlaaaaaaaaaaa | nc 192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo ioulaaaaaaaaaaa | nc 192.168.111.1 80
Worked...
doug@rpi01:~ $ Sudo iptables -v -x -n -L
Chain INPUT (policy ACCEPT 742 packets, 71452 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 509 packets, 59196 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "ioula" ALGO name bm FROM 53 TO 58
11 748 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "houla" ALGO name bm FROM 52 TO 57
11 748 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "goula" ALGO name bm FROM 51 TO 56
11 748 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "foula" ALGO name bm FROM 50 TO 55
11 748 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "eoula" ALGO name bm FROM 49 TO 54
11 748 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "doula" ALGO name bm FROM 48 TO 53
11 748 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "coula" ALGO name bm FROM 47 TO 52
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "boula" ALGO name bm FROM 46 TO 51
De la pages de l'homme:
--from offset
Set the offset from which it starts looking for any matching. If not passed, default is 0.
--to offset
Set the offset up to which should be scanned. That is, byte offset-1 (counting from 0) is the last one that is scanned. If not passed, default is the packet size.
J'ai supposé que to
signifiait le dernier octet du paquet qui serait vérifié. Donc, j'aurais attendu qu'un seul de ces paquets bloqués, pas 6. Cependant, et sur la base de la description de la page man, puis les résultats ont le sens, lorsque l'octet 52, le caractère de démarrage de la chaîne, est inclus dans la fenêtre de match. . Cependant, cette ligne:
11 748 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "coula" ALGO name bm FROM 47 TO 52
N'a pas de sens, car l'octet 52 aurait dû être exclu comme un octet de démarrage de modèle.
EDIT: J'ai enquêté. L'exemple de ma réponse provient d'un noyau de version pré-52. Cela semble avoir été fixé à partir du noyau 5.2-RC1 et que la ligne ci-dessus ne bloque pas les paquets.