Как я могу ограничить (блокировку / черный список) попыток входа с определенных IP-адресов? [dубликат]

Вы можете безопасно убить сеансы вина либо через ALT + F2, либо через терминал, набрав

wineserver -k

Если он действительно не хочет выключения, вы можете заставить его через

wineserver -k9
8
задан 10 October 2015 в 02:33

9 ответов

Возможным альтернативным вариантом является идентификация и устранение проблемных IP-адресов в наборе правил iptables с использованием модуля recent. Задача с этим методом - это ограничение по умолчанию hitcount по умолчанию 20, поэтому вам нужно либо отклоняться от значений по умолчанию, либо создавать счетчики переноса более высокого уровня, чтобы достичь более высокой точки запуска hitcount.

Ниже приведен пример из моего iptables набор правил и запретит IP-адрес чуть более 1 дня, если он будет содержать 80 новых TCP-соединений на порту 80 менее чем за 12 минут. Когда-нибудь в списке плохих пар, любая попытка подключения сбросит счетчик на 1 день на 0. Этот метод может пройти до 400 ударов до того, как потребуется расширение до другого переноса (и я проверил другую цепочку переноса). Обратите внимание, что в коде, который был опубликован, есть инфраструктура, которая будет использоваться только для запрета в течение длительного времени при использовании нескольких более коротких триггеров времени. В настоящее время я установил для него просто запрет на первый триггер.

####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in4 # # A NEW Connection on port 80 part 4. # # multiple hits on the banned list means you get a one day ban. # (I re-load the firewall rule set often, so going longer makes # little sense.) # # Custom tables must exist before being referenced, hence the order # of these sub-toutines. # # Place holder routine, but tested. Logs if a day ban would have # been activated. # $IPTABLES -N http-new-in4 #$IPTABLES -A http-new-in4 -m recent --set --name HTTP_BAN_DAY $IPTABLES -A http-new-in4 -j LOG --log-prefix "DAY80:" --log-level info $IPTABLES -A http-new-in4 -j DROP ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in3 # # A NEW Connection on port 80 part 3. # # carry forward to the actual banned list: # Increment this count. Leave the previous count. # # Custom tables must exist before being referenced, hence the order # of these sub-toutines. # $IPTABLES -N http-new-in3 $IPTABLES -A http-new-in3 -m recent --remove --name HTTP_02 $IPTABLES -A http-new-in3 -m recent --update --hitcount 1 --seconds 86400 --name HTTP_BAN -j http-new-in4 $IPTABLES -A http-new-in3 -m recent --set --name HTTP_BAN $IPTABLES -A http-new-in3 -j LOG --log-prefix "BAN80:" --log-level info $IPTABLES -A http-new-in3 -j DROP ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in2 # # A NEW Connection on port 80 part 2. # # carry forward from previous max new connections per unit time: # Increment this count and clear the lesser significant count. # $IPTABLES -N http-new-in2 $IPTABLES -A http-new-in2 -m recent --remove --name HTTP_01 $IPTABLES -A http-new-in2 -m recent --update --hitcount 3 --seconds 720 --name HTTP_02 -j http-new-in3 $IPTABLES -A http-new-in2 -m recent --set --name HTTP_02 $IPTABLES -A http-new-in2 -j LOG --log-prefix "CARRY80:" --log-level info $IPTABLES -A http-new-in2 -j ACCEPT ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in # # A NEW Connection on port 80: # $IPTABLES -N http-new-in echo Allowing EXTERNAL access to the WWW server # . check the static blacklist. # # http related $IPTABLES -A http-new-in -i $EXTIF -s 5.248.83.0/24 -j DROP ... delete a bunch on entries ... $IPTABLES -A http-new-in -i $EXTIF -s 195.211.152.0/22 -j DROP $IPTABLES -A http-new-in -i $EXTIF -s 198.27.126.38 -j DROP # . check the dynamic banned list # # The 1 Hour banned list (bumped to more than a day): $IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j LOG --log-prefix "LIM80:" --log-level info $IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j DROP # A generic log entry. Usually only during degugging # #$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80ALL:" --log-level info # Dynamic Badguy List. Least significant hit counter. Detect and DROP Bad IPs that do excessive connections to port 80. # $IPTABLES -A http-new-in -m recent --update --hitcount 20 --seconds 240 --name HTTP_01 -j http-new-in2 $IPTABLES -A http-new-in -m recent --set --name HTTP_01 $IPTABLES -A http-new-in -j LOG --log-prefix "NEW80:" --log-level info $IPTABLES -A http-new-in -j ACCEPT ... a bunch of stuff not included here # Allow any related traffic coming back to the server in. # # $IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT ... the above is needed before the below ... # If required, go to NEW HTTP connection sub-routine # $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j http-new-in
1
ответ дан 18 July 2018 в 14:49

