February 2, 2010

Как заблокировать IP-адрес с помощью ipfw во FreeBSD

Если с определённого IP-адреса на сервер идут постоянные запросы, оптимальным решением будет заблокировать его до выяснения обстоятельств. Если обращения идут к конкретному сайту, существуют два основных способа: заблокировать htaccess'ом или через встроенный во FreeBSD файрволл ipfw. С предложением использовать первый столкнулся сегодня и пришёл к выводу что это было не самое лучшее решение. Перед тем, как рассмотреть на примере различия между этими способами, условимся:
  • Сервер на FreeBSD с панелью ISPmanager
  • Следовательно, конкретный сайт и htaccess к нему лежит в директории /home/user/data/www/sitedir
Далее постараюсь объяснить как можно более понятным языком. Если Вы поняли о чём речь ещё с первого абзаца — можете не читать пояснения к примеру. Итак, включим воображение и представим, что:
  • сервер — это город;
  • он окружён стеной, у которой есть подконтрольные ворота (firewall);
  • в нём есть много зданий (службы);
  • среди всех — здание, нас интересующее (web-сервер apache);
  • в этом здании много этажей (директории);
  • каждый этаж — это директория (/home — 1-й, /user — 2-й, /data — 3-й и т.д.);
  • пакет, исходящий с атакующего IP-адреса, должен попасть на самый последний этаж /sitedir здания apache, пройдя последовательно по всем этажам (т.е. по пути /home/user/data/www/sitedir)
Принципиальная разница состоит в том, что при прочих равных условиях, в случае с файрволлом ipfw этот пакет будет зарублен ещё в воротах. А если будет задана блокировка htaccess'ом, то он спокойно пройдёт ворота, попадёт в apache, и будет проверяться на каждом этаже пока не дойдёт до htaccess'a, который его отклонит. Да, можно и в самом httpd.conf'е запретить, но это всё равно не лучший вариант т.к. другие службы будут для него по-прежнему доступны.

Чтобы заблокировать в ipfw конкретный IP-адрес, воспользуйтесь командой:
/sbin/ipfw add deny all from 123.123.123.123 to me
Здесь, 123.123.123.123 — атакующий IP-адрес.

Чтобы заблокировать в ipfw конкретную зону с IP-адресами, воспользуйтесь командой:
/sbin/ipfw add deny all from 123.0.0.0/8 to me
Здесь, 123.0.0.0/8 — зона, содержащая атакующий IP-адрес среди 123.0.0.0 по 123.255.255.255, а /8 в конце — маска сети 255.0.0.0, рассчитанная ip-калькулятором.

Хочу также вкратце рассказать о вот такой реализации: в rc.conf прописывается директива firewall_script со значением ipfw.script. Подразумевается, что в этой же директории (/etc) создан shell-скрипт ipfw.script, в который вносятся различные параметры для файрволла. Также, в нём подключается другой shell-script, который размещён в другой директории и разрешён php-скриптам для чтения и изменения. Эти самые скрипты парсят его и выводят в html-форму, где можно редактировать/удалять заблокированные ip-адреса. По сохранении этот файл перезаписывается и подгружается файрволлом. Вот такой веб-интерфейс. Аспекты безопасности скриптов — тема не этой статьи.

No comments: