Вводная часть
Изначально я решал эту проблему с помощью стандартного фаервола в Linux - iptables. Смотрел логи авторизации сервера и банил всех гадов, которые ломились по ssh.
Затем к фаерволу добавился fail2ban, который сам выявлял попытки брутфорса на 22 и другие порты и сам заносил IP адреса в iptables. Но ботов было очень много и постепенно правила фаера росли, что начало грузить нехило процессор.
Покурив гугл я узнал про ipset. Этакая надстройка к iptables. Хотя, скорее это не надстройка, ipset работает в паре с iptables. В результате такого союза процессор напрягается значительно меньше чем просто с iptables. Впоследствии я упростил задачу выявления и блокировки самих ботов.
Меняем порт SSH
Для начала нам понадобится сменить порт ssh. Зачем? Вы сразу обезвредите большую часть ботов, т.к. после попытки законнектится на стандартный порт они обломаются и скорее всего занесут вас в какой нибудь блэклист, мол, сюда больше не ходим.
Редактируем конфиг ssh сервера:
В строчке Port меняем 22 на любой другой, например 1422 и сохраняемся.
Чтобы изменения вступили в силу перезапускаем SSH сервер:
Теперь для того чтобы зайти на сервер по SSH нужно в команде дополнительно указывать ключ -p со значением измененного порта например:
В качестве бонуса порт ssh теперь не будет палиться при самом элементарном nmap yourserver.com
Установка fail2ban
Для большей уверенности было бы неплохо предотвращать любую попытку брутфорса. Тут нам поможет fail2ban
Теперь в конфиге /etc/fail2ban/jail.conf необходимо изменить пару правил на свое усмотрение:
bantime = 600 (время действия бана в секундах, можно указать -1 то есть навсегда)
maxretry = 3 (количество неправильных попыток, после которых сработает правило блокировки)
ищем строку [ssh] и сменим стандартный 22 порт на измененный нами 1422
Сохраняем и перезагружаем fail2ban
Устанавливаем IPset
Переходим к установке виновника торжества. Рассмотрим установку ipset на Debian.
sudo module-assistant prepare
sudo module-assistant auto-install xtables-addons-source
sudo depmod -a
В самом начале мы будем соблюдать технику безопасности. Если по ошибке добавить свой ip в список правил блокировки, то мы не сможем зайти на собственный сервер. Поэтому сделаем запись в планировщике CRON, который будет удалять все правила каждые N минут. Для этого выполним
и добавляем туда
*/40 * * * * ipset -F
Такой манёвр будет обнулять правила каждые 40 минут. Поэтому даже если вы тренируясь, случайно добавите свой ip или ip сервера в блэклист, то все обнулится через 40 минут. Когда приноровитесь - конечно же отключайте данное правило иначе придется каждые 40 минут все повторять.
Теперь нам нужно создать 2 списка правил и подружить их с iptables:
ipset -N dropnet nethash (а в этом списке будем складывать подсети плохишей)
Пример:
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 dropnet src -j DROP
-m set - используем модуль ipset
--match-set - dropip, dropnet задаем какой список будем использовать.
src - список сверяется с ip адресом источника
dst - список сверяется с ip адресом назначения
Сохранение правил
Важным шагом будет сохранение списка, иначе после ребута все правила пропадут.
создаём папку и фаил для сохранения правил:
сохраняем список:
Тоже самое делаем с iptables. Создаем фаил для сохранения правил:
сохраняем список:
Добавляем ipset и iptables в автозагрузку
и перед exit 0 вставляем
cat /etc/ipset/ipset-save | /usr/sbin/ipset -R
cat /etc/ipset/iptables-save | iptables-restore
Рассмотрим как заблокировать весь траффик из отдельной страны
Предположим нам нужно заблокировать весь траффик из Китая. Создаем правило и сразу дружим его с iptables
iptables -A INPUT -m set --match-set chinasubnet src -j DROP
Скачиваем список всех подсетей китая в формате CIDR например отсюда и сохраняем в /home/china.txt
Выполняем в терминале:
И сохраняем новые правила
ipset -S > /etc/ipsetsave/ipset-save
Небольшое дополнение:
Вы наверное спросите, а как мне заблокировать эту подсеть? Или как подсчитать маску подсети? А ничего считать и не нужно, все уже за нас давным давно придумали. Заходим на сайт countryipblocks в поле вписываем неугодный IP и получаем информацию о подсети включая маску, которая нам нужна для списка dropnet.
Немного про dos и ddos
Теперь смоделируем ситуацию. Вы заходите на сервер и обнаруживаете подозрительную загруженность процессора, будем предполагать, что веб сервер вы более менее настроили. Скорее всего кто то решил побаловаться с F5, создавая большое количество воркеров веб сервера которые начинают отьедають драгоценную ОЗУ и Мегагерцы процессора. А может кто то решил уронить ваш сервер slowlories атакой на апач? К слову до сих пор не зашитой. Тогда вам вероятно пригодится такая вот команда, которая посчитает и выведет самое большое количество подключений с одного ip
Еще бывает полезно посмотреть рефереров в аксесс логе. Например когда кто то натравил на ваш ресурс парсер контента в несколько сотен потоков с помощью прокси:
Находим вредителя и заносим его в бан навсегда. Автоматизировать процесс можно, но это тема отдельной статьи, если интересно более подробно можно почитать тут.
Отправить комментарий