Прежде всего, не изобретайте велосипед. Это как раз то, что denyhosts для:

DenyHosts is a python program that automatically blocks ssh attacks by adding entries to /etc/hosts.deny. DenyHosts will also inform Linux administrators about offending hosts, attacked users and suspicious logins.

Насколько я знаю, denyhosts предназначен только для ssh соединений, но есть также fail2ban, который имеет дело почти со всем:

Fail2Ban consists of a client, server and configuration files to limit brute force authentication attempts. The server program fail2ban-server is responsible for monitoring log files and issuing ban/unban commands. It gets configured through a simple protocol by fail2ban-client, which can also read configuration files and issue corresponding configuration commands to the server.

Оба доступны в репозиториях:

sudo apt-get install denyhosts fail2ban

Вы также можете создать скрипт, если хотите. Что-то вроде:

#!/usr/bin/env sh netstat -an | awk -vmax=100 '/tcp/{split($5,a,":"); if(a[1] > 0 && a[1]!="0.0.0.0"){c[a[1]]++}} END{for(ip in c){if(c[ip]>max){print ip}}}' | while read ip; do iptables -I INPUT 1 -s "$ip" -j DROP; done

awk будет извлекать IP-адреса и подсчитывать их и печатать только те, которые появляются больше, чем max раз (здесь -vmax=100, соответственно измените его). Затем IP-адреса передаются в цикл while, который запускает соответствующее правило iptables.

Чтобы запустить этот 24/7, я бы сделал cronjob, который запускает команду выше каждую минуту или около того. Добавьте эту строку в /etc/crontab

* * * * * root /path/to/script.sh
9
ответ дан 18 July 2018 в 14:49

Возможным альтернативным вариантом является идентификация и устранение проблемных IP-адресов в наборе правил iptables с использованием модуля recent. Задача с этим методом - это ограничение по умолчанию hitcount по умолчанию 20, поэтому вам нужно либо отклоняться от значений по умолчанию, либо создавать счетчики переноса более высокого уровня, чтобы достичь более высокой точки запуска hitcount.

Ниже приведен пример из моего iptables набор правил и запретит IP-адрес чуть более 1 дня, если он будет содержать 80 новых TCP-соединений на порту 80 менее чем за 12 минут. Когда-нибудь в списке плохих пар, любая попытка подключения сбросит счетчик на 1 день на 0. Этот метод может пройти до 400 ударов до того, как потребуется расширение до другого переноса (и я проверил другую цепочку переноса). Обратите внимание, что в коде, который был опубликован, есть инфраструктура, которая будет использоваться только для запрета в течение длительного времени при использовании нескольких более коротких триггеров времени. В настоящее время я установил для него просто запрет на первый триггер.

####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in4 # # A NEW Connection on port 80 part 4. # # multiple hits on the banned list means you get a one day ban. # (I re-load the firewall rule set often, so going longer makes # little sense.) # # Custom tables must exist before being referenced, hence the order # of these sub-toutines. # # Place holder routine, but tested. Logs if a day ban would have # been activated. # $IPTABLES -N http-new-in4 #$IPTABLES -A http-new-in4 -m recent --set --name HTTP_BAN_DAY $IPTABLES -A http-new-in4 -j LOG --log-prefix "DAY80:" --log-level info $IPTABLES -A http-new-in4 -j DROP ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in3 # # A NEW Connection on port 80 part 3. # # carry forward to the actual banned list: # Increment this count. Leave the previous count. # # Custom tables must exist before being referenced, hence the order # of these sub-toutines. # $IPTABLES -N http-new-in3 $IPTABLES -A http-new-in3 -m recent --remove --name HTTP_02 $IPTABLES -A http-new-in3 -m recent --update --hitcount 1 --seconds 86400 --name HTTP_BAN -j http-new-in4 $IPTABLES -A http-new-in3 -m recent --set --name HTTP_BAN $IPTABLES -A http-new-in3 -j LOG --log-prefix "BAN80:" --log-level info $IPTABLES -A http-new-in3 -j DROP ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in2 # # A NEW Connection on port 80 part 2. # # carry forward from previous max new connections per unit time: # Increment this count and clear the lesser significant count. # $IPTABLES -N http-new-in2 $IPTABLES -A http-new-in2 -m recent --remove --name HTTP_01 $IPTABLES -A http-new-in2 -m recent --update --hitcount 3 --seconds 720 --name HTTP_02 -j http-new-in3 $IPTABLES -A http-new-in2 -m recent --set --name HTTP_02 $IPTABLES -A http-new-in2 -j LOG --log-prefix "CARRY80:" --log-level info $IPTABLES -A http-new-in2 -j ACCEPT ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in # # A NEW Connection on port 80: # $IPTABLES -N http-new-in echo Allowing EXTERNAL access to the WWW server # . check the static blacklist. # # http related $IPTABLES -A http-new-in -i $EXTIF -s 5.248.83.0/24 -j DROP ... delete a bunch on entries ... $IPTABLES -A http-new-in -i $EXTIF -s 195.211.152.0/22 -j DROP $IPTABLES -A http-new-in -i $EXTIF -s 198.27.126.38 -j DROP # . check the dynamic banned list # # The 1 Hour banned list (bumped to more than a day): $IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j LOG --log-prefix "LIM80:" --log-level info $IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j DROP # A generic log entry. Usually only during degugging # #$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80ALL:" --log-level info # Dynamic Badguy List. Least significant hit counter. Detect and DROP Bad IPs that do excessive connections to port 80. # $IPTABLES -A http-new-in -m recent --update --hitcount 20 --seconds 240 --name HTTP_01 -j http-new-in2 $IPTABLES -A http-new-in -m recent --set --name HTTP_01 $IPTABLES -A http-new-in -j LOG --log-prefix "NEW80:" --log-level info $IPTABLES -A http-new-in -j ACCEPT ... a bunch of stuff not included here # Allow any related traffic coming back to the server in. # # $IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT ... the above is needed before the below ... # If required, go to NEW HTTP connection sub-routine # $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j http-new-in
1
ответ дан 24 July 2018 в 20:29

Прежде всего, не изобретайте велосипед. Это как раз то, что denyhosts для:

DenyHosts is a python program that automatically blocks ssh attacks by adding entries to /etc/hosts.deny. DenyHosts will also inform Linux administrators about offending hosts, attacked users and suspicious logins.

Насколько я знаю, denyhosts предназначен только для ssh соединений, но есть также fail2ban, который имеет дело почти со всем:

Fail2Ban consists of a client, server and configuration files to limit brute force authentication attempts. The server program fail2ban-server is responsible for monitoring log files and issuing ban/unban commands. It gets configured through a simple protocol by fail2ban-client, which can also read configuration files and issue corresponding configuration commands to the server.

Оба доступны в репозиториях:

sudo apt-get install denyhosts fail2ban

Вы также можете создать скрипт, если хотите. Что-то вроде:

#!/usr/bin/env sh netstat -an | awk -vmax=100 '/tcp/{split($5,a,":"); if(a[1] > 0 && a[1]!="0.0.0.0"){c[a[1]]++}} END{for(ip in c){if(c[ip]>max){print ip}}}' | while read ip; do iptables -I INPUT 1 -s "$ip" -j DROP; done

