iptables, lscan сам маркирует пакеты [SOLVED, и все же проверьте]

Толи меня конкретно плющит, толи одно из двух...
Интереса ради решил поковырять ptables на предмет дополнения xtables-addons, в том числе модуля lscan
Изложу кратко как работают мои правила:
1. В таблице raw, в цепочке PREROUTING выполняем -j CT --notrack (в дальнейшем будем TARPIT'еть) для tcp пакетов от ip которые имеются в соответствующих наборах ipset (забаненые ip):

$IPTABLES -t raw -A PREROUTING -p tcp -m set --match-set ban_by_lscan src -j CT --notrack
$IPTABLES -t raw -A PREROUTING -p tcp -m set --match-set ban_by_psd src -j CT --notrack
$IPTABLES -t raw -A PREROUTING -p tcp -m set --match-set ban_by_osf src -j CT --notrack

2. В таблице mangle, в цепочке PREROUTING выделяю из общей кучи пакеты принадлежащие соединениям со статусом NEW (нуждающиеся в проверке) и соединениям со статусом UNTRACKED (это то что мы в таблице raw нашли, маркирую то, что UNTRACKED):

$IPTABLES -t mangle -A PREROUTING -m conntrack --ctstate NEW -j new_connections
$IPTABLES -t mangle -A PREROUTING -m conntrack --ctstate UNTRACKED -j MARK --set-mark 0x82

Небольшое отступление по маркировки... суть следующая: все что уже забаненно (находится в наборах ipset) метится по маске 0x80/0xC1, все что поймано, но не забаненно метится по маске 0x01/0xC1.
3. В таблице mangle в цепочке new_connections ищем пакеты от всяких сканеров и.т.д:

$IPTABLES -t mangle -A new_connections -p tcp -m lscan --synscan -j MARK --set-mark 0x01
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --synscan -j RETURN
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --stealth -j MARK --set-mark 0x03
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --stealth -j RETURN
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --cnscan -j MARK --set-mark 0x05
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --cnscan -j RETURN
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --grscan -j MARK --set-mark 0x07
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --grscan -j RETURN
$IPTABLES -t mangle -A new_connections -m psd -j MARK --set-mark 0x09
$IPTABLES -t mangle -A new_connections -m psd -j RETURN
$IPTABLES -t mangle -A new_connections -p tcp -m osf --genre nmap -j MARK --set-mark 0x0B
$IPTABLES -t mangle -A new_connections -p tcp -m osf --genre nmap -j RETURN
$IPTABLES -t mangle -A new_connections -p tcp -m osf --genre ncat -j MARK --set-mark 0x0D
$IPTABLES -t mangle -A new_connections -p tcp -m osf --genre ncat -j RETURN

Мне интересно знать что именно делают, поэтому я уникально маркирую тип паразитных пакетов (по маске 0x01/0xC1)
В эту цепочку так же попадут не tcp пакеты от забаненных ip, поэтому первым делом в new_connections идет:

$IPTABLES -t mangle -A new_connections -m set --match-set ban_by_lscan src -j checking_protocol
$IPTABLES -t mangle -A new_connections -m set --match-set ban_by_lscan src -j RETURN
$IPTABLES -t mangle -A new_connections -m set --match-set ban_by_psd src -j checking_protocol
$IPTABLES -t mangle -A new_connections -m set --match-set ban_by_psd src -j RETURN
$IPTABLES -t mangle -A new_connections -m set --match-set ban_by_osf src -j checking_protocol
$IPTABLES -t mangle -A new_connections -m set --match-set ban_by_osf src -j RETURN

4. В checking_protocol определяю, что за протокол (разные действия можно к разным протоколам применить, хоть я и все кроме tcp дропаю, но в будущем...)

$IPTABLES -t mangle -A checking_protocol -p icmp -j MARK --set-mark 0x80
$IPTABLES -t mangle -A checking_protocol -p udp -j MARK --set-mark 0x84

5. В таблице filter, цепочки input я ловлю, все что отмаркированно по маске 0x80/0xC1 (и TARPIT'ю или дропаю в зависимости от конкреттной метки (протокола)):

$IPTABLES -A INPUT -m mark --mark 0x80/0xC1 -j blocking_banned_ip
$IPTABLES -A blocking_banned_ip -m mark --mark 0x80 -j DROP
$IPTABLES -A blocking_banned_ip -p tcp -m mark --mark 0x82 -j TARPIT --tarpit
$IPTABLES -A blocking_banned_ip -m mark --mark 0x84 -j DROP

После этого принимаю пакеты на на рабочие порты, а все неприкаянные пакеты дропаются, а если они помечены, то адреса с которых они пришли записываются в соответствующие наборы ipset, после чего пакеты дропаются:

...
...
...
$IPTABLES -A INPUT -m mark --mark 0x01/0xC1 -j quarantine
$IPTABLES -A quarantine -m mark --mark 0x01 -j SET --add-set ban_by_lscan src
$IPTABLES -A quarantine -m mark --mark 0x03 -j SET --add-set ban_by_lscan src
$IPTABLES -A quarantine -m mark --mark 0x05 -j SET --add-set ban_by_lscan src
$IPTABLES -A quarantine -m mark --mark 0x07 -j SET --add-set ban_by_lscan src
$IPTABLES -A quarantine -m mark --mark 0x09 -j SET --add-set ban_by_psd src
$IPTABLES -A quarantine -m mark --mark 0x0B -j SET --add-set ban_by_osf src
$IPTABLES -A quarantine -m mark --mark 0x0D -j SET --add-set ban_by_osf src
$IPTABLES -A quarantine -m mark --mark 0x01/0xC1 -j DROP

Что смутило... Проглядывая # ipset -L обратил внимание, что все забаненные ip находятся в одном наборе - ban_by_psd, попробовал сам посканировать себя nmap'ом, опять же попадаю в ban_by_psd. Везде написанно, что модуль lscan - гораздо эффективней в обнаружении сканирования. Ладно думаю, закоментировал в своем скрипте:

...
#$IPTABLES -t mangle -A new_connections -m psd -j MARK --set-mark 0x09
...

То есть больше нигде пакет не метится как 0x09 соответственно в ban_by_psd попасть ничего не может. Очистил наборы, начал сканировать себя nmap'ом, и опять по # ipset -L мой ip в ban_by_psd. Ладно... стал пошагово все в new_connections коментировать, и как только закоментировал все правила с модулем lscan мой ip перестал попадать в ban_by_psd. Дальше сделал так:

#$IPTABLES -t mangle -A new_connections -p tcp -m lscan --synscan -j MARK --set-mark 0x01
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --synscan -j RETURN
#$IPTABLES -t mangle -A new_connections -p tcp -m lscan --stealth -j MARK --set-mark 0x03
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --stealth -j RETURN
#$IPTABLES -t mangle -A new_connections -p tcp -m lscan --cnscan -j MARK --set-mark 0x05
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --cnscan -j RETURN
#$IPTABLES -t mangle -A new_connections -p tcp -m lscan --grscan -j MARK --set-mark 0x07
$IPTABLES -t mangle -A new_connections -p tcp -m lscan --grscan -j RETURN
#$IPTABLES -t mangle -A new_connections -m psd -j MARK --set-mark 0x09
#$IPTABLES -t mangle -A new_connections -m psd -j RETURN
#$IPTABLES -t mangle -A new_connections -p tcp -m osf --genre nmap -j MARK --set-mark 0x0B
#$IPTABLES -t mangle -A new_connections -p tcp -m osf --genre nmap -j RETURN
#$IPTABLES -t mangle -A new_connections -p tcp -m osf --genre ncat -j MARK --set-mark 0x0D
#$IPTABLES -t mangle -A new_connections -p tcp -m osf --genre ncat -j RETURN

И просканировал себя nmap'ом. Результат - мой ip в ban_by_psd. В ban_by_psd попадает только то, то маркированно как 0x09, я нигде не метил вообще, я только ретурнил. Получается, что при прохождении пакета через критерии модуля lscan и соответствии этим критериям пакет метится как 0x09, причем твоя явная маркировка (действие -j MARK --set-mark) несрабатывает.
Я не уверен, что я где-то совсем жестко не накосячил - реально скрипт моих правил намного больше и сложней, если несложно проверьте пожалуйста изложенное выше.
Почитал статью разработчика lscan. Вообщем понятно, что достаточно детально анализируется соединение не только по первому пакету (непонятно тогда как этоти критерии работают у меня в new_connections - куда могут попасть только первые пакеты соединения), но и по последующим, возможно внутри модуля есть своя маркировка, но почему тогда мое действие -j MARK --set-mark не срабатывает, ведь оно последнее.

-j TRACE и глядеть логи

-j TRACE и глядеть логи

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Они метятся при прохождении

Они метятся при прохождении критериев модуля lscan. Решение - действие для критериев модуля lscan - "-g цепочка_где_метим"

Не надо бояться, что жизнь закончится - надо бояться, что она не начнется!

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".