Геораспределительный DNS сервер + база в 3,5 миллиона

[email protected]:~$ ping verified.sc

Геораспределительный DNS сервер

Метод до банальности простой и удобный, но увеличивает жизнь доменов на несколько порядков выше. Другими словами, защищать наш сервер мы будем «по-русски» – дешево и сердито!
В статье опишу настройку на Debian 6 Squeeze, но проблем на других ОС возникнуть не должно.

На самом деле я не буду зацикливается на конфигурации непосредственно DNS-сервера, советовать в выборе оного и заниматься прочей херней. Настраивать мы будем фаервол iptables(а так же систему аддонов к нему – xtables-add-on) вместе с ipset для производительной работы системы, а направление применения Вы сможете выбрать сами 😉

Задача:
Предположим, мы имеем сервер в NL, работаем по ЮСЕ, платим местным растаманам дань за абузы и честно уже за****ись менять хостера(нужно подставить свое). Задача такова: максимально эффективно решить проблему с абузами.

Изначальный конфиг сервера(в моем случае – ноут):

Цитата:

[email protected]:~$ uname -a
Linux notebook 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64 GNU/Linux
[email protected]:~$ sudo iptables –version
iptables v1.4.8
[email protected]:~$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 235K packets, 316M bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 133K packets, 10M bytes)
pkts bytes target prot opt in out source destination

[email protected]:~$ sudo ipset -L
[email protected]:~$ sudo ipset -v
ipset v4.2, protocol version 4.
Kernel module protocol version 4.

[email protected]:~$

Скриншот в полном размере тут

Для себя отмечаем, версию ядра ОС(2.6.32-5-amd64), версию iptables(v1.4.8), версию ipset(v4.2), правила iptables\ipset пусты. Поехали (:

Решение:

Ставим нужные пакеты:

Цитата:

[email protected]:~$ sudo apt-get install module-assistant xtables-addons-source libtext-csv-xs-perl libxml-csv-perl libtext-csv-perl unzip

подготавливаем ОС для автоматической установки xtables-add-on из исходников

Цитата:

[email protected]:~$ sudo module-assistant prepare

скриншот

Проверяем, установились ли исходники ядра, ее версия, дополнительные пакеты, нужные для сборки.
И если нет никаких проблем, устанавливаем:

Цитата:

[email protected]:~$ sudo module-assistant auto-install xtables-addons-source

Активируем установленные модули:

Цитата:

[email protected]:~$ sudo depmod -a

Далее я̶ ̶в̶с̶т̶р̶е̶т̶и̶л̶ ̶В̶и̶т̶а̶л̶и̶я̶ идем на официальный сайт xtables-add-on, выбираем подходящую нам версию, качаем. Для ленивых, вот.

Цитата:

[email protected]:~$ wget -o xtables-addons-1.28.tar.xz wget http://sourceforge.net/projects/xtables-addons/files/Xtables-addons/1.28/xtables-addons-1.28.tar.xz

Распаковываем архив, скачиваем GeoIP-базу от MaxMind’a, компилируем, создаем директории, устанавливаем.

Цитата:

[email protected]:~$ cd xtables-addons-1.28/geoip/
[email protected]:~$ sudo ./geoip_download.sh
[email protected]:~$ sudo mkdir -p /usr/share/xt_geoip/LE
[email protected]:~$ sudo ./geoip_build_db.pl -D /usr/share/xt_geoip/LE < GeoIPCountryWhois.csv

Где искать скриншот уже знаете, да? 🙂

GeoIP успешно установлен!

Переходим к самой сладкой части – настройка.
У нас будет всего три базы данных по которым мы будем блокировать, рассмотрим структуры подробнеею

  1. GeoIP – не требует дополнительной структуризации базы данных.
    Я решил заблокировать доступ к серверу из, России, Украины, Казахстана, Белоруссии, Китая и Нидерландов(где по легенде расположен сервер).
  2. Список поисковых систем & анти-вирусных компании объемом в 3,5 миллиона IPv4, будем хранить в таблице nethash.
    Сразу отвечу на вопрос «Почему не ipmap?» Так как у нас диапазоны IP адресов не имеют фиксированный размер блоков, нам лучше использовать таблицу с многократным хешированием – так мы выиграем в производительности. Да и авторы так советуют…
  3. База данных предоставленная администратором дамагилаб(Ar3s’ом) за что ему ОГРОМНОЕ спасибо!) Объем 65 тысяч IP адресов.
    Тут однозначный выбор – iphash
    выдержка из мануала:

    Цитата:

    Тип iphash служит для создания произвольных наборов адресов IP и использует для хранения IP-адресов хэш-таблицу.

