Страница 1 из 1

PF - исходящий доступ

Добавлено: 2009-03-10 12:41:25
$Alchemist
Пересел с ipfw на pf и никак не получается разграничить исходящий доступ:

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

ext_if = "em1"
int_if = "em0"
lannet = "192.168.0.0/24"

ext_ip = "95.165.111.222/32"
lan_ip_bsd = "192.168.0.1/32"
root = "192.168.0.10/32"
client_services = "{ 443, 5190 }"
admin_services = "{ 21, 22, 25, 110, 3389, 8080 }"
private_nets= "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"

set block-policy drop
set loginterface $ext_if
set limit { frags 10000, states 10000 }
set optimization normal
set skip on lo0
scrub in all

nat on $ext_if from $lannet to any -> $ext_ip

rdr on $int_if proto tcp from $lannet to any port { ftp, www } -> $lan_ip_bsd port 3129

antispoof quick for { lo0, $int_if, $ext_if }
block log all
block drop in quick on $ext_if from $private_nets to any

pass on $int_if from $lannet to any

pass inet proto icmp all icmp-type echoreq

pass out on $ext_if from $ext_ip_bsd to any
pass out on $ext_if proto tcp from $root to any port $admin_services
pass out on $ext_if proto tcp from $lannet to any port $client_services
При таком раскладе получается полный доступ для всех из-за правила "pass out on $ext_if from $ext_ip_bsd to any".
А хотелось бы: разрешить весь исходящий трафик только с этого шлюза, разрешить клиентам на выход несколько портов и админам на выход еще кое-какие порты.

Re: PF - исходящий доступ

Добавлено: 2009-03-11 7:31:55
alik
попробуй применить quick правило

Re: PF - исходящий доступ

Добавлено: 2009-03-11 9:35:07
$Alchemist
Спасибо, догнал уже: на внешнем интерфейсе даем полный выход, а клиентов ограничиваем на внутреннем.

Re: PF - исходящий доступ

Добавлено: 2009-03-12 15:31:28
$Alchemist
Как, при наличии нескольких внешних адресов, вывести сеть под одним ip, а отдельный сервак под другим?
Делаю так:

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

nat on $ext_if from $pbx to any -> $ext_ip_pbx
nat on $ext_if from $lannet to any -> $ext_ip
но не пашет...
binat тоже не пашет =\

Re: PF - исходящий доступ

Добавлено: 2009-03-12 15:41:55
alik
Я тебя правильно понял???
у тебя несколько провайдеров???
ты хочешь у себя на роутере распределить канал, то есть, чтобы не которые из локалки ходили через ISP1 а другие через ISP2?????
так????

Re: PF - исходящий доступ

Добавлено: 2009-03-12 15:50:48
$Alchemist
Нет, у меня один провайдер и от него несколько внешних адресов.
Я хочу под одним адресом вывести один сервак, а все остальное под другим

Re: PF - исходящий доступ

Добавлено: 2009-03-12 18:32:25
$Alchemist
Работает вышеуказанная схема.
Просто у меня трафик через проксю шел, ip соответственно старый отображался. :pardon:

Re: PF - исходящий доступ

Добавлено: 2009-03-13 5:28:05
alik
Ясно, идея хорошая. :smile:
Так ты говоришь с бинатом у тебя не вышло????
покажи свой конфиг, одна голова хорошо а две лучше, да и народ должен потянуться.
Люблю PF, однако гибкий он слишком.

Re: PF - исходящий доступ

Добавлено: 2009-03-13 10:37:01
$Alchemist
alik писал(а): Так ты говоришь с бинатом у тебя не вышло????
C бинатом тоже вышло, проблема в прокси была, ну и в самом астериске, который я пробрасывал.
Сейчас все пашет. Рабочий конфиг если интересен - чуть позже кину.

Re: PF - исходящий доступ

Добавлено: 2009-03-13 10:42:21
alik
Буду рад твоему конфигу, если не сложно то и схему бы как нибудь описал.
Самому прийдется ставить скоро астерикс и.т.д
Вот думаю у тебя можно будет поучиться

Re: PF - исходящий доступ

Добавлено: 2009-03-13 13:33:30
$Alchemist

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

#################################################################
# Опции
#################################################################

# Интерфейсы
ext_if = "em1"
int_if = "em0"

# IP адреса
extnet = "95.161.XXX.XXX."
lannet = "192.168.0.0/23"
ext_ip = "95.161.XXX.XX1"
ext_ip_pbx = "95.161.XXX.XX2"
bsd = "192.168.0.1/32"
mail = "192.168.0.100/32"
pbx = "192.168.1.227/32"
terminal = "192.168.1.144/32"
root = "192.168.0.10/32"
gs = "192.168.0.96/32"
fserv = "192.168.0.3/32"
friends = "{ XXXXXXXXXXXXXXXX }"
private_nets= "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"

# Порты
client_ports = "{ 21, 123, 80, 443, 2443, 3128, 3129, 3389, 5190 }"
admin_ports = "{ 21, 25, 110, 123, 80, 443, 2443, 3128, 3129, 3389, 5190, 22, 3390 }"
pbx_udp = "{ 2727, 4520, 4569, 5036, 5060, 10000:20000 }"
pbx_tcp = "{ 5060 }"

#################################################################
# Нормализация
################################################################

# Определяем политику при блокировке пакетов
set block-policy drop
# Логируемый интерфейс
set loginterface $ext_if
# Максимальное количество записей в пуле отвечающем за нормализацию трафика (scrub)
# Максимальное количество вхождений в пул отвечающий за состояние таблицы состояний соединений (keep state)
set limit { frags 10000, states 10000 }
# Устанавливаем тип оптимизации
set optimization normal
# Игнорируем фильтрацию на кольцевом интерфейсе
set skip on lo0
# Нормализация всего входящего трафика на всех интерфейсах
scrub in all

