Настройка PF во FreeBSD

Автор: | 06.04.2015

Хотелось бы написать, как я настраивал пакетный фильтр во FreeBSD на офисном интернет шлюзе.

Задача:

  1. Дать доступ в Интернет сотрудникам организации;
  2. Разрешить соединение с другими офисами;
  3. Разрешить отдельное VPN соединение для сотрудников, которым необходим внешний IP адрес из другой подсети;
  4. Иметь возможность, что бы неизвестный IP адрес устройства, перенаправлялся на внутренний веб сервер;
  5. Блокировать определённые адреса, определённым пользователям.

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

Делается это элементарно и написано об этом много статей, но на всякий случай напишу, нужно прописать в конфигурационном файле ядра следующие строки:


device pf
device pflog
device pfsync
options ALTQ
options ALTQ_CBQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_HFSC
options ALTQ_PRIQ
options ALTQ_NOPCC


После этого собираем и устанавливаем.
Дальше нужно отредактировать файл /etc/rc.conf
В его пишем:


#PF
pf_enable="YES"
pf_rules="/etc/pf.conf"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""


И собственно сам конфиг пакетного фильтра:


lan_net = "192.168.1.0/24"                  #Наша сеть
lan_1 = "192.168.10.0/24"                   #Сеть 1 офиса
lan_2 = "192.168.4.0/24"                    #Сеть 2 офиса
lan_3 = "10.0.0.0/8"                        #Сеть 3 офиса
ext_3 = "ng0"                               #Интерфейс VPN 3 офиса
ext_3gw = "10.1.1.59"                       #Шлюз 3 офиса
int_if = "hn0"                              #Интерфейс внутренней сети
ext_if = "hn1"                              #Интерфейс внешней сети Интернет
ext_2 = "tun0"                              #Интерфейс 2 офиса
ext_2gw = "192.168.224.1"                   #Шлюз 2 офиса
ext_1 = "tun1"                              #Интерфейс 1 офиса
ext_1gw = "10.10.200.1"                     #Шлюз 1 офиса
ext_usa = "tun2"                            #Интерфейс для замены IP адреса
ext_gw = "xxx.xxx.xxx.xxx"                  #Внешний IP адрес
ext_gwusa = "192.168.225.1"                 #Шлюз для замены IP адреса

table <device_USA> persist file "/etc/pf/device.list" #Таблица замены IP адреса
table <users> persist file "/etc/pf/users.list"       #Таблица IP пользователей #внутренней сети
table <block_user> persist file "/etc/pf/block.list"  #Таблица заблокированных IP
table <office3> persist file "/etc/pf/office3.list"   #Таблица адресов которым есть #доступ в 3 офис
table <block_ip> persist file "/etc/pf/block_ip.list" #Заблокированные адреса
SERVER = "192.168.1.200"                     #IP адрес сервера внутри сети
FILESERVER = "192.168.1.202"                 #IP адрес внутреннего файл #сервера
allowed_icmp_types="{ echoreq, unreach }"
set block-policy drop                        #Отбрасываем пакеты
scrub in all                                 #Нормализуем трафик

#Включаем трансляцию адресов (NAT)
nat on $ext_if from <users> to any -> ($ext_if)
nat on $ext_usa from <device_USA> to any -> ($ext_usa)
nat on $ext_3 from <office3> to any -> ($ext_3)

#Проброс портов на сервера (SSH, RDP, WWW, MySQL)
rdr on $ext_if proto tcp from any to $ext_if port rdp -> $SERVER port rdp
rdr on $ext_if proto tcp from any to $ext_if port 9022 -> $FILESERVER port 22
rdr on $ext_if proto tcp from any to $ext_if port 8080 -> $FILESERVER port 80
rdr on $ext_if proto tcp from any to $ext_if port 3306 -> $FILESERVER port 3306

#Перенаправляю на внутренний Веб сервер неизвестные мне IP адреса из внутренней сети
rdr on $int_if proto tcp from {any !<users>} to any port http -> 192.168.1.201 port 80
#Как то раз 1 сотрудник попросил меня заблокировать ему доступ к паре сайтов, что было #и сделано
rdr on $int_if proto tcp from <block_user> to <block_ip> port http -> 192.168.1.201 port 80

#Блокировка по умолчанию
block in from any to any
block out from any to any

#Включаю антиспуфинг на внутренних интерфейсах
antispoof for { lo0, $int_if }

#Разрешаю ping и т.д.
pass log inet proto icmp all icmp-type $allowed_icmp_types

#Пропускаем все исходящие пакеты на внутреннем интерфейсе
pass out on $int_if from any to $lan_net
pass out on $int_if from any to $lan_1
pass out on $int_if from any to $lan_2
pass out on $int_if from any to $lan_3

#Пропускаю (quick) пакеты предназначенные самому интернет шлюзу
pass in quick on $int_if from $lan_net to $int_if
pass in quick on $int_if from $lan_1 to $int_if
pass in quick on $int_if from $lan_2 to $int_if
pass in quick on $int_if from $lan_3 to $int_if

#Маршрутизирую исходящий трафик идущий из внутренней сети
pass in on $int_if route-to ($ext_if $ext_gw) proto tcp from <users> to any flags S/SA modulate state
pass in on $int_if route-to ($ext_if $ext_gw) proto { udp, icmp } from <users> to any keep state
pass in on $int_if route-to ($ext_usa $ext_gwusa) from <device_USA> to any
pass in on $int_if route-to ($ext_1 $ext_1gw) from any to $lan_1
pass in on $int_if route-to ($ext_2 $ext_2gw) from any to $lan_2
pass in on $int_if route-to ($ext_3 $ext_3gw) from <office3> to $lan_3

#Основные "выпускающие" правила на внешнем интерфейсе
pass out on $ext_usa proto tcp from any to any flags S/SA modulate state
pass out on $ext_usa proto { udp, icmp} from any to any keep state
pass out on $ext_if proto tcp from any to any flags S/SA modulate state
pass out on $ext_if proto { udp, icmp } from any to any keep state
pass out on $ext_1 proto tcp from any to any flags S/SA modulate state
pass out on $ext_1 proto { udp, icmp } from any to any keep state
pass out on $ext_2 proto tcp from any to any flags S/SA modulate state
pass out on $ext_2 proto { udp, icmp } from any to any keep state
pass out on $ext_3 proto tcp from any to any flags S/SA modulate state
pass out on $ext_3 proto { udp, icmp } from any to any keep state

#Маршрутизация пакетов
pass out on $ext_if route-to ($ext_if $ext_gw) from $ext_if to any
#pass out on $ext_1 route-to ($ext_1 $ext_1gw) from $ext_1 to any
pass out on $ext_2 route-to ($ext_2 $ext_2gw) from $ext_2 to any

#Открываю порты SSH, RDP, HTTP
pass in on $ext_if proto tcp from any to ($ext_if:0) port http
pass in on $ext_if proto tcp from any to ($ext_if:0) port ssh
pass in on $ext_if proto tcp from any to $SERVER port rdp
pass out on $ext_if proto tcp from any to $SERVER port rdp
pass in on $ext_if proto tcp from any to $ext_if port 3306
pass in on $ext_if proto tcp from any to $FILESERVER port ssh
pass out on $ext_if proto tcp from any to $FILESERVER port 9022
pass in on $ext_if proto tcp from any to $FILESERVER port 80
pass out on $int_if proto tcp from any to $FILESERVER port 8080
pass in on $ext_if proto tcp from any to $FILESERVER port 3306
pass out on $int_if proto tcp from any to $FILESERVER port 3306

#Разрешаю подключённым офисам ходить по нашей сети
pass in on $ext_1 proto tcp from any to any
pass in on $ext_1 proto { udp, icmp } from any to any
pass in on $ext_2 proto tcp from any to any
pass in on $ext_2 proto { udp, icmp } from any to any
pass in on $ext_3 proto tcp from any to any
pass in on $ext_3 proto { udp, icmp } from any to any


 

После этого выполняем команду

pfctl -f /etc/pf.conf

И всё! Интернет шлюз с PF на FreeBSD готов к работе!

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *