Настройка PF для отдельной сети

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
gberc
ефрейтор
Сообщения: 50
Зарегистрирован: 2011-05-20 9:41:20

Настройка PF для отдельной сети

Непрочитанное сообщение gberc » 2011-06-02 15:20:21

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

И так есть сеть, показанная на рисунке. Стоит FreeBSD 8.2. Она имеет 2 сетевых адаптера.
Локальная офисная сеть 192.168.1.0. В ней есть шлюз с адресом 192.168.1.128.
Есть еще одна подсеть 192.168.105.0, она используется для подключения сторонних компьютеров.
Задача: дать неограниченный доступ в интернет для всех ip-адресов из подсети 105. При этом станции подключенные из подсети 105 не должны никаким способом видеть подсеть 192.168.1.0, только адрес шлюза 192.168.1.128.
Изображение

Предпринятые мной шаги:
- включил sysctl net.inet.ip.forwarding=1 и gateway_enable="YES" в /etc/rc.conf
- пытаюсь настраивать PF (ядро скомпилировано под него).

Вопросы, которые у меня возникли:
- если я правильно понимаю, то мне нужно настраивать NAT в правилах фаервола. Отсюда вопрос: как мне после nat-преобразования отфильтровать (например заблокировать) пакеты из подсети 105, если я разрешил весь трафик на lo ?
- возможно ли в моем примере,использовать в качестве ext_addr, алиас на сетевом интерфейсе? (я имею ввиду, что во всем этом будет задействована только 1 сетевая карта). Или все таки надо разносить на разные сетевые карты и еще использовать алиас ?

Код: Выделить всё

nat [pass] [log] on interface [af] from src_addr [port src_port] to dst_addr [port dst_port] -> ext_addr [pool_type] [static-port]
Заранее спасибо за помощь.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

Re: Настройка PF для отдельной сети

Непрочитанное сообщение suspender » 2011-06-02 17:16:14

Ну примерно так можно

Код: Выделить всё

ifIsp="сетевуха прова"
ifLan105="сетевуха 192.168.105.0"
...
nat on $ifIsp from 192.168.105.0/24 to any -> ($ifIsp)
...
block all
pass in on $ifLan105 from 192.168.105.0/24 to any
block in on $ifLan105 from 192.168.105.0/24 to 192.168.1.0/24
pass out on $ifIsp from $ifIsp to any
Так, по идее, должно работать. Можно наверняка по другому, более элегантно.
Ну и плюс, если 192.168.1.0/24 тоже как то должно обмениваться с шлюзом - то нужно предусмотреть правила для этого.
И помните : в pf применяется _ПОСЛЕДНЕЕ_ правило (если на каком нить из правил, под которое подпадает пакет, нету 'quick'), и все правила (если не указано no state) создают динамические правила для пропуска обратных пакетов.

ps. sysctl net.inet.ip.forwarding=1 - это для ipfw. Для pf пофиг
ps2. pf имхо стоит юзать только, если интернетов больше одного, и при этом стоит задача корректно обрабатывать входящие запросы к сетевым сервисам сразу на всех внешних интернетах (sshd, httpd ... etc). Это из за отсутствия аналога reply-to в ipfw. В остальных случаях, имхо, лучше юзать ipfw.

suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

Re: Настройка PF для отдельной сети

Непрочитанное сообщение suspender » 2011-06-02 17:29:00

упс, не посмотрел картинку ... хотя и так должно работать, ifIsp - это сетевуха, смотрящая в 192.168.1.0/24

gberc
ефрейтор
Сообщения: 50
Зарегистрирован: 2011-05-20 9:41:20

Re: Настройка PF для отдельной сети

Непрочитанное сообщение gberc » 2011-06-03 9:03:22

suspender, наверно из рисунка это непонятно. Но у меня только шлюз 192.168.1.128 подключен к провайдеру. Всё остальное - это моя локальная сеть. В ней все подключены к одной физической сети. Разделение на подсети 192.168.1.0 и 192.168.105.0 логическое.
Этот вариант правил подходит?

Код: Выделить всё

local_if="bge1" # сетевой интерфейс подсети 192.168.1.0
local_ip="192.168.1.1" # ip FreeBSD подсети 192.168.1.0
local_lan="192.168.1.0/24" 
warning_ip1="192.168.1.2" # алиас FreeBSD подсети 192.168.1.0

warning_if="bge2" # сетевой интерфейс подсети 192.168.105.0
warning_ip="192.168.105.13" # ip FreeBSD подсети 192.168.105.0
warning_lan="192.168.105.0/24" 
gate="192.168.1.128" # шлюз
set skip on lo # это правило здесь нужно?
nat on $local_if from $warning_lan to any -> $warning_if1

block all
pass in on $warning_if from $warning_lan to any # пропускаем трафик из 105 подсети идущий через вторую сетевую во все сети
block in on $warning_if from $warning_lan to $local_lan # блокируем трафик из 105 подсети идущий через вторую сетевую в подсеть 192.168.1.0
pass in on $warning_if from $warning_lan to $gate # пропускаем трафик из 105 подсети идущий через вторую сетевую ТОЛЬКО на шлюз
Вопросы:
- я не понимаю, правильно ли у меня составлено последнее правило. Т.к. у меня FreeBSD подключена в одну сеть двумя сетевыми, то через какую сетевую трафик будет выходить в инет из подсети 105?
- Нужно ли здесь использовать алиас warning_ip1 ?
- Можно ли всё это сделать, задействов только 1 сетевую карту?
suspender писал(а): ps. sysctl net.inet.ip.forwarding=1 - это для ipfw. Для pf пофиг
Значит можно убрать gateway_enable="YES" в /etc/rc.conf ?
suspender писал(а):ps2. pf имхо стоит юзать только, если интернетов больше одного, и при этом стоит задача корректно обрабатывать входящие запросы к сетевым сервисам сразу на всех внешних интернетах (sshd, httpd ... etc). Это из за отсутствия аналога reply-to в ipfw. В остальных случаях, имхо, лучше юзать ipfw.
В дальнейшем буду пытаться настроить на отдельной станции именно 2 провайдера+1 локалка. Сейчас разбираюсь с простым случаем.

suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

Re: Настройка PF для отдельной сети

Непрочитанное сообщение suspender » 2011-06-03 9:39:42

Ну у вас написано тоже самое что и у меня, кроме последнего правила.

Правило

Код: Выделить всё

pass in on $warning_if from $warning_lan to $gate # пропускаем трафик из 105 подсети идущий через вторую сетевую ТОЛЬКО на шлюз
имхо не нужно, т.к. пакет который нужно отправить из сети 105 в интернет - пройдёт в in на $warning_if по правилу

Код: Выделить всё

pass in on $warning_if from $warning_lan to any # пропускаем трафик из 105 подсети идущий через вторую сетевую во все сети
и не будет заблокирован правилом

Код: Выделить всё

block in on $warning_if from $warning_lan to $local_lan # блокируем трафик из 105 подсети идущий через вторую сетевую в подсеть 192.168.1.0
далее он будет маскирован натом и попытается отправится дальше, имея src-ip - ip тачки с freebsd на интерфейсе $local_if
И вот для этого нужно разрешающее правило для исходящих с freebsd

Код: Выделить всё

pass out on $local_if from $local_if to any
В текущей конфигурации ваше последнее правило не делает ничего. Вот если вы настроите чтобы шлюз натил пакеты из 105-й подсети - тогда нужно будет убрать nat и добавить разрешающее правило (как у вас последнее)

ps. Могу ошибацца, т.к с pf познакомился только недавно, когда появился второй интернет канал и пришлось слезать с ipfw.

gberc
ефрейтор
Сообщения: 50
Зарегистрирован: 2011-05-20 9:41:20

Re: Настройка PF для отдельной сети

Непрочитанное сообщение gberc » 2011-06-06 12:18:42