От слов – к делу.
Создаем два набора, типа iphash с именем «badip» и набор типа nethash с именем «rangeip»

Цитата:

[email protected]:~$ sudo ipset –create badip iphash
[email protected]:~$ sudo ipset –create rangeip nethash

В хэш-таблицу «badip» добавляем, базу данных Ar3s’a.
Скачиваем базу:

Цитата:

[email protected]:~$ sudo cd /tmp && wget http://www.dlab.org.in/big_ip.txt

Создаем простенький скрипт, добавляющий IP адреса в таблицу:

Цитата:

[email protected]:~$ nano insert.sh

код:

Цитата:

#!/bin/sh
cat /tmp/big_ip.txt | while read ip
do
sudo ipset –add badip $ip
done

Даем права на выполнение и запускаем:

Цитата:

[email protected]:~$ sudo chmod +x /tmp/insert.sh && sudo /tmp/insert.sh

Процесс может занять долгое время, ждите.

Цитата:

[email protected]:/tmp$ sudo ipset -L | wc -l
65453

На выпадающие ошибки об IPv6 адресах не обращаем внимание, так надо! 🙂

За барыжнечество базой буду реквестировать у администрации бан. Последнее обновление БД: 2 сентября 2012 г.
Скачиваем основную базу данных. На счет размера – не удивляйтесь, все IP адреса находятся в диапазонах CIDR(0-31). Распаковываем. Правим скрипт авто-добавления:

Цитата:

[email protected]:~$ nano insert.sh

код:

Цитата:

#!/bin/sh
cat /tmp/database | while read ip
do
sudo ipset –add rangeip $ip
done

Запускаем:

Цитата:

[email protected]:~$ sudo /tmp/insert.sh

Заключительная часть

С чего я там статью начал? Ах, да! Барыги, днс, базы…
Согласно Википедии, DNS сервер прослушивает 53 TCP/UDP порт, для ответов на NS запросы.

Теперь мы можем, легким движением одной руки, создать свой DNS-фильтр в обход всех барыг абсолютно бесплатно!

Блокируем страны:

Цитата:

[email protected]:~$ sudo iptables -A OUTPUT -m geoip –src-cc RU,UA,BY,KZ,CN,NL -j DROP

Блокируем icmp-пакеты, смысла в них на сервере с ботнетом – 0.

Цитата:

[email protected]:~$ sudo iptables -A INPUT -p icmp –icmp-type echo-reply -j DROP
[email protected]:~$ sudo iptables -A INPUT -p icmp –icmp-type echo-request -j DROP

Блокируем доступ по основной базе:

Цитата:

[email protected]:~$ sudo iptables -A INPUT -m set –set rangeip src -j DROP

Блокируем доступ по базе, предоставленной Ar3s’ом:

Цитата:

[email protected]:~$ sudo iptables -A INPUT -m set –set badip src -j DROP

Сохраняем настройки iptables & ipset:

Цитата:

[email protected]:~$ sudo ipset –save >> /srv/ipset.rules
[email protected]:~$ sudo iptables-save >> /srv/iptables.rules

Приблизительные настройки фаервола скриншот

На 2-ух ядерном ноутбуке, с 2 ГБ ОЗУ памяти. Запущенные торент и джаббер клиенты суммарно создают 698 подключении. 100 mb\sec канал занят на 87%(п̶о̶р̶н̶у̶х̶у̶ фильмы качаю) Нагрузка минимальна. скриншот
Финиш!

Плюшки – куда без них-то?

«Хочу админку! Хочу! Хочу! Хочу!»
К сожалению, толковых панелей управления(WEB-морда) для фаервола iptables нет.
Есть iptadmin, скриншоты можно посмотреть здесь. С сентября 2011 года не поддерживается разработчиками. Ставьте на свой страх и риск.

«А работает ли?»
Вопрос действительно, не тривиальный.
Хотя и узнать заходили ли к нам на сервер, за нахождением админки с спай-трекера мы не сможем. (Мало ли, это был гуглбот или корявая попытка брутефорса, прим.)
Общий КПД системы посчитать мы все таки сможем 🙂
Для подсчета нам лишь достаточно включить ведение журнала для цепочки «INPUT» в iptables, перед блокировкой доуступа.

WARNING: Метод стоит рассматривать только в краткосрочной перспективе(для проверки), на продакшен сервере со временем забьет весь жесткий диск логами работы фаервола.

Удаляем ранее созданные правила и цепочки:

Цитата:

[email protected]:~$ sudo iptables -F
[email protected]:~$ sudo iptables -X

Опять таки, осторожней! Могут быть прописаны правила роутинга, доступа из сети за NAT и прочие, не мало важные правила фаервола.

Включаем ведение логов перед блокировкой:

Цитата:

[email protected]:~$ iptables -A malware-protection -j LOG –log-prefix "Malware-protection: " –log-level 7

После продолжаем с момента действии(там где команды DROP).

По прошествии N-го времени, проверяем что заблокировал фаервол.
(по умолчанию, iptables введет журнал в /var/log/messages)
Командой:

Цитата:

[email protected]:~$ sudo cat /var/log/messages* | grep "Malware-protection" | wc -l

Лучший вариант – проверять систему в бою.

«Хочу круче!»

Защитить еще сильнее сервер можно следующими методами:

  • Заблокировав доступ из всех стран, оставив только целевую страну.
  • Собрав\купив более большую базу данных IP адресов "мешающих" спокойной работе. Где купить не знаю, но знаю точно – кто ищет тот всегда найдет.
  • Разбивая ботнет\нагрузку на несколько частей. Для каждой части – свой ип, свой домен. Как показывает практика, ребята из анти-вирусных контор проявляют гиперактивность только к большим по масштабу/развороту ботнетам/связкам.
  • Использовать SSL. Дорого, не стабильно, но эффект дает.
  • Перенести http-сервер на нестандартный порт, имхо для ботнета фича бесполезна, а вот для трафика самое то. Всякие бродилки, индексаторы, боты будут отсеяны.
Возможные проблемы и пути их решения:

Q: Установка xtables-add-on на CentOS/RedHat старых версии
A: Для установки понадобится устаревший патч для ядра – patch-o-matic(-ng). Если порыться в глубинках рунета, можно найти умельцев которые продают уже скомпилированный модуль. Как альтернативный вариант – сгодится.

Q: Установка ipset в Debian 6 Squeeze
A: <вырезано>

Q: После установки все «тормозит»
A: В теории возможен и такой вариант(если Вы трафер с суточным объемом 3КК+). На моей практике был один случай, проблема решилась принудительным выставлением таймаутов\тюнингом TCP/IP стека. В данной ситуации пакеты "зависали" в режиме TIME_WAIT. Советую нанять хорошего системного администратора, в первую очередь – для анализа конфигурации системы\железа. Не экономте на железе – докупите про запас несколько гб ОЗУ памяти и ядер процессора. Вдруг Вам завтра партнер предложит 100К ЮСЫ за $20? 🙂

При копировании статьи, базы данных устное согласование с автором обязательно!
@ozerside разрешения копирование на коровку НЕ даю. Понимай как хочешь.
Использование базы в коммерческих целях ЗАПРЕЩЕНО.

2012 © nerowolfe специально для verified.sc

Оставьте комментарий