Назад | Перейти на главную страницу

iptables принимает определенный идентификатор пакета

Я хочу разрешить только пакеты с определенным идентификатором (поле идентификации), например, пакеты с идентификатором = 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. Однако я разделяю любопытство Гантберта по поводу Зачем вы хотите это сделать.