Простая установка APF. (Advanced Policy Firewall)

1 667 посмотрели
Posted by Алексей Нещадим in IT | Tagged , , , | Leave a comment

Как известно, в любом современном дистрибутиве linux присутствует такое мощное средство как фильтр пакетов netfilter. Что это такое?. Смысл прост. Каждый ip пакет проходит через цепочку правил. Там с этими пакетами в зависимости от правил могут происходить разные интересные вещи.

Они могут отбрасываться, приниматься, модифицироваться и т.д. Для управления этим фильтром пакетов для версий ядра от 2.4 и выше существует утилита iptables. Про эту утилиту написана масса материалов, но в этой заметке мы рассмотрим настройку скрипта, который используя iptables, значительно упрощает настройку фаервола (на базе netfilter) для нашего выделенного сервера.

Страница разработчиков APF находится по адресу http://rfxnetworks.com/apf.php . Идем туда и качаем последнюю свежую версию пакета:
cd /usr/src
wget http://www.r-fx.ca/downloads/apf-current.tar.gz
tar zxvf apf-current.tar.gz

Переходим в папку apf-0.9.6-1 и запускаем инсталляцию скрипта:
cd apf-0.9.6-1
./install.sh

Теперь переходим в каталог /etc/apf/ и открываем на редактирование файл conf.apf
cd /etc/apf
vi conf.apf

Ищем строку
# Common ingress (inbound) TCP ports
IG_TCP_CPORTS="22"
Здесь нужно перечислить все входящие TCP порты, которые должны быть открыты для доступа из сети. Обычно для дедика достаточно таких правил:
IG_TCP_CPORTS="21,22,25,53,80,443,110,143"

Дальше ищем:
# Common ingress (inbound) UDP ports
IG_UDP_CPORTS="53,1194"
Здесь прописываем входящие UDP порты. В нашем случае - разрешаем порт ДНС и порт OpenVPN.

Теперь обратите внимание на строки:
# Egress filtering [0 = Disabled / 1 = Enabled]
EGF="0"
Это значит что фильтр на исходящие TCP и UDP пакеты по умолчанию отключен. В общем-то, можно оставить все как есть и на этом закончить нашу правку, а можно исправить EGF="0" на EGF="1" и продолжить:
# Common egress (outbound) TCP ports
EG_TCP_CPORTS="22"
Меняем на:
EG_TCP_CPORTS="21,22,25,53,80,443,110,143"
Это у нас разрешенные исходящие порты TCP

# Common egress (outbound) UDP ports
EG_UDP_CPORTS="20,21,53,1194" - исходящие UDP порты.

Все остальное оставляем так, как было. Сохраняемся.

Теперь пара слов о других файлах в каталоге /etc/apf.
postroute.rules В нем можно прописать правила пекетного фильтра для цепочки POSTROUTE.
Например для предыдущей заметки по установке OpenVPN в этом файле можно приписать следующее правило:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
deny_hosts.rules - в этот файл можно вставить ip адреса - которые нам надо забанить.
allow_hosts.rules - Тут мы безусловно разрешаем определенные ip адреса. Например тот ip от которого мы заходим на сервер.
Ну и так далее по аналогии. Вообще-то сам файл conf.apf очень грамотно документирован и в нем все это описано.

Запускаем наш скрипт.
service apf start и в течение пяти минут проверяем, как что работает. Если доступ к серверу потерян, либо произошли еще какие-нибудь неполадки связанные с фаерволом, то отчаиваться не нужно. Дело в том, что если в нашем конфигурационном файле прописана строка
DEVEL_MODE="1" (а она по умолчанию прописана именно так), то это значит, что скрипт отключится через пять минут, и мы вновь вернемся к состоянию сервера без фаервола.
Таким образом, когда мы проверим работоспособность фаервола, то строку DEVEL_MODE="1" нужно подредактировать в
DEVEL_MODE="0". Сохраняемся и перезапускаем наш скрипт:
service apf restart

Вот и все. Теперь наш выделенный сервер более защищен от вторжений.

P.S. Пару слов о файлах allow_hosts.rules и deny_hosts.rules. В эти файлы можно добавлять не только ip адреса, но и конструкции вида:

# proto:flow:[s/d]=port:[s/d]=ip(/mask)
где s - ip адрес(порт) источника , d - ip адрес (порт) приемника , flow - направление входящий/исходящий
Например если нам нужно разрешить все входящие tcp пакеты, которые идут на порт 22 нашего сервера и имеют адрес приемника 192.168.2.1 то пишем:
tcp:in:d=22:s=192.168.2.1
Или например:
Разрешить все исходящие на порт 23 и на адрес 192.168.2.1
out:d=23:d=192.168.2.1
Или разрешить все входящие (если не указано in или out то используется in)пакеты которые приходят на порт 3306 из подсети 192.168.5.0/24.
d=3306:s=192.168.5.0/24

Добавить комментарий