Сценарій оболонки для заборони IP


8

Деякі IP-адреси відкривають тисячі підключень мого сервера. У мене є сервер Ubuntu 14. Я перевіряю загальні з'єднання за допомогою наступної команди:

netstat -an | grep tcp | awk '{print $ 5}' | вирізати -f 1 -d: | сортувати | uniq -c | сортувати -н

Тоді я використовую наступне правило iptables для блокування IP-винуватця.

iptables -I INPUT 1 -s xxxx -j DROP

Це добре працює і блокує IP-адресу. Однак я не можу залишатися в режимі онлайн 24/7 для моніторингу сервера. Мені було цікаво, чи є сценарій Shell, який я можу використовувати, щоб зробити це автоматично? Наприклад, якщо IP-адреса відкриває більше X кількості підключень в будь-який час, його слід автоматично заборонити вищевказаним правилом iptables.


6
Ви подивилися, чи не відповідає fail2ban вашим потребам?
John1024

Вибачте мої обмежені знання. Чи не fail2ban для аутентифікації ssh? Я не впевнений, що використовую його на порту 80. Крім того, мій сервер - це чат-сервер, тому користувач може спробувати підключитися / пінг декілька разів. У цьому випадку fail2ban створить багато хибнопозитивних тривог та заборонить законний трафік. Якась думка?
користувач3404047

Відповіді:


10

Перш за все, не винаходити колесо. Саме це і 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-адреси подаються в цикл, який виконує відповідне iptablesправило.

Щоб запустити цю програму 24/7, я б зробив cronjob, який виконує команду вище кожної хвилини. Додайте цей рядок до/etc/crontab

* * * * * root /path/to/script.sh

Дякую Тердону за точну відповідь. AFAIK, fail2ban призначений для аутентифікації ssh. Усі з'єднання відкриваються на порту 80. Я вивчу, чи можу я користуватися fail2ban на порту 80. Як користувацький сценарій, як я можу запустити його 24/7 у фоновому режимі? екранна команда? Або встановити cron? До речі. Я використовую сервер як чат-сервер, щоб людина могла пінг багато разів (або відкрити декілька з'єднань), щоб я міг перейти до користувальницького сценарію, який ви надали.
user3404047

2
@ user3404047 ви можете запустити це як cronjob, так. Дивіться оновлену відповідь. Однак, fail2banце не тільки для ssh. Він також добре працює для порту 80. Дивіться, наприклад, тут , тут і тут .
тердон

1

Можливий варіант - визначити і вирішити проблемні IP-адреси все в наборі правил iptables, використовуючи recentмодуль. Завданням цього методу є обмеження заборгованості за замовчуванням 20, тому потрібно або відхилятися від значень за замовчуванням, або створювати лічильники переносів більш високого рівня, щоб досягти більш високої тригерної точки.

Наведений нижче приклад - з мого набору правил 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.