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 цепочка_где_метим"
Не надо бояться, что жизнь закончится - надо бояться, что она не начнется!