Что-то я делаю не так.. Не получается самому разобраться.
Доразбирался до того, что клиенты из 105-ой подсети по ip адресам пингуют инет, а по именам нет.
/etc/rc.conf

Код: Выделить всё

#_# сетевые настройки
hostname="JA.1.local"
defaultrouter="192.168.1.128"
#_# локальная сеть
ifconfig_bge1="inet 192.168.1.11  netmask 255.255.254.0"
#_# дополнительный ip-адрес для PF для 105-ой подсети для транслаяции NAT
ifconfig_bge1_alias1="inet 192.168.1.13 netmask 255.255.255.240"
#_# 105 подсеть
ifconfig_bge0="inet 192.168.105.13  netmask 255.255.255.240"

gateway_enable="YES"
Файл pf.conf

Код: Выделить всё

#_# интерфейс в локальную сеть
local_if="bge1"
#_# адрес шлюза
gate="192.168.1.128"
#_# локальная сеть
local_lan="192.168.1.0/23"
#_# ip-адрес локального интерфейса
local_ip="192.168.1.11"
#_# ip-адрес для NAT
local_war_ip="192.168.1.13"

#_# интерфейс в WARNING сеть
warning_if="bge0"
#_# ip-адрес для WARNING сети
warning_ip="192.168.105.13"
#_# ГРЯЗНАЯ локальная сеть
warning_lan="192.168.105.0/28"
#_# порт для поключения по SSH
ssh_port="33333"

#_# разрешенные типы сообщений icmp
icmp_types="{echoreq, unreach}" 

#_# СЕКЦИЯ  глобальные опции.
#_# полностью пропускает проверку на петле.
set skip on lo0

#_# СЕКЦИЯ параметры нормализации
scrub in all

#_# СЕКЦИЯ  port forwarding & NAT
#_# NAT средствами PF
#_# разрешаем проходить пакетам через local_if из грязной сети warning_lan куда угодно 
nat on $warning_if from $warning_lan to any -> $local_war_ip

#_# запрет всего по-умолчанию
block all 

#_# разрешаем весь исходящий трафик с локальной машины 
pass out on $local_if from $local_if to any keep state

#_# разрешаем icmp трафик установленных типов.
pass log inet proto icmp all icmp-type $icmp_types 

#_# разрешаем подключение по SSH на порту 
pass in on $local_if proto tcp from $local_lan to $local_ip port $ssh_port

suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

Re: Настройка PF для отдельной сети

Непрочитанное сообщение suspender » 2011-06-06 16:21:10

Насколько я знаю, само по себе правило

Код: Выделить всё

nat on $warning_if from $warning_lan to any -> $local_war_ip
тупо конфигурирует nat, но ничего никуда не разрешает.
Правилом

Код: Выделить всё

pass log inet proto icmp all icmp-type $icmp_types 
Вы разрешаете любые пинги, и только пинги(не только пинги конечно, но только icmp пакеты) (и если это пинги из 105 подсети - то они заворачиваются в nat). Поэтому ваши клиенты могут пинговать.
Чтобы можно было пинговать по именам - нужно как минимум разрешить dns траффик до DNS сервера.
Ну а чтобы был полноценный инет - нужно разрешить всё из 105-й подсети в инет.

В общем попробуйте один в один конфу которую я вам написал выше, и дальше пляшите от неё.

md
проходил мимо

Re: Настройка PF для отдельной сети

Непрочитанное сообщение md » 2011-06-06 23:17:39

Код: Выделить всё

pass on $warning_if from $warning_lan to ! $local_lan
дальше какие там шлюзы какие надо открыть в 192.168.1.0

gberc
ефрейтор
Сообщения: 50
Зарегистрирован: 2011-05-20 9:41:20

Re: Настройка PF для отдельной сети

Непрочитанное сообщение gberc » 2011-06-07 12:51:22

suspender, сделал по твоему шаблону. Всё получилось.
Моя ошибка была в правиле NAT, я там указывал не тот интерфейс.

md, , Разобрался уже.

Всем спасибо, тему можно закрывать.