Простой вариант NAT+PF во FreeBSD

Posted Пт, 01/08/2010 - 16:57 by ttys

Для организации NAT с помощью PF нам понадобится следующее:

Включить pf (packet filter)

vi /etc/rc.conf

gateway_enable="YES" #Разрешает серверу быть шлюзом

pf_enable="YES" #Запуск pf

pflog_enable="YES" #не обязательно, возможность писать логи pf

pf_rules="/etc/pf.conf" #Пуьт к правилам pf

pf_program="/sbin/pfctl" #Путь к программе управления pf

pf_flags="" #Необходимо для pfctl

defaultrouter="192.168.1.254" #Шлюз провайдера

Можно и пересобрать ядро, с поддержкой pf

дабы pf не ругался на отсутствие ALTQ (ограничивать пропускную способность канала) или для его использования

No ALTQ support in kernel

ALTQ related functions disabled

добовляем в ядро и ALTQ

cp /usr/src/sys/i386/conf/GENERIC /usr/src/sys/i386/conf/ROUTER-PF

vi /usr/src/sys/i386/conf/ROUTER-PF

# pf

device pf

device pflog

device pfsync

options ALTQ

options ALTQ_CBQ # Class Bases Queuing (CBQ)

options ALTQ_RED # Random Early Detection (RED)

options ALTQ_RIO # RED In/Out

options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)

options ALTQ_PRIQ # Priority Queuing (PRIQ)

options ALTQ_NOPCC # Required for SMP build

после установки ядра надо подредактировать правила pf

vi /etc/pf.conf

ext_if="rl1" #Внешний интерфейс (смотрит к провайдеру WAN)

int_if="rl0" #Внутренний интерфейс (смотрит в нашу сеть LAN)

set skip on lo0 #пропускаем проверку на петле

scrub in all #собираем все части пакета перед отправкой

nat on $ext_if from $int_if:network to any -> ($ext_if)

block all #запретим все отовсюду

pass in on $int_if from any to any #разрешаем всё из локальной сети

pass out on $ext_if from $ext_if to any #разрешаем серверу доступ в интернет

pass in on $ext_if proto tcp from any to $ext_if port ssh #разрешаем ssh

pass in inet proto icmp all icmp-type echoreq #разрешаем ping

Готово!

Осталось прочитать правила pf

pfctl -f /etc/pf.conf

pfctl -e #включить pf

pfctl -d #выключить pf

можно натить по ip адресам.

Для этого надо немного поредоктировать pf.conf

vi /etc/pf.conf

ext_if="rl1" #Внешний интерфейс (смотрит к провайдеру WAN)

int_if="rl0" #Внутренний интерфейс (смотрит в нашу сеть LAN)

table <pf-allow-pc> file "/etc/pf-allow-pc"

set skip on lo0 #пропускаем проверку на петле

scrub in all #собираем все части пакета перед отправкой

nat on $ext_if from <pf-allow-pc> to any -> ($ext_if)

block all #запретим все отовсюду

pass in on $int_if from any to any #разрешаем всё из локальной сети

pass out on $ext_if from $ext_if to any #разрешаем серверу доступ в интернет

pass in on $ext_if proto tcp from any to $ext_if port ssh #разрешаем ssh

pass in inet proto icmp all icmp-type echoreq #разрешаем ping

и добавить ip адреса(в строке должен быть один адрес) тех кому разрешено ходить в интернет

vi /etc/pf-allow-pc

192.168.0.2

192.168.0.3

192.168.0.5

P.S. ВАЖНО!

В случае если на сервере не запущен named то на клиентских компьютерах надо в поле DNS указать пограничный DNS сервер, или настраивать named самим

Для того, чтобы настроить named самим, надо сделать следующее:

vi /etc/rc.conf

named_enable="YES"

Затем надо указать в named.conf наш шлюз, для этого:

Надо найти строки listen-on и forwarders и добавьте адрес внутреннего интерфейса

vi /etc/namedb/named.conf

listen-on { 127.0.0.1; 192.168.1.1;};

forwarders { 127.0.0.1; 192.168.1.1;};

http://www.ignix.ru/public/daemon/easy-nat-pf

Обновлено: 12.03.2015