awk будет извлекать IP-адреса и подсчитывать их и печатать только те, которые появляются больше, чем max раз (здесь -vmax=100, соответственно измените его). Затем IP-адреса передаются в цикл while, который запускает соответствующее правило iptables.

Чтобы запустить этот 24/7, я бы сделал cronjob, который запускает команду выше каждую минуту или около того. Добавьте эту строку в /etc/crontab

* * * * * root /path/to/script.sh
9
ответ дан 24 July 2018 в 20:29
  • 1
    Спасибо terdon для точного ответа. Насколько мне известно, кроме того, fail2ban для аутентификации SSH. Все соединения открываются на порт 80. Я буду исследовать, если я могу использовать fail2ban в порт 80. Для нестандартного сценария, как я мог запустить его в фоновом режиме 24/7? команды экран? Или установить cron? Кстати. Я использую сервер как чат-сервер, поэтому человек может пинг во много раз (или открывать несколько соединений), поэтому я, возможно, пойти на специальный скрипт, который вы предоставили. – user3404047 10 October 2015 в 04:50
  • 2
    @ user3404047 вы можете запустить его как cronjob, да. См. Обновленный ответ. Однако fail2ban не только для ssh. Он также отлично работает для порта 80. Здесь, например, здесь , здесь и здесь . – terdon♦ 10 October 2015 в 12:21

Возможным альтернативным вариантом является идентификация и устранение проблемных IP-адресов в наборе правил iptables с использованием модуля recent. Задача с этим методом - это ограничение по умолчанию hitcount по умолчанию 20, поэтому вам нужно либо отклоняться от значений по умолчанию, либо создавать счетчики переноса более высокого уровня, чтобы достичь более высокой точки запуска hitcount.

Ниже приведен пример из моего iptables набор правил и запретит IP-адрес чуть более 1 дня, если он будет содержать 80 новых TCP-соединений на порту 80 менее чем за 12 минут. Когда-нибудь в списке плохих пар, любая попытка подключения сбросит счетчик на 1 день на 0. Этот метод может пройти до 400 ударов до того, как потребуется расширение до другого переноса (и я проверил другую цепочку переноса). Обратите внимание, что в коде, который был опубликован, есть инфраструктура, которая будет использоваться только для запрета в течение длительного времени при использовании нескольких более коротких триггеров времени. В настоящее время я установил для него просто запрет на первый триггер.

####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in4 # # A NEW Connection on port 80 part 4. # # multiple hits on the banned list means you get a one day ban. # (I re-load the firewall rule set often, so going longer makes # little sense.) # # Custom tables must exist before being referenced, hence the order # of these sub-toutines. # # Place holder routine, but tested. Logs if a day ban would have # been activated. # $IPTABLES -N http-new-in4 #$IPTABLES -A http-new-in4 -m recent --set --name HTTP_BAN_DAY $IPTABLES -A http-new-in4 -j LOG --log-prefix "DAY80:" --log-level info $IPTABLES -A http-new-in4 -j DROP ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in3 # # A NEW Connection on port 80 part 3. # # carry forward to the actual banned list: # Increment this count. Leave the previous count. # # Custom tables must exist before being referenced, hence the order # of these sub-toutines. # $IPTABLES -N http-new-in3 $IPTABLES -A http-new-in3 -m recent --remove --name HTTP_02 $IPTABLES -A http-new-in3 -m recent --update --hitcount 1 --seconds 86400 --name HTTP_BAN -j http-new-in4 $IPTABLES -A http-new-in3 -m recent --set --name HTTP_BAN $IPTABLES -A http-new-in3 -j LOG --log-prefix "BAN80:" --log-level info $IPTABLES -A http-new-in3 -j DROP ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in2 # # A NEW Connection on port 80 part 2. # # carry forward from previous max new connections per unit time: # Increment this count and clear the lesser significant count. # $IPTABLES -N http-new-in2 $IPTABLES -A http-new-in2 -m recent --remove --name HTTP_01 $IPTABLES -A http-new-in2 -m recent --update --hitcount 3 --seconds 720 --name HTTP_02 -j http-new-in3 $IPTABLES -A http-new-in2 -m recent --set --name HTTP_02 $IPTABLES -A http-new-in2 -j LOG --log-prefix "CARRY80:" --log-level info $IPTABLES -A http-new-in2 -j ACCEPT ####################################################################### # USER DEFINED CHAIN SUBROUTINES: # # http-new-in # # A NEW Connection on port 80: # $IPTABLES -N http-new-in echo Allowing EXTERNAL access to the WWW server # . check the static blacklist. # # http related $IPTABLES -A http-new-in -i $EXTIF -s 5.248.83.0/24 -j DROP ... delete a bunch on entries ... $IPTABLES -A http-new-in -i $EXTIF -s 195.211.152.0/22 -j DROP $IPTABLES -A http-new-in -i $EXTIF -s 198.27.126.38 -j DROP # . check the dynamic banned list # # The 1 Hour banned list (bumped to more than a day): $IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j LOG --log-prefix "LIM80:" --log-level info $IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j DROP # A generic log entry. Usually only during degugging # #$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80ALL:" --log-level info # Dynamic Badguy List. Least significant hit counter. Detect and DROP Bad IPs that do excessive connections to port 80. # $IPTABLES -A http-new-in -m recent --update --hitcount 20 --seconds 240 --name HTTP_01 -j http-new-in2 $IPTABLES -A http-new-in -m recent --set --name HTTP_01 $IPTABLES -A http-new-in -j LOG --log-prefix "NEW80:" --log-level info $IPTABLES -A http-new-in -j ACCEPT ... a bunch of stuff not included here # Allow any related traffic coming back to the server in. # # $IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT ... the above is needed before the below ... # If required, go to NEW HTTP connection sub-routine # $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j http-new-in
1
ответ дан 31 July 2018 в 23:31

Прежде всего, не изобретайте велосипед. Это как раз то, что denyhosts для:

DenyHosts is a python program that automatically blocks ssh attacks by adding entries to /etc/hosts.deny. DenyHosts will also inform Linux administrators about offending hosts, attacked users and suspicious logins.

Насколько я знаю, denyhosts предназначен только для ssh соединений, но есть также fail2ban, который имеет дело почти со всем:

Fail2Ban consists of a client, server and configuration files to limit brute force authentication attempts. The server program fail2ban-server is responsible for monitoring log files and issuing ban/unban commands. It gets configured through a simple protocol by fail2ban-client, which can also read configuration files and issue corresponding configuration commands to the server.

Оба доступны в репозиториях:

sudo apt-get install denyhosts fail2ban

Вы также можете создать скрипт, если хотите. Что-то вроде:

#!/usr/bin/env sh netstat -an | awk -vmax=100 '/tcp/{split($5,a,":"); if(a[1] > 0 && a[1]!="0.0.0.0"){c[a[1]]++}} END{for(ip in c){if(c[ip]>max){print ip}}}' | while read ip; do iptables -I INPUT 1 -s "$ip" -j DROP; done

awk будет извлекать IP-адреса и подсчитывать их и печатать только те, которые появляются больше, чем max раз (здесь -vmax=100, соответственно измените его). Затем IP-адреса передаются в цикл while, который запускает соответствующее правило iptables.

Чтобы запустить этот 24/7, я бы сделал cronjob, который запускает команду выше каждую минуту или около того. Добавьте эту строку в /etc/crontab

* * * * * root /path/to/script.sh
9
ответ дан 31 July 2018 в 23:31
  • 1
    Спасибо Тердон за точный ответ. AFAIK, fail2ban для аутентификации ssh. Все соединения открываются на порт 80. Я изучу, могу ли я использовать fail2ban на порту 80. Что касается пользовательского скрипта, как я могу запустить его 24/7 в фоновом режиме? экранная команда? Или установить cron? КСТАТИ. Я использую сервер в качестве чат-сервера, поэтому человек может пинговать много раз (или открывать несколько подключений), поэтому я могу пойти на собственный скрипт, который вы предоставили. – user3404047 10 October 2015 в 04:50
  • 2
    @ user3404047 вы можете запустить его как cronjob, да. См. Обновленный ответ. Однако fail2ban не только для ssh. Он также отлично работает для порта 80. Здесь, например, здесь , здесь и здесь . – terdon♦ 10 October 2015 в 12:21

