iptables заблокировать IP на х часов не работает?

На моем Linux-сервере я хочу запретить IP-адреса, которые в течение 24 часов используют определенные порты с использованием IP-таблиц. Для этого я использую следующие правила IPtables:

# Check if IP is on banlist, if yes then drop
-A INPUT -m state --state NEW -j bancheck
-A bancheck -m recent --name blacklist   --rcheck --reap   --seconds 86400     -j LOG --log-prefix "IPT blacklist_ban: "
-A bancheck -m recent --name blacklist   --rcheck --reap   --seconds 86400     -j DROP

# PUT IPs on banlist
-A banlist -m recent --set --name blacklist -j LOG --log-prefix "IPT add_IP_to_blacklist: "
-A banlist -j DROP

# Ban access to these ports
-A INPUT -p tcp -m multiport --dports 23,25,445,1433,2323,3389,4899,5900   -j LOG --log-prefix "IPT syn_naughty_ports: "
-A INPUT -p tcp -m multiport --dports 23,25,445,1433,2323,3389,4899,5900   -j banlist

В журналах я могу убедиться, что это работает:

Mar 13 02:12:23 kernel: [39534099.648488] IPT syn_naughty_ports: IN=eth0 OUT= MAC=... SRC=218.189.140.2 DST=... LEN=52 TOS=0x00 PREC=0x00 TTL=113 ID=29768 DF PROTO=TCP SPT=65315 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 
Mar 13 02:12:23 kernel: [39534099.648519] IPT add_IP_to_blacklist: IN=eth0 OUT= MAC=... SRC=218.189.140.2 DST=...4 LEN=52 TOS=0x00 PREC=0x00 TTL=113 ID=29768 DF PROTO=TCP SPT=65315 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 
Mar 13 02:12:26 kernel: [39534102.664136] IPT blacklist_ban: IN=eth0 OUT= MAC=... SRC=218.189.140.2 DST=... LEN=52 TOS=0x00 PREC=0x00 TTL=113 ID=4724 DF PROTO=TCP SPT=65315 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 

Но затем журналы также показывают, что чуть более 2 часов спустя тот же IP снова получает доступ к моей системе. Вместо того, чтобы блокироваться в самом начале через цепочку "bancheck", IP может получить доступ к порту, в результате чего его снова помещают в "список запрещенных" (порт назначения в обоих случаях был одним и тем же портом 25).

Mar 13 04:35:59 kernel: [39542718.875859] IPT syn_naughty_ports: IN=eth0 OUT= MAC=... SRC=218.189.140.2 DST=... LEN=52 TOS=0x00 PREC=0x00 TTL=113 ID=4533 DF PROTO=TCP SPT=57719 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 
Mar 13 04:35:59 kernel: [39542718.875890] IPT add_IP_to_blacklist: IN=eth0 OUT= MAC=... SRC=218.189.140.2 DST=... LEN=52 TOS=0x00 PREC=0x00 TTL=113 ID=4533 DF PROTO=TCP SPT=57719 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 
Mar 13 04:36:02 kernel: [39542721.880524] IPT blacklist_ban: IN=eth0 OUT= MAC=... DST=... LEN=52 TOS=0x00 PREC=0x00 TTL=113 ID=12505 DF PROTO=TCP SPT=57719 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 
Mar 13 04:36:08 kernel: [39542727.882973] IPT blacklist_ban: IN=eth0 OUT= MAC=... SRC=218.189.140.2 DST=... LEN=48 TOS=0x00 PREC=0x00 TTL=113 ID=29092 DF PROTO=TCP SPT=57719 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0

Но если я правильно понимаю правила IPtables, он должен быть заблокирован в первых нескольких строках, если это происходит в течение 24 часов, и не сможет зайти так далеко в наборе правил IPtables, где он снова обнаруживается для нарушать правило портов и снова ставить на "банлист".

Я делаю что-то не так, или я неправильно понимаю, как работают правила?

1 ответ

Рабочий пример для ssh с моего сервера

iptables -X black
iptables -N black
iptables -A black -m recent --set --name blacklist -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1 -m recent --update --name blacklist --reap --seconds 86400 -j DROP
iptables -A INPUT -p TCP --dport ssh -m state --state NEW -j ssh

Не забудьте создать цепочки iptables с помощью iptables -N

Сравните это с вашим конфигом и посмотрите, есть ли заметные различия.

Более элегантным решением было бы использовать ipset в сочетании с iptables:

timeout Все типы наборов поддерживают необязательный параметр timeout при создании набора и добавлении записей. Значение параметра timeout для команды create означает значение времени ожидания по умолчанию (в секундах) для новых записей. Если набор создан с поддержкой времени ожидания, то тот же параметр времени ожидания можно использовать для указания значений времени ожидания не по умолчанию при добавлении записей. Нулевое значение тайм-аута означает, что запись добавляется постоянно в набор. Значение времени ожидания уже добавленных элементов можно изменить, прочитав элемент с помощью параметра -exist. Пример:

ipset create test hash:ip timeout 300 
ipset add test 192.168.0.1 timeout 60 
ipset -exist add test 192.168.0.1 timeout 600
Другие вопросы по тегам