Чего-то запутался с PF

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Чего-то запутался с PF

Непрочитанное сообщение sst78rus » 2007-09-10 18:59:26

Решил вместо ipwf прикрутить pf. Для самообразования :)
Что имею: локалка (192.168.143.0/24), шлюз с фрей 6.2
Политика по умолчанию - все всем запретить, разрешать по надобности.
Ну с этим вопросов не возникло:

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

block in log-all #log на время тестирования
block out log-all
Для того, чтоб локалка ходила в инет, добавил NAT

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

nat on $ext_tv_if from $int_net to any -> $ext_tv_ip
Вот тут и вылез косяк. У меня было сделано так, что клиенты в инет могут соединяться к любым портам, а сам шлюз только по выбранным (21, 53, 80 ну и еще там чего надо было).
В букваре по PF (http://house.hcn-strela.ru/BSDCert/BSDA ... pcs02.html) написано, что транслирование адресов происходит до фильтрации. Т.е. на фильтры попадет уже пакет идущий от адреса шлюза. Это значит, что придется все порты открывать и для шлюза (исходящие естественно).
Это как-то не айс.
Можно добавить конечно "pass" в правила для nat, но тогда пакеты после трансляции вообще не будут попадать на фильтры и если допустим захочу закрыть какой-то из портов на выход, ничего не выйдет.
Вообщем может покажет кто-нибудь пример конфигурации, где:
- Входящие соединения для простоты заперещены (только keep state)
- Шлюзу разрешены исходящие только на 80 порт
- Локалке за Nat'ом разрешены соединения в инет на порты 1024-2024 (условно).

Хостинговая компания 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/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: Чего-то запутался с PF

Непрочитанное сообщение dikens3 » 2007-09-10 20:10:39

Я отделяю мух от котлет(pf не знаю), т.е. шлюз от пользователей. :-) Оно так проще мне.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Daywalker
ст. сержант
Сообщения: 326
Зарегистрирован: 2007-03-11 22:28:45
Откуда: г. Котельники, МО
Контактная информация:

Re: Чего-то запутался с PF

Непрочитанное сообщение Daywalker » 2007-09-10 20:57:06

sst78rus писал(а):Вообщем может покажет кто-нибудь пример конфигурации, где:
- Входящие соединения для простоты заперещены (только keep state)
- Шлюзу разрешены исходящие только на 80 порт
- Локалке за Nat'ом разрешены соединения в инет на порты 1024-2024 (условно).
Я не гуру, я только учусь, но сделал ИМХО бы так:

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

ext_if="xl0" - внешний
int_if="xl1" - внутренний
internal_net="10.0.231.0/24" -  моя домашняя сеть
me="{192.168.136.24, 10.0.231.1 }" # Etot host, router
1) block in all
2) pass out quick inet proto {tcp, udp} from $me to any port 80 keep state
3) pass out quick inet proto {tcp, udp} from $internal_net to any port {>=1024, <= 2024} keep state
http://blog.volobuev.su - Блог о системном и сетевом администрировании.

sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Re: Чего-то запутался с PF

Непрочитанное сообщение sst78rus » 2007-09-11 8:44:16

dikens3 писал(а):Я отделяю мух от котлет(pf не знаю), т.е. шлюз от пользователей. :-) Оно так проще мне.
Это как? Пользователи в инет как попадают?

sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Re: Чего-то запутался с PF

Непрочитанное сообщение sst78rus » 2007-09-11 9:15:35

Чего у меня ощущение, что я уже отвечал вчера вечером... Ну да ладно, попробую еще =)
Daywalker писал(а): Я не гуру, я только учусь, но сделал ИМХО бы так:

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

ext_if="xl0" - внешний
int_if="xl1" - внутренний
internal_net="10.0.231.0/24" -  моя домашняя сеть
me="{192.168.136.24, 10.0.231.1 }" # Etot host, router
Впринципе, если нет противопоказаний, то вместо списка me можно использовать слово self, оно включает все интерфейсы шлюза (включая локалхост). Вообщем аналог слова me в ipfw.
Daywalker писал(а):

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

1) block in all
2) pass out quick inet proto {tcp, udp} from $me to any port 80 keep state
3)  pass out quick inet proto {tcp, udp} from $internal_net to any port {>=1024, <= 2024} keep state[/quote]
А где nat? Я так понимаю нужно добавить перед этими строками (так pf требует) строчку:

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

0) nat on $ext_if from $internal_net to any -> $ext_if #тут можно использовать не только внешний IP, но и имя интерфейса
Как сказанов документации к PF, трансляция происходит до фильтрации. Допустим у нас идет пакет из локалки, от 10.0.231.5 к http://www.ru:80 Пройдя правило "0", в пакете меняется IP отправителя и попадает оно уже на под правило "3", а под правило "2".

Можно добавить в "0" слово pass:

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