Прежде всего, не изобретайте колесо. Это то, что denyhosts для:

   DenyHosts  is a python program that automatically blocks ssh attacks by
   adding entries to /etc/hosts.deny.  DenyHosts will  also  inform  Linux
   administrators  about  offending  hosts,  attacked users and suspicious
   logins.

Насколько я знаю, denyhosts предназначен только для ssh соединений, но есть также fail2ban, который имеет дело почти со всем:

   Fail2Ban consists of a client, server and configuration files to  limit
   brute force authentication attempts.

   The  server  program  fail2ban-server is responsible for monitoring log
   files and issuing ban/unban commands.  It  gets  configured  through  a
   simple  protocol  by fail2ban-client, which can also read configuration
   files and issue corresponding configuration commands to the server.

Оба доступны в репозиториях:

sudo apt-get install denyhosts fail2ban

Вы также можете создать скрипт, если хотите. Что-то вроде:

#!/usr/bin/env sh
netstat -an | 
    awk -vmax=100 '/tcp/{split($5,a,":"); if(a[1] > 0 && a[1]!="0.0.0.0"){c[a[1]]++}}
    END{for(ip in c){if(c[ip]>max){print ip}}}' |
        while read ip; do iptables -I INPUT 1 -s "$ip" -j DROP; done

awk извлечет IP-адреса и посчитает их и напечатает только те, которые появляются больше, чем max раз (здесь -vmax=100, соответственно измените его). Затем IP-адреса передаются в цикл while, который запускает соответствующее правило iptables.

Чтобы запустить этот 24/7, я сделаю cronjob, который запускает команду выше каждую минуту или около того. Добавьте эту строку в /etc/crontab

* * * * * root /path/to/script.sh
9
ответ дан 5 August 2018 в 05:27

Прежде всего, не изобретайте колесо. Это то, что denyhosts для:

   DenyHosts  is a python program that automatically blocks ssh attacks by
   adding entries to /etc/hosts.deny.  DenyHosts will  also  inform  Linux
   administrators  about  offending  hosts,  attacked users and suspicious
   logins.

Насколько я знаю, denyhosts предназначен только для ssh соединений, но есть также fail2ban, который имеет дело почти со всем:

   Fail2Ban consists of a client, server and configuration files to  limit
   brute force authentication attempts.

   The  server  program  fail2ban-server is responsible for monitoring log
   files and issuing ban/unban commands.  It  gets  configured  through  a
   simple  protocol  by fail2ban-client, which can also read configuration
   files and issue corresponding configuration commands to the server.

Оба доступны в репозиториях:

sudo apt-get install denyhosts fail2ban

Вы также можете создать скрипт, если хотите. Что-то вроде:

#!/usr/bin/env sh
netstat -an | 
    awk -vmax=100 '/tcp/{split($5,a,":"); if(a[1] > 0 && a[1]!="0.0.0.0"){c[a[1]]++}}
    END{for(ip in c){if(c[ip]>max){print ip}}}' |
        while read ip; do iptables -I INPUT 1 -s "$ip" -j DROP; done

awk извлечет IP-адреса и посчитает их и напечатает только те, которые появляются больше, чем max раз (здесь -vmax=100, соответственно измените его). Затем IP-адреса передаются в цикл while, который запускает соответствующее правило iptables.

Чтобы запустить этот 24/7, я сделаю cronjob, который запускает команду выше каждую минуту или около того. Добавьте эту строку в /etc/crontab

* * * * * root /path/to/script.sh
9
ответ дан 6 August 2018 в 22:34

Возможным альтернативным вариантом является идентификация и устранение проблемных IP-адресов в наборе правил iptables с использованием модуля recent. Задача с этим методом - это ограничение по умолчанию hitcount по умолчанию 20, поэтому вам нужно либо отклоняться от значений по умолчанию, либо создавать счетчики переноса более высокого уровня, чтобы достичь более высокой точки запуска hitcount.