#################################################################
# NAT & RDR
#################################################################

# NAT для Asterisk
nat on $ext_if from $pbx to any -> $ext_ip_pbx

# NAT  для локалки
nat on $ext_if from $lannet to any -> $ext_ip

# Пробрасываем порты на Asterisk.
rdr on $ext_if from any to $ext_ip_pbx -> $pbx

# Пробрасываем порты на почтовый сервер - smtp для всех.
rdr on $ext_if proto tcp from any to $ext_ip port smtp -> $mail

# Пробрасываем порты на почтовый сервер - pop3 для филиалов.
rdr on $ext_if proto tcp from $friends to $ext_ip port pop3 -> $mail

# Пробрасываем порты на почтовый сервер - https для всех.
rdr on $ext_if proto tcp from any to $ext_ip port https -> $mail

# Пробрасываем порты на виндовый терминальный сервер.
rdr on $ext_if proto tcp from any to $ext_ip port rdp -> $terminal

# Пробрасываем порты на General-server.
rdr on $ext_if proto tcp from any to $ext_ip port 3390 -> $gs port 3389

# Пробрасываем порты на web сервер.
#rdr on $ext_if proto tcp from any to $ext_ip port www -> $www

# Отправляем локальных интернетчиков на squid.
rdr on $int_if proto tcp from $lannet to any port www -> 127.0.0.1 port 3129

#################################################################
# Правила фильтрации
#################################################################

# Защита от спуфинга
antispoof quick for { lo0, $int_if, $ext_if }

# Блокируем всё
block log all

# Блокируем тех, кто лезет на внешний интерфейс с частными адресами
block drop in quick on $ext_if from $private_nets to any

# Разрешаем icmp
pass inet proto icmp icmp-type echoreq

# Разрешаем DNS для локалки
pass in on $int_if proto udp from $lannet to $bsd port domain

# Тестовый полный выход
pass in log on $int_if from any to any

# Выпускаем Asterisk
#pass in on $int_if from $pbx to any

# Выпускаем почтовик
#pass in log on $int_if proto tcp from $mail to any port smtp keep state

# Выпускаем админские сервисы
#pass in on $int_if proto tcp from $root to any port $admin_ports

# Выпускаем клиентске сервисы
#pass in log on $int_if proto tcp from $lannet to any port $client_ports

# Разрешаем нашему шлюзу полный выход с обоих интерфейсов
pass out on $ext_if from any to any
pass out on $int_if from any to any

################ Icoming ##################

# Разрешаем входящий ssh
pass in log on $ext_if proto tcp from any to $ext_ip port 22

# Разрешаем входящий smtp для всех
pass in on $ext_if proto tcp from any to $mail port smtp flags S/SA synproxy state

# Разрешаем входящий pop3 для филиалов
pass in on $ext_if proto tcp from $friends to $mail port pop3 flags S/SA synproxy state

# Разрешаем входящий https
pass in log on $ext_if proto tcp from any to $mail port https

# Разрешаем входящий rdp
pass in log on $ext_if proto tcp from any to $terminal port rdp flags S/SA synproxy state

# Разрешаем входящий rdp2
pass in log on $ext_if proto tcp from any to $gs port rdp flags S/SA synproxy state

# Разрешаем входящий Asterisk
pass in on $ext_if proto tcp from any to $pbx port $pbx_tcp flags S/SA keep state
pass in on $ext_if proto udp from any to $pbx port $pbx_udp keep state
Сейчас такие проблемы:
- не работают исходящие smtp, rdp (причем на вход они работают)
- не работает входящий https
хотя по логом происходит pass и блокировок нет.

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

rule 23/0(match): pass in on em0: 192.168.0.10.4066 > 77.88.21.89.25: [|tcp]
В какую сторону копать следует?
Так понимаю что пакеты проходят, но соединения не устанавливаются...
FreeBSD 7.1 RELEASE

Re: PF - исходящий доступ

Добавлено: 2009-03-13 13:57:22
$Alchemist
В таблице состояний откопал следующее:

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

# pfctl -ss | grep 77.88.21.89
all tcp 77.88.21.89:25 <- 192.168.0.10:4114       CLOSED:SYN_SENT
all tcp 192.168.0.10:4114 -> 95.161.24.130:57415 -> 77.88.21.89:25       SYN_SENT:CLOSED

Re: PF - исходящий доступ

Добавлено: 2009-03-13 14:25:34
alik
Попробуй для начало
вместо этого:
# Пробрасываем порты на почтовый сервер - https для всех.
rdr on $ext_if proto tcp from any to $ext_ip port https -> $mail

вот это
https"{443, 8080}"
rdr pass on $ext_if proto tcp from any to $ext_ip port $https -> $mail
далее попробуй вместо https указать диапазон портов.
У меня как -то глюк был, не знаю из-за чего я с тех пор порты

Re: PF - исходящий доступ

Добавлено: 2009-03-13 14:48:48
$Alchemist
Попробовал, не прокатило =\
Проблема скорее всего одна и связана с установкой соединений.
Помогите плз кто сталкивался, нужно хотябы smtp вывести...

ЗЫ: Со шлюза тоже соединения не устанавливаются

Re: PF - исходящий доступ

Добавлено: 2009-03-13 14:56:04
alik
пример
rdr pass on $ext_if proto tcp from any to $ext_if port {18421 6346} -> 192.168.10.12
у тебя там указан там внешний айпи, вместо него укажи интерфейс

Re: PF - исходящий доступ

Добавлено: 2009-03-13 16:18:55
$Alchemist
СЦУКО!!!!!
Пардон, господа :"":
Порты были закрыты у провайдера :st: