Você pode fazer isso, mas é preciso entender a horrível linguagem u32:
iptables -I INPUT 1 -m u32 --u32 "2 & 0xFFFF = 3" -j LOG
que leva a entradas de registro como a abaixo (observe o campo ID=
):
Oct 14 16:09:01 risby kernel: IN=p1p1 OUT= MAC=70:71:bc:ac:44:5a:00:13:72:ba:37:50:08:00 SRC=10.11.0.6 DST=192.168.3.11 LEN=1407 TOS=0x10 PREC=0x00 TTL=63 ID=3 DF PROTO=TCP SPT=45933 DPT=22 WINDOW=883 RES=0x00 ACK URGP=0
Os detalhes são:
-
2
seleciona os quatro bytes que começam no byte 2 do cabeçalho, ou seja, bytes 2-5, dos quais 4 e 5 são o campo de ID -
& 0xFFFF
seleciona apenas os dois bytes inferiores do anterior, ou seja, o campo id -
= 3
é verdadeiro IFO o anterior é 3.
Quanto ao offset, minha cópia de Stevens diz que o campo offset é o 13 bits inferior dos bytes 6 e 7, então para offset = 2 você provavelmente quer algo como
iptables -I INPUT 1 -m u32 --u32 "4 & 0x1FFF = 2" -j LOG
Use um destino diferente de LOG
se desejar, por exemplo, ACCEPT
ou DROP
. No entanto, compartilho a curiosidade de guntbert sobre por que você quer fazer isso.