Ниже приведен пример из моего iptables набор правил и запретит IP-адрес чуть более 1 дня, если он будет содержать 80 новых TCP-соединений на порту 80 менее чем за 12 минут. Когда-нибудь в списке плохих пар, любая попытка подключения сбросит счетчик на 1 день на 0. Этот метод может пройти до 400 ударов до того, как потребуется расширение до другого переноса (и я проверил другую цепочку переноса). Обратите внимание, что в коде, который был опубликован, есть инфраструктура, которая будет использоваться только для запрета в течение длительного времени при использовании нескольких более коротких триггеров времени. В настоящее время я установил для него просто запрет на первый запуск.

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in4
#
# A NEW Connection on port 80 part 4.
#
# multiple hits on the banned list means you get a one day ban.
# (I re-load the firewall rule set often, so going longer makes
# little sense.)
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
# Place holder routine, but tested. Logs if a day ban would have
# been activated.
#
$IPTABLES -N http-new-in4
#$IPTABLES -A http-new-in4 -m recent --set --name HTTP_BAN_DAY

$IPTABLES -A http-new-in4 -j LOG --log-prefix "DAY80:" --log-level info
$IPTABLES -A http-new-in4 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in3
#
# A NEW Connection on port 80 part 3.
#
# carry forward to the actual banned list:
# Increment this count. Leave the previous count.
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
$IPTABLES -N http-new-in3
$IPTABLES -A http-new-in3 -m recent --remove --name HTTP_02
$IPTABLES -A http-new-in3 -m recent --update --hitcount 1 --seconds 86400 --name HTTP_BAN -j http-new-in4
$IPTABLES -A http-new-in3 -m recent --set --name HTTP_BAN

$IPTABLES -A http-new-in3 -j LOG --log-prefix "BAN80:" --log-level info
$IPTABLES -A http-new-in3 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in2
#
# A NEW Connection on port 80 part 2.
#
# carry forward from previous max new connections per unit time:
# Increment this count and clear the lesser significant count.
#
$IPTABLES -N http-new-in2
$IPTABLES -A http-new-in2 -m recent --remove --name HTTP_01
$IPTABLES -A http-new-in2 -m recent --update --hitcount 3 --seconds 720 --name HTTP_02 -j http-new-in3
$IPTABLES -A http-new-in2 -m recent --set --name HTTP_02

$IPTABLES -A http-new-in2 -j LOG --log-prefix "CARRY80:" --log-level info
$IPTABLES -A http-new-in2 -j ACCEPT

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in
#
# A NEW Connection on port 80:
#
$IPTABLES -N http-new-in

echo Allowing EXTERNAL access to the WWW server

# . check the static blacklist.
#
# http related
$IPTABLES -A http-new-in -i $EXTIF -s 5.248.83.0/24 -j DROP
... delete a bunch on entries ...
$IPTABLES -A http-new-in -i $EXTIF -s 195.211.152.0/22 -j DROP
$IPTABLES -A http-new-in -i $EXTIF -s 198.27.126.38 -j DROP

# . check the dynamic banned list
#
# The 1 Hour banned list (bumped to more than a day):
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j LOG --log-prefix "LIM80:" --log-level info
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j DROP

# A generic log entry. Usually only during degugging
#
#$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80ALL:" --log-level info

# Dynamic Badguy List. Least significant hit counter.  Detect and DROP Bad IPs that do excessive connections to port 80.
#
$IPTABLES -A http-new-in -m recent --update --hitcount 20 --seconds 240 --name HTTP_01 -j http-new-in2
$IPTABLES -A http-new-in -m recent --set --name HTTP_01

$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80:" --log-level info
$IPTABLES -A http-new-in -j ACCEPT

... a bunch of stuff not included here

# Allow any related traffic coming back to the server in.
#
#
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

... the above is needed before the below ...

# If required, go to NEW HTTP connection sub-routine
#
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j http-new-in
1
ответ дан 9 August 2018 в 03:00

Другие вопросы по тегам:

Похожие вопросы: