Хочу рассказать историю жизни сервера в кампусной сети Новосибирского университета, которая началась в далеком 2004 году, а так же этапы его оптимизации и даунгрейдинга.
Многие вещи в статье покажутся общеизвестными хотя бы по той причине, что речь пойдет о событиях почти десятилетней давности, хотя на тот момент это были передовые технологии. По той же причине кое что вообще потеряло актуальность, но далеко не все, так как сервер до сих пор живет и обслуживает сетку из 1000 машин.
Читать полностью »
Метка «ipset»
Девятилетняя оптимизация маршрутизатора
2013-10-29 в 9:38, admin, рубрики: dhcp, dhcp-relay, ipset, iptables, История ИТ, контроль доступа, Серверная оптимизация, Сетевые технологии, метки: dhcp, dhcp-relay, ipset, iptables, контроль доступа, серверная оптимизацияОперативная реакция на DDoS-атаки
2013-04-09 в 16:35, admin, рубрики: ddos, ipset, iptables, nginx, Серверное администрирование, метки: ddos, ipset, iptables, nginxОдин из ресурсов, за которым я присматриваю, вдруг стал неожиданно популярным как у хороших пользователей, так и у плохих. Мощное, в общем-то, железо перестало справляться с нагрузкой. Софт на сервере самый обычный — Linux,Nginx,PHP-FPM(+APC),MySQL, версии — самые последние. На сайтах крутится Drupal и phpBB. Оптимизация на уровне софта (memcached, индексы в базе, где их не хватало) чуть помогла, но кардинально проблему не решила. А проблема — большое количество запросов, к статике, динамике и особенно базе. Поставил следующие лимиты в Nginx:
на соединения
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 100;
и скорость запросов на динамику (fastcgi_pass на php-fpm)
limit_req_zone $binary_remote_addr zone=dynamic:10m rate=2r/s;
limit_req zone=dynamic burst=10 nodelay;
Сильно полегчало, по логам видно, что в первую зону никто не попадает, зато вторая отрабатывает по полной.
Но плохиши продолжали долбить, и захотелось их отбрасывать раньше — на уровне фаервола, и надолго.
Сначала сам парсил логи, и особо настырных добавлял через iptables в баню. Потом парсил уже по крону каждые 5 минут. Пробовал fail2ban. Когда понял, что плохишей стало очень много, перенёс их в ipset ip hash.
Почти всё хорошо стало, но есть неприятные моменты:
— парсинг/сортировка логов тоже приличное (процессорное) время отнимает
— сервер тупит, если началась новая волна между соседними разборками (логов)
Нужно было придумать как быстро добавлять нарушителей в черный список. Сначала была идея написать/дописать модуль к Nginx + демон, который будет ipset-ы обновлять. Можно и без демона, но тогда придётся запускать Nginx от рута, что не есть красиво. Написать это реально, но понял, что нет столько времени. Ничего похожего не нашёл (может плохо искал?), и придумал вот такой алгоритм.
При привышении лимита, Nginx выбрасывает 503-юю ошибку Service Temporarily Unavailable. Вот я решил на неё и прицепиться!
Для каждого location создаём свою страничку с ошибкой
error_page 503 =429 @blacklist;
И соответствующий именованный location
location @blacklist {
fastcgi_pass localhost:1234;
fastcgi_param SCRIPT_FILENAME /data/web/cgi/blacklist.sh;
include fastcgi_params;
}
Дальше интересней.
Нам нужна поддержка CGI-скриптов. Ставим, настраиваем, запускаем spawn-fcgi и fcgiwrap. У меня уже было готовое для collectd.
Сам CGI-скрипт
Читать полностью »
Как блокировать пользователей, заходящих через Tor
2012-06-04 в 20:52, admin, рубрики: ipset, linux, system administration, Tor, системное администрирование, метки: ipset, linux, system administration, TorТролли сейчас учёные, через одного пользуются Tor'ом. К счастью, блокировать сервера Tor'а не намного сложнее, чем пользователей по IP. Проект Tor подскажет текущий список серверов, с которых можно доступиться до вашего IP адреса. Небольшая проблема в том, что в списке сотни, если не тысячи адресов, поэтому стоит использовать ipset:
# создаём хеш-таблицу индивидуальных IP-адресов в userspace под названием tor
ipset -N tor iphash
# получаем список IP адресов Tor и читаем построчно, $YOUR_IP нужно заменить на свой адрес
wget -q https://check.torproject.org/cgi-bin/TorBulkExitList.py?ip=$YOUR_IP -O -|sed '/^#/d' |while read IP
do
# молчаливо добавляем адрес сервера Tor в нашу хеш-таблицу,
ipset -q -A tor $IP
done
# командуем iptables отбрасывать трафик из таблицы tor
iptables -A INPUT -m set --match-set tor src -j DROP