no-style

Как защитить свой сервер от ботов ipset + iptables

ddos
Когда я начал знакомится с системным администрированием, я столкнулся с распространенной проблемой, когда большое количество зараженных или скомпрометированных компьютеров участников ботнета, пыталось получить доступ к моему серверу. Спустя какое то время у меня возник вопрос - как забанить много IP адресов при помощи файервола. Как защититься от брутфорса сервера ботнетом. Как предотвратить простейшие DDOS атаки на него.



Вводная часть

Изначально я решал эту проблему с помощью стандартного фаервола в Linux - iptables. Смотрел логи авторизации сервера и банил всех гадов, которые ломились по ssh.

Затем к фаерволу добавился fail2ban, который сам выявлял попытки брутфорса на 22 и другие порты и сам заносил IP адреса в iptables. Но ботов было очень много и постепенно правила фаера росли, что начало грузить нехило процессор.

Покурив гугл я узнал про ipset. Этакая надстройка к iptables. Хотя, скорее это не надстройка, ipset работает в паре с iptables. В результате такого союза процессор напрягается значительно меньше чем просто с iptables. Впоследствии я упростил задачу выявления и блокировки самих ботов.







Меняем порт SSH

Для начала нам понадобится сменить порт ssh. Зачем? Вы сразу обезвредите большую часть ботов, т.к. после попытки законнектится на стандартный порт они обломаются и скорее всего занесут вас в какой нибудь блэклист, мол, сюда больше не ходим.

Редактируем конфиг ssh сервера:

sudo nano /etc/ssh/sshd_config

В строчке Port меняем 22 на любой другой, например 1422 и сохраняемся.

Чтобы изменения вступили в силу перезапускаем SSH сервер:

sudo /etc/init.d/ssh restart

Теперь для того чтобы зайти на сервер по SSH нужно в команде дополнительно указывать ключ -p со значением измененного порта например:

ssh -p 1422 user@server

В качестве бонуса порт ssh теперь не будет палиться при самом элементарном nmap yourserver.com







Установка fail2ban

Для большей уверенности было бы неплохо предотвращать любую попытку брутфорса. Тут нам поможет fail2ban


sudo apt-get install fail2ban

Теперь в конфиге /etc/fail2ban/jail.conf необходимо изменить пару правил на свое усмотрение:

ignoreip = 127.0.0.1 xxx.xxx.xxx.xxx (вместо xxx вписываем свой ip чтобы fail2ban не забанил нас после неправильно введенного пассворда)

bantime = 600 (время действия бана в секундах, можно указать -1 то есть навсегда)

maxretry = 3 (количество неправильных попыток, после которых сработает правило блокировки)

ищем строку [ssh] и сменим стандартный 22 порт на измененный нами 1422

Сохраняем и перезагружаем fail2ban

sudo /etc/init.d/fail2ban restart






Устанавливаем IPset

Переходим к установке виновника торжества. Рассмотрим установку ipset на Debian.

sudo apt-get install module-assistant xtables-addons-source
sudo module-assistant prepare
sudo module-assistant auto-install xtables-addons-source
sudo depmod -a


В самом начале мы будем соблюдать технику безопасности. Если по ошибке добавить свой ip в список правил блокировки, то мы не сможем зайти на собственный сервер. Поэтому сделаем запись в планировщике CRON, который будет удалять все правила каждые N минут. Для этого выполним

sudo crontab -e

и добавляем туда
*/40 * * * * ipset -F

Такой манёвр будет обнулять правила каждые 40 минут. Поэтому даже если вы тренируясь, случайно добавите свой ip или ip сервера в блэклист, то все обнулится через 40 минут. Когда приноровитесь - конечно же отключайте данное правило иначе придется каждые 40 минут все повторять.


Теперь нам нужно создать 2 списка правил и подружить их с iptables:

ipset -N dropip iphash (данный список предназначен для блокировки одиночных IP плохишей)

ipset -N dropnet nethash (а в этом списке будем складывать подсети плохишей)

Пример:

ipset -A dropip 46.32.74.8 (мы добавили данный ip в список для блокировки одиночных IP)

ipset -A dropnet 219.84.0.0/15 (мы добавили подсеть ip адресов c 219.84.0.0 по 219.85.255.255 в сумме 131,072 ip адресов)

В любой момент мы можем посмотреть все заблокированные ip командой ipset -L (если нужен только 1 список то после -L вписываем его название)


Подружим IPset с IPtables:

iptables -A INPUT -m set --match-set dropip src -j DROP
iptables -A INPUT -m set --match-set dropnet src -j DROP

-m set - используем модуль ipset
--match-set - dropip, dropnet задаем какой список будем использовать.
src - список сверяется с ip адресом источника
dst - список сверяется с ip адресом назначения







Сохранение правил

Важным шагом будет сохранение списка, иначе после ребута все правила пропадут.

создаём папку и фаил для сохранения правил:

sudo mkdir /etc/ipsetsave && touch /etc/ipsetsave/ipset-save

сохраняем список:

sudo ipset -S > /etc/ipsetsave/ipset-save


Тоже самое делаем с iptables. Создаем фаил для сохранения правил:

sudo touch /etc/ipsetsave/iptables-save

сохраняем список:

sudo iptables-save > /etc/ipsetsave/iptables-save


Добавляем ipset и iptables в автозагрузку

sudo nano /etc/rc.local

и перед exit 0 вставляем
cat /etc/ipset/ipset-save | /usr/sbin/ipset -R
cat /etc/ipset/iptables-save | iptables-restore






Рассмотрим как заблокировать весь траффик из отдельной страны

Предположим нам нужно заблокировать весь траффик из Китая. Создаем правило и сразу дружим его с iptables

ipset -N chinasubnet nethash
iptables -A INPUT -m set --match-set chinasubnet src -j DROP

Скачиваем список всех подсетей китая в формате CIDR например отсюда и сохраняем в /home/china.txt

Выполняем в терминале:

for i in $( cat /home/china.txt ) ; do ipset -A chinasubnet $i ; done

И сохраняем новые правила
ipset -S > /etc/ipsetsave/ipset-save






Небольшое дополнение:

Вы наверное спросите, а как мне заблокировать эту подсеть? Или как подсчитать маску подсети? А ничего считать и не нужно, все уже за нас давным давно придумали. Заходим на сайт countryipblocks в поле вписываем неугодный IP и получаем информацию о подсети включая маску, которая нам нужна для списка dropnet.







Немного про dos и ddos

Теперь смоделируем ситуацию. Вы заходите на сервер и обнаруживаете подозрительную загруженность процессора, будем предполагать, что веб сервер вы более менее настроили. Скорее всего кто то решил побаловаться с F5, создавая большое количество воркеров веб сервера которые начинают отьедають драгоценную ОЗУ и Мегагерцы процессора. А может кто то решил уронить ваш сервер slowlories атакой на апач? К слову до сих пор не зашитой. Тогда вам вероятно пригодится такая вот команда, которая посчитает и выведет самое большое количество подключений с одного ip

sudo netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Еще бывает полезно посмотреть рефереров в аксесс логе. Например когда кто то натравил на ваш ресурс парсер контента в несколько сотен потоков с помощью прокси:

cat access.log | grep "GET" | awk -F '"' '{print $6}' | cut -d " " -f1 | grep -E '^[­[:alnum:]]' | sort | uniq -c | sort -rn

Находим вредителя и заносим его в бан навсегда. Автоматизировать процесс можно, но это тема отдельной статьи, если интересно более подробно можно почитать тут.


loading

Комментарии