Настройка NAT в FreeBSD средствами PF

Интернету уже почти 50 лет. И с каждым днем он становится быстрее, доступнее, функциональнее и, как это не обидно, опаснее. В мировой паутине находятся тысячи и миллионы вирусов, червей, руткитов, троянов и прочих программ, которые ничего полезного в своём функционале не несут. И это только программы. Так же не стоит забывать хакеров, взломщиков, вредителей и просто спамеров.
Кроме полезности и удобства в интернете существуют огромное количество опасностей, от которых компании вцелом и пользователи лично пытаются максимально защититься. Установка антивирусов и фаерволов на конечные компьютеры это хорошо и правильно. Но хорошим тоном считается предупреждение опасностей на более ранних стадиях. Это работа Интернет-Шлюза. Один из Таких шлюзов это Packet Filter. Для FreeBSD он не является «родным», соответственно его нужно вкомпилить в ядро. Как вариант, можно загрузить его модулем и он и так будет работать, но это не есть путь настоящего unix-джедая.
Итак, приступим. Для начала отредактируем конфиг нашего будущего ядра. Для этого скопируем дефолтный и подправим под свои нужды:

# cd /usr/src/sys/i386/conf/
# cp GENERIC PF

после этого открываем наш новый конфиг и добавляем в него следующие строки:

#PacketFilter support
device pf
device pflog
device pfsync
#Queuing support (requied by PF)
options ALTQ
options ALTQ_RED
options ALTQ_CBQ
options ALTQ_RIO
options ALTQ_HFSC
options ALTQ_PRIQ
options ALTQ_NOPCC

device pf включает в ядро поддержку сетевого экрана Packet Filter. Собственно это то, чего мы добиваемся.
device pflog включает в ядро необязательное сетевое псевдоустройство pflog, которое может использоваться для протоколирования трафика через bpf (berkley packet filter). Даемон pflogd может использоваться для сохранения протоколируемой информации на диск. При желании все что попадает туда можно посмотреть tcpdump’ом. Однако, надо знать, как заставить PF логировать траффик. Об этом позднее.
device pfsync включает необязательное сетевое псевдоустройство pfsync, используемое для отслеживания изменений состояния. Поскольку оно не входит в загружаемый модуль, для его использования необходимо собрать собственное ядро.
Очереди (ALTQ — ALTernate Queuing).
options ALTQ включает подсистему ALTQ.
options ALTQ_CBQ включает Class Based Queuing (CBQ). CBQ позволяет распределять пропускную способность соединений по классам или очередям для выставления приоритетов трафика на основе правил фильтрации.
options ALTQ_RED включает Random Early Detection (RED). RED используется для предотвращения перегрузки сети. RED вычисляет длину очереди и сравнивает ее с минимальной и максимальной границей очереди. Если очередь превышает максимум, все новые пакеты отбрасываются. В соответствии со своим названием, RED отбрасывает пакеты из различные соединений в произвольном порядке.
options ALTQ_RIO включает Random Early Detection In and Out.
options ALTQ_HFSC включает Hierarchical Fair Service Curve Packet Scheduler.
options ALTQ_PRIQ включает Priority Queuing (PRIQ). PRIQ всегда пропускает трафик из более высокой очереди первым.
options ALTQ_NOPCC включает поддержку SMP для ALTQ. Эта опция необходима для SMP систем.

Ознакомившись с теми возможностями, которые появятся в нашем новом ядре приступаем к сборке:

# config PF
# cd ../compile/PF/ && make cleandepend && make depend && make && make install && reboot

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

После перезагрузки проверить успешную установку можно командой ifconfig:

pflog0: flags=0<> metric 0 mtu 33200
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
pfsync0: flags=0<> metric 0 mtu 1500
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
syncpeer: 0.0.0.0 maxupd: 128

Эти 2 устройства указывают на то, что PF успешно установился в систему.

Теперь можно заняться непосредственно настройкой самого фаервола.

Начнём с того, что сделаем нашу машину шлюзом и заставим PF грузиться вместе с системой. Сделаем это с помощью системного файла /etc/rc.conf. Добавим в него следующее:

gateway_enable="YES" # Говорим, что наша машина будет выполнять функции шлюза
pf_enable="YES" # Включаем сам PF
pf_rules="/etc/pf.conf" # Указываем файл с набором правил
pflog_enable="YES" # Запускаем демон логирования pflogd
pflog_logfile="/var/log/pflog" # И говорим, куда надо складывать весь лог

Теперь необходимо объяснить фаерволу как он должен работать. Для этого создадим файл /etc/pf.conf с набором правил и приведём его к такому виду:

ext_if = "re0" #указываем внешний интерфейс
int_if = "ste0" # указываем внутренний интерфейс.
localnet = "192.168.7.0/24" # задаём всю локальную сеть
set skip on lo0 # пропускаем все на локальной петле
set loginterface $ext_if # указываем интерфейс с которого снимаем логи
set block-policy return #политика блокировния
scrub in all # вычищаем все фрагментированные пакеты
nat on $ext_if from $localnet to any -> ($ext_if) # собственно эта строка и позволяет поднять NAT
block in on $ext_if all # блокируем весь входящий трафик на внешнем интерфейсе
pass on $int_if all # пропускаем все внутри сети

Замечание!

В FreeBSD 9 строка, отвечающая за NAT немного изменилась:

nat on $ext_if from !($ext_if) -> ($ext_if:0)

Далее следует запустить PF. Это делается следующим образом:

# pfctl -e

Перечитываем конфигурационный файл:

# pfctl -f /etc/pf.conf

Конфигурация фаервола минимальна. Следует обратить внимание на то, что мы закрыли весь доступ на внешний интерфейс. В частых случаях этого достаточно. Если же у Вас напущены различные сервисы, как WEB, FTP или вы хотите удаленно подключаться по SSH, эти все порты необходимо будет отдельно открывать
Видеоинструкция вот тут

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