Я хочу разрешить только пакеты с определенным идентификатором (поле идентификации), например, пакеты с идентификатором = 3 принимаются, а другие отбрасываются. И я хочу сделать то же самое со смещением, поэтому, например, этот пакет принят:
09:59:29.216755 IP (tos 0x0, ttl 64, id 3, offset 0, flags [DF], proto UDP (17), length 35)
XXX.XXX.XXX.XXX.XXXXX > XXX.XXX.XXX.XXX.XXXXX: UDP, length 7
Заранее спасибо, извините за мой плохой английский.
Вы можете это сделать, но для этого нужно разобраться с ужасным языком u32:
iptables -I INPUT 1 -m u32 --u32 "2 & 0xFFFF = 3" -j LOG
что приводит к записям журнала, подобным приведенным ниже (обратите внимание на 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
Детали:
2
выбирает четыре байта, начиная с байта 2 заголовка, то есть байты 2-5, из которых 4 и 5 являются полем идентификатора
& 0xFFFF
выбирает только два нижних байта предыдущего, т.е. поле id
= 3
верно IFO предыдущее - 3.
Что касается смещения, моя копия Стивенса говорит, что поле смещения - это нижние 13 бит байтов 6 и 7, поэтому для offset = 2 вам, вероятно, понадобится что-то вроде
iptables -I INPUT 1 -m u32 --u32 "4 & 0x1FFF = 2" -j LOG
Используйте цель, отличную от LOG
если вы хотите, например, ACCEPT
или DROP
. Однако я разделяю любопытство Гантберта по поводу Зачем вы хотите это сделать.