nat pass on $ext_if from $internal_net to any -> $ext_if
В таком случае, судя по документации, пакет на фильтры не подается:
pass
Указывает, что пакет не должен направляться на фильтрующие правила.
Вот вроде как раз то, что надо, можно написать:

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

nat pass on $ext_if from $internal_net to any port {>=1024, <= 2024} -> $ext_if
Вместо any, если понадобится, можно указать таблицу исключений (например все, кроме вконтакте.ру).

Попробовал реализовать - вроде получилось. Понадобилось только добавить правило, чтоб пакеты идущие из локалки в инет на block-in не выпадали. Я сделал так:

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

pass in quick proto { tcp udp } from $int_net to !self keep state
pass out quick proto { tcp udp } from $int_net to !self keep state
Не уверен, что правило с out нужно, потом проверю без него. По идее пакеты должны на Nat pass вываливаться из фильтра.

На данный момент получился вот такой конфиг:

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

#Переменные
ext_tv_if = "rl0"
ext_tv_ip = "86.961.617.68"

ext_izet_if = "sk0"
ext_izet_ip = "192.168.209.230"

#ext_corbina_if=""
#ext_corbina_ip=""

int_if = "rl1"
int_ip = "192.168.143.1"
int_net ="192.168.143.0/24"

#Таблица адресов, которые не считаются интернетом. Сюда включены все используемые локалки
table <not_internet> {192.168.0.0/16, 10.196.0.0/16, 10.192.0.0/16, 10.200.0.0/16, 10.204.0.0/16 }

#Таблица локалок провайдера. От предыдущей отличается только тем, что исключена моя подсеть
table <interzet> {192.168.0.0/16, 10.196.0.0/16, 10.192.0.0/16, 10.200.0.0/16, 10.204.0.0/16, !192.168.143.0/24}

# Порты на которые может соединятся шлюз. На самом деле ftp так работать не будет, надо разрешать out на порты >1024
fw_ports = "{ 80 21 }" 

set block-policy drop

set skip on lo0

#С нормализацией еще толком не разбирался, поставил просто попробовать.
scrub in all

#Заруливаем на сквид все что идет в инет (вернее в "не неинтернет"  :D )
rdr on $int_if inet proto tcp from $int_net to !<not_internet> port = 80  -> 127.0.0.1 port 3128

#Пакетам идущим в инет меняем IP на внешний
nat pass on $ext_tv_if from $int_net to !<not_internet> -> $ext_tv_ip

#Пакетам идущим в локалку вторгого прова, меняем IP
nat pass on $ext_izet_if from $int_net to <interzet> -> $ext_izet_ip

#Все кругом запретить, и писать в лог
block in log-all
block out log-all

#ssh на шлюз. Кривой порт, чтоб не ломились с перебором.
pass in quick proto tcp from any to self port = 34671 keep state

#Разрешает dns запросы к шлюзу. Потом ограничу только локалкой и самим шлюзом
pass in quick proto udp from any to self port = 53 keep state

#Входящий порт для rtorrent-а висящего на шлюзе  :roll: 
pass in quick proto tcp from any to $ext_tv_ip port = 6981 keep state

#Разрешает пакет из локалки куда угодно, лишь бы не к шлюзу 
pass in quick proto { tcp udp } from $int_net to !self keep state
pass out quick proto { tcp udp } from $int_net to !self keep state

#Разрешение собственно для шлюза
pass out quick proto udp from self to any port = 53 keep state
pass out quick proto tcp from self to any port $fw_ports  keep state
Кратко о сети:
У меня инет от одного прова ($ext_tv_if) и огромная локалка от второго ($ext_izet_if).
Через некоторое время появится еще локалка от еще одного прова и vpn от него. + мой vpn, между офисами. Т.е. добавится еще 3 интерфеса.
Из того, что надо сделать - в первую очередь привязать правила к интерфейсам. Сейчас все правила написаны без учета того, на каком интерфейсе оно.

Если кто-то укажет на явные ошибки, буду благодарен.

Аватара пользователя
Daywalker
ст. сержант
Сообщения: 326
Зарегистрирован: 2007-03-11 22:28:45
Откуда: г. Котельники, МО
Контактная информация:

Re: Чего-то запутался с PF

Непрочитанное сообщение Daywalker » 2007-09-11 11:06:33

Про нат вопроса не было
Про self не знал, спасибо. Надо будет у себя попробовать.
Просто макрос me сделал по аналогии с IPFW

P.S. Что с форумом не могут ничем воспользоваться ни Quote, ни code ни даже смайликом.
При нажатии на кнопку Code ничего не происходит
http://blog.volobuev.su - Блог о системном и сетевом администрировании.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35040
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Чего-то запутался с PF

Непрочитанное сообщение Alex Keda » 2007-09-11 11:53:21

думаю, это у тя жава-скрипты отключены
Убей их всех! Бог потом рассортирует...