PF, два провайдера

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Storoge
рядовой
Сообщения: 44
Зарегистрирован: 2007-09-19 12:04:14
Откуда: Брянск
Контактная информация:

PF, два провайдера

Непрочитанное сообщение Storoge » 2008-07-28 18:14:43

Понимаю, что тема избитая, но никак не могу сделать, как надо.
Уже перелопатил кучу материалов, по всякому попробовал (в том числе и статью на сайте),но никак.

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

Вот последний вариант pf.conf:

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

#Переменные

#Первый провайдер - через pptp(на нем наш сайт)
#Внешний интерфейс
ipout1 = "xxx"
#Шлюз для интерфейса
gw_1 = "xxx1"
#Интерфейс
ifout1 = "tun0"
ifvpn = "em2"

#Второй провайдер - через ethernet (через него юзеры вызодят в интернет)
#Внешний интерфейс
ipout2 = "yyy"
#Шлюз для интерфейса
gw_2 = "yyy1"
#Интерфейс
ifout2 = "em0"

#Наша сеть
table <ournet> { 10.4.0.0/16 }

#Плохая сеть :(
table <nonet> const { 192.168.0.0/16, 169.254.0.0/16,  224.0.0.0/4, 240.0.0.0/4, 204.152.64.0/23, 224.0.0.0/3 }

#Внутренние интерфейсы
ifuser = "{em1, vlan10, vlan11, vlan12, vlan13, vlan14, vlan15, vlan16, vlan17, vlan18, vlan19, vlan20, vlan21, vlan22, vlan23, vlan24, vlan25, vlan50, vlan100}"

#Доверенные хосты провайдеров
table <vpnsrv> const { xxx, zzz13, zzz1t, zzzzz}

#Таблица для зарегестрированных пользователей
table <usr> persist # Список разрешенных IP-адресов пользователей

#Список портов, под которым всем можно подключаться
superports = "{ 5555 , 33 }"

#Список портов, которые заворачиваются на сквид
wwwports = "{ 80, 8080, 443, 563, 5190, 777, 5999 }"

#Наш веб-сервер
web_server = "10.4.1.254"

#Список всяких нехороших гадов
table <bad> persist

#Установки политик
set state-policy if-bound
set debug misc
set optimization normal
set block-policy drop
set require-order yes
set fingerprints "/etc/pf.os"

#Не фильтруем пакеты на кольцевом интерфейсе
set skip on lo0

#Нормализуем входящий трафик
scrub in all fragment reassemble min-ttl 15 max-mss 1400
scrub all random-id min-ttl 128 reassemble tcp

#Перенаправляю все на squid
rdr on $ifuser inet proto tcp from 10.4.0.0/16 to !<ournet> port $wwwports -> 10.4.1.254 port 3128

#Перенаправляю запросы на наш веб-сервер
rdr on $ifout1 inet proto tcp to $ipout1 port www tag WEB_SERVER -> $web_server port www

#Натим трафик первого провайдера
nat on $ifout1 inet proto tcp tagged WEB_SERVER -> ($ifout1)

#Натим канал второго провайдера
nat on $ifout2 inet from <ournet> to !<ournet>  -> ($ifout2)

#Защита от спуффинга
antispoof log quick for $ifuser inet

#Блокирум попытки сканирования NMAP
block quick log from any os NMAP
block quick log from any os NAST

#Запрещаю подключение к адресам "хулиганов"
block quick from <bad>

#Пропускаем на сервер только эти порты
pass quick on $ifuser proto { tcp, udp } from <ournet> to <cs> port $superports flags S/SA modulate state

#Разрешаем движение на кольцевом интерфейсе
pass in quick on lo0 all
pass out quick on lo0 all

#Блокируем сети, которых у нас нет и не должно быть в Интернете
block quick from any to <nonet>
block quick from <nonet> to any

#Разрешаем ping во всех направлениях
pass quick inet proto icmp all icmp-type echoreq code 0 keep state
pass quick inet proto icmp all icmp-type unreach code 0 keep state

#Блокируем подключение к некоторым портам на внешнем интерфейсе
block in quick on tun0 proto {tcp, udp} to $ipout1 port { 22, 3128, 3306, 199, 3401, 10000, 33, 5555 }
block in quick on em0 proto {tcp, udp} to $ipout2 port { 22, 3128, 3306, 199, 3401, 10000, 33, 5555 }
block in quick on em0 proto {tcp, udp} from <ournet> to any

#Направляем входящие по каналу первого провайдера по такому-же маршруту
#pass out on $ifout1 keep state

pass in quick on $ifout1 reply-to ( $ifout1 $gw_1 ) inet proto tcp tagged WEB_SERVER keep state
pass out quick on $ifout1 route-to ( $ifout1 $gw_1 ) inet from $ifout1 to !<ournet> keep state

#разрешаем трафик по каналу второго провайдера
#pass quick on $ifout2 all no state

pass in quick on $ifout2 reply-to ( $ifout2 $gw_2 ) inet proto tcp keep state
pass out quick route-to ( $ifout2 $gw_2 ) inet from $ifout2 to !<ournet> keep state


#От безысходности
pass out on $ifout1 route-to ($ifout2 $gw_2) from $ifout2 to any
pass out on $ifout2 route-to ($ifout1 $gw_1) from $ifout1 to any


#Разрешить работу пользователям
pass quick from <usr> to any
pass quick from any to <usr>

#Поддержка VPN
pass quick proto {tcp, udp} from <ournet> to <vpnsrv>
pass quick from <vpnsrv> to <ournet>
pass quick proto gre from any to any

#Запретить все остальное
block quick all
Если проверить командой pfctl -vvsr, то видно, что пакеты идут по правилу pass out quick route-to ( $ifout2 $gw_2 ) inet from $ifout2 to !<ournet> keep state и по правилу pass in quick on $ifout1 reply-to ( $ifout1 $gw_1 ) inet proto tcp tagged WEB_SERVER keep state.

То есть трафик идет как надо через второго провайдера, но заставить работать веб-сервер я не могу, исходящие с него идут почему-то с интерфейса второго провайдера.

Операционная система - FreeBSD 8

Как правильно настроить? Выслушаю любые предложения?

Хостинговая компания 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/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: PF, два провайдера

Непрочитанное сообщение paradox » 2008-07-28 19:01:07

но заставить работать веб-сервер я не могу
наскоко я понимаю веб сервер на этой машине
а ваши pf правила срабатывают для юзеров в локалке

а веб сервер скорее всего срабатывает по дефолтовом роуте

Аватара пользователя
Storoge
рядовой
Сообщения: 44
Зарегистрирован: 2007-09-19 12:04:14
Откуда: Брянск
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение Storoge » 2008-07-28 19:53:33

Да, сервер на этой машине и срабатывает по дефолтному маршруту.
Если я Вас правильно понял, мне надо поменять дефолтный путь?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: PF, два провайдера

Непрочитанное сообщение paradox » 2008-07-28 19:56:55

я не совсем понял что вы хотите сделать

ну поменяете вы деволтный путь
и тогда через другой канал несможете на веб зайти

крутите pf
либо если 7 говорят там можно много дефолтов добавлять
либо natd
либо либо
там вариантов много

qwe
рядовой
Сообщения: 35
Зарегистрирован: 2008-07-29 10:40:42
Откуда: Симферополь
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение qwe » 2008-07-29 10:43:57

Здравствуйте. Я бы на Вашем месте посмотрел в сторону ipfw fwd.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: PF, два провайдера

Непрочитанное сообщение paradox » 2008-07-29 12:16:56

а я бы на вашем
чуть чуть манов по сетям почитал)

Аватара пользователя
Storoge
рядовой
Сообщения: 44
Зарегистрирован: 2007-09-19 12:04:14
Откуда: Брянск
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение Storoge » 2008-07-29 12:20:00

Я хочу следующее: по одному каналу пустить пользователей в Интернет, а на втором канале чтобы висел наш сайт, доступный в Интернете, и все.
В статье на сайте почти такая же ситуация, у меня даже проще, но конфигурация с со статьи не работает.
Переходить на ipfw я уже не буду, слишком много завязано с pf.

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение schizoid » 2008-07-31 12:21:42

я чего-то не понял, в чем трабла. если апач заставить работать тока нат ИПе, который нужен?
так не работает что-ли? или просто по дефолту ответы идут?
ядерный взрыв...смертельно красиво...жаль, что не вечно...

Аватара пользователя
Storoge
рядовой
Сообщения: 44
Зарегистрирован: 2007-09-19 12:04:14
Откуда: Брянск
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение Storoge » 2008-07-31 14:37:49

Да, ответы идут по дефолту

naehi8sh
рядовой
Сообщения: 43
Зарегистрирован: 2008-02-10 2:57:58
Откуда: урал
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение naehi8sh » 2008-08-03 23:16:03

может лучше чтонибуть вроде этого:

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

pass out  route-to ($g_if $g_gw) inet from ($g_if)
pass out  route-to ($c_if $c_gw) inet from ($c_if)
или

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

pass in on $g_if quick reply-to ($g_if $g_gw) to self port 80 keep state
pass in on $c_if quick reply-to ($c_if $c_gw) to self port 80 keep state

uriinf
рядовой
Сообщения: 13
Зарегистрирован: 2008-05-26 15:03:56
Откуда: Ukraine

Re: PF, два провайдера

Непрочитанное сообщение uriinf » 2008-09-04 10:02:27

доброго времени суток!

Есть шлюз FreeBSD 7.0 + PF, два прова. Необходимо по source_ip разводить пользователей по разным каналам.
Все делал по статье http://www.lissyara.su/?id=1276, в ядре

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

device          pf
device          pflog
device          pfsync
options         ALTQ
Ну не работает route-to. :st:
Вот конфиг pf.conf:

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

ext_if_gekkon="rl1"
ext_if_ukrtel="tun0"
vpn_if="ng0"

ip_serv="192.168.11.100"
ip_work="192.168.0.100"
ip_vpn="192.168.1.100"

ext_ip_gekkon="1.1.1.1"
ext_ip_ukrtel="2.2.2.2"

ext_gateway_gekkon="1.1.1.2"
ext_gateway_ukrtel="2.2.2.3"

lan_ports="{ 22, 53 }"
world_ports="{ 1723 }"
vip_ports="{ 22, 3306 }"
remapping_ports="{ 80, 443 }"
vip_remapping_ports="{ 21 }"

table <vip_ip> persist file "/etc/pf/vip"
table <me_ip> { $ip_serv, $ip_work, $ip_vpn, $ext_ip_gekkon, $ext_ip_ukrtel }
table <allow_nat> { $servers_lan, $work_lan, $vpn_lan }
table <remapping_hosts> { 192.168.11.122, 192.168.0.98 }
table <white_ip> persist file "/etc/pf/white"
table <remote_servers> persist file "/etc/pf/remote_servers"

set skip on lo0

scrub in all

nat-anchor "ftp-proxy/*" 
rdr-anchor "ftp-proxy/*"

rdr inet proto { tcp udp } from any to $ext_ip_gekkon port { 80, 443 } tag UKRTEL -> 192.168.0.98
rdr inet proto { tcp udp } from any to $ext_ip_gekkon port 21 tag GEKKON -> 192.168.11.122
rdr inet proto { tcp udp } from any to $ext_ip_gekkon port { 80, 443 } tag GEKKON -> 192.168.11.99

nat on $ext_if_gekkon inet tagged GEKKON -> ($ext_if_gekkon)
nat on $ext_if_ukrtel inet tagged UKRTEL -> ($ext_if_ukrtel)

nat on $ext_if_gekkon inet tagged WHITE -> ($ext_if_gekkon)
nat on $ext_if_ukrtel inet tagged NIGGERS -> ($ext_if_ukrtel)

block all

block in log quick from ! <allow_nat> os NMAP

pass in on $ext_if_gekkon reply-to ($ext_if_gekkon $ext_gateway_gekkon) inet proto { tcp udp } tagged SMERSH keep state
pass in on $ext_if_ukrtel reply-to ($ext_if_ukrtel $ext_gateway_ukrtel) inet proto { tcp udp } tagged IBM keep state
pass out on $ext_if_ukrtel keep state
pass out on $ext_if_gekkon keep state

pass in from <white_ip> to ! <me_ip> tag WHITE
pass in from ! <white_ip> to ! <me_ip> tag NIGGERS
pass in from <allow_nat> to <remote_servers> tag WHITE

pass in on $ext_if_gekkon route-to ($ext_if_gekkon $ext_gateway_gekkon) tagged WHITE keep state
pass in on $ext_if_ukrtel route-to ($ext_if_ukrtel $ext_gateway_ukrtel) tagged NIGGERS keep state

pass in quick inet proto { tcp udp icmp } from <allow_nat> to ! <me_ip>

pass in quick inet from <me_ip> to any

pass in quick inet proto {tcp, udp} from !<allow_nat> to $ext_ip_ukrtel port $world_ports

pass in quick inet proto { icmp } from <allow_nat> to <me_ip>
Всегда идет по defaultroute.
Уже неделю бьюсь над этим. Такое ощущение что не понимает фря route-to, может чего в ядре не хватает?

naehi8sh
рядовой
Сообщения: 43
Зарегистрирован: 2008-02-10 2:57:58
Откуда: урал
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение naehi8sh » 2008-09-04 10:35:56

не совсем понятны воть эти правили, условия отбора одинаковые....

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

rdr inet proto { tcp udp } from any to $ext_ip_gekkon port { 80, 443 } tag UKRTEL -> 192.168.0.98
rdr inet proto { tcp udp } from any to $ext_ip_gekkon port { 80, 443 } tag GEKKON -> 192.168.11.99
тоже самое.... и метить их совсем ни кчему как мне кажеться.

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

nat on $ext_if_gekkon inet tagged GEKKON -> ($ext_if_gekkon)
nat on $ext_if_ukrtel inet tagged UKRTEL -> ($ext_if_ukrtel)

nat on $ext_if_gekkon inet tagged WHITE -> ($ext_if_gekkon)
nat on $ext_if_ukrtel inet tagged NIGGERS -> ($ext_if_ukrtel)
И вот это:

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

pass in on $ext_if_gekkon route-to ($ext_if_gekkon $ext_gateway_gekkon) tagged WHITE keep state
pass in on $ext_if_ukrtel route-to ($ext_if_ukrtel $ext_gateway_ukrtel) tagged NIGGERS keep state
может должно быть похоже на это:

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

pass in on Local_if route-to ($ext_if_gekkon $ext_gateway_gekkon) from чего-то там keep state
pass in on Local_if route-to ($ext_if_ukrtel $ext_gateway_ukrtel) from чего-то там keep state

uriinf
рядовой
Сообщения: 13
Зарегистрирован: 2008-05-26 15:03:56
Откуда: Ukraine

Re: PF, два провайдера

Непрочитанное сообщение uriinf » 2008-09-04 10:52:28

И вот это:

Код: Выделить всё
pass in on $ext_if_gekkon route-to ($ext_if_gekkon $ext_gateway_gekkon) tagged WHITE keep state
pass in on $ext_if_ukrtel route-to ($ext_if_ukrtel $ext_gateway_ukrtel) tagged NIGGERS keep state



может должно быть похоже на это:

Код: Выделить всё
pass in on Local_if route-to ($ext_if_gekkon $ext_gateway_gekkon) from чего-то там keep state
pass in on Local_if route-to ($ext_if_ukrtel $ext_gateway_ukrtel) from чего-то там keep state

пробовал и так:

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

pass in on $int_if route-to ($ext_if_gekkon $ext_gateway_gekkon) tagged WHITE keep state
pass in on $int_if route-to ($ext_if_ukrtel $ext_gateway_ukrtel) tagged NIGGERS keep state
pass in on $int_if route-to ($ext_if_gekkon $ext_gateway_gekkon) 
и вот-так:

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

pass out route-to ($ext_if_gekkon $ext_gateway_gekkon) inet from ($ext_if_gekkon)
pass out route-to ($ext_if_ukrtel $ext_gateway_ukrtel) inet from ($ext_if_ukrtel)

не помогает

P.S.: для чистоты эксперимента убирал block all

naehi8sh
рядовой
Сообщения: 43
Зарегистрирован: 2008-02-10 2:57:58
Откуда: урал
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение naehi8sh » 2008-09-04 11:13:13

А какой интерфейс считаетьс у вас интерфейсом по умолчанию?
Если вы говарите: "Необходимо по source_ip разводить", то по каким строчкам и каким частям строчек вы делаете фильтацию? т.е. как вы привязываете определеный ип к конкретному правилу?

uriinf
рядовой
Сообщения: 13
Зарегистрирован: 2008-05-26 15:03:56
Откуда: Ukraine

Re: PF, два провайдера

Непрочитанное сообщение uriinf » 2008-09-04 11:35:47

А какой интерфейс считаетьс у вас интерфейсом по умолчанию?
defaultrouter="1.1.1.2"
Т.е. интерфейс по умолчанию:
ext_if_gekkon="rl1" -> ext_gateway_gekkon="1.1.1.2"
Если вы говарите: "Необходимо по source_ip разводить", то по каким строчкам и каким частям строчек вы делаете фильтацию? т.е. как вы привязываете определеный ип к конкретному правилу?
вот здесь тагирую:

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

pass in from <white_ip> to ! <me_ip> tag WHITE
pass in from ! <white_ip> to ! <me_ip> tag NIGGERS
pass in from <allow_nat> to <remote_servers> tag WHITE
, где <white_ip> persist in file white_IP

а так развожу:

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

nat on $ext_if_gekkon inet tagged WHITE -> ($ext_if_gekkon)
nat on $ext_if_ukrtel inet tagged NIGGERS -> ($ext_if_ukrtel)

...

pass out on $int_if_gekkon route-to ($ext_if_gekkon $ext_gateway_gekkon) tagged WHITE keep state
pass out on $int_if_ukrtel route-to ($ext_if_ukrtel $ext_gateway_ukrtel) tagged NIGGERS keep state
или вот так:

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

nat on $ext_if_gekkon inet tagged WHITE -> ($ext_if_gekkon)
nat on $ext_if_ukrtel inet tagged NIGGERS -> ($ext_if_ukrtel)

...

pass in on $ext_if_gekkon route-to ($ext_if_gekkon $ext_gateway_gekkon) tagged WHITE keep state
pass in on $ext_if_ukrtel route-to ($ext_if_ukrtel $ext_gateway_ukrtel) tagged NIGGERS keep state
 

naehi8sh
рядовой
Сообщения: 43
Зарегистрирован: 2008-02-10 2:57:58
Откуда: урал
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение naehi8sh » 2008-09-05 9:04:13

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

pass in quick on $loc_if route-to ($ges_if $ges_gw) inet from 192.168.0.73 keep state

Аватара пользователя
Storoge
рядовой
Сообщения: 44
Зарегистрирован: 2007-09-19 12:04:14
Откуда: Брянск
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение Storoge » 2008-09-05 11:16:00

Я на каком-то форуме прочитал, что в 7 FreeBSD не работают reply-to и route-to, вернулся на ipfw, настроил, и все заработало как мне надо.

naehi8sh
рядовой
Сообщения: 43
Зарегистрирован: 2008-02-10 2:57:58
Откуда: урал
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение naehi8sh » 2008-09-05 11:27:32

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

хххх# uname -a
FreeBSD  7.0-STABLE-200807 FreeBSD 7.0-STABLE-200807 #0: Sat Jul 19 12:17:15 UTC 2008     ххх:/usr/obj/usr/src/sys/GENERIC  i386
2 провайдера...
reply-to и route-to работают на ура...

По началу у меня были впечатление что не работает... пока не убедился в собственной глупости... и чем больше нъюансов узнаю тем лучше начинает работать:)

uriinf
рядовой
Сообщения: 13
Зарегистрирован: 2008-05-26 15:03:56
Откуда: Ukraine

Re: PF, два провайдера

Непрочитанное сообщение uriinf » 2008-09-05 11:58:15

Все чудесно работает в 7 фре.

Вот здесь был затык:

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

pass in on $ext_if_gekkon route-to ($ext_if_gekkon $ext_gateway_gekkon) tagged WHITE keep state
pass in on $ext_if_ukrtel route-to ($ext_if_ukrtel $ext_gateway_ukrtel) tagged NIGGERS keep state

pass in quick inet proto { tcp udp icmp } from <allow_nat> to ! <me_ip>
Весь трафик проходил сначала через одно из двух правил route-to, а потом попадал на последнее правило и шел по нему.

После привединия данного куска к слудующему виду все заработало:

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

pass in on $int_if route-to ($ext_if_ukrtel $ext_gateway_ukrtel) inet from <allow_nat> to ! <me_ip>
pass in on $int_if route-to ($ext_if_gekkon $ext_gateway_gekkon) inet from <allow_nat> to <remote_servers>
pass in on $int_if route-to ($ext_if_gekkon $ext_gateway_gekkon) inet from <white_ip> to ! <me_ip>
P.S.: iftop + tcpdump pflog очень облегчают отладку.

Qaz
мл. сержант
Сообщения: 113
Зарегистрирован: 2007-02-17 1:24:39
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение Qaz » 2008-10-14 15:32:27

Долго думал писать или нет...но окончательно зашол в тупик...есть два прова, у одного выделенка с белым айпи адресом и адсл модем с динамическим айпи, выглядит это счастье так:
xl0 белый айпишник
rl0 192.168.2.1
rl1 192.168.1.1
адсл модем настроен роутером, имеет айпиху 192.168.2.2/255.255.255.252

настроил чтобы squid бегал через адсл модем с динамическим айпишником вот так:
tcp_outgoing_address 192.168.2.1

и всё бы хорошо...но такой вариант не устраивает...надо было пару апликаций завернуть через провайдера с динамическим айпишником...попровал сделать так:

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

ext_if="xl0"
ukr_if="rl0"
int_if="rl1"
ext_gw_ukr="192.168.2.2"

pass out on $ukr_if route-to ($ukr_if $ext_gw_ukr) from 192.168.2.1 to any keep state
pass out on $ext_if route-to ($ukr_if $ext_gw_ukr) from 192.168.2.1 to any keep state
результат нулевой...кто может сталкивался, помогите :)

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: PF, два провайдера

Непрочитанное сообщение paradox » 2008-10-14 18:24:04

что то у вас с логикой в pF не то...

Аватара пользователя
RusBiT
лейтенант
Сообщения: 635
Зарегистрирован: 2007-08-03 11:43:53
Откуда: Красноярск
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение RusBiT » 2008-11-28 12:05:41

Во FreeBSD есть возможность поднять виртуальный сетевой интерфейс, т.е. как мост через реальный интерфейс?
Чем больше я познаю FreeBSD, тем больше я считаю себя ламером :)

ymsssg
ефрейтор
Сообщения: 60
Зарегистрирован: 2007-06-19 6:14:24
Контактная информация:

Re: PF, два провайдера

Непрочитанное сообщение ymsssg » 2009-10-15 12:22:36

Доброго времени суток!
При использовании PF наблюдаю что некоторые почтовики со временем начинают отваливаться по таймауту. При использовании ipfilter такого нет.
Ниже приводится лог:
то что было в 12.40 это с pf
а то что в 13.02 с ipf

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

Sep 24 12:37:44 mail-relay postfix/smtpd[39046]: connect from mail.domen.ru[81.1.237.123]
Sep 24 12:40:20 mail-relay postfix/smtpd[39046]: timeout after EHLO from mail.domen.ru[81.1.237.123]
Sep 24 12:40:20 mail-relay postfix/smtpd[39046]: disconnect from mail.domen.ru[81.1.237.123]

Sep 24 13:02:45 mail-relay postfix/smtpd[39346]: connect from mail.domen.ru[81.1.237.123]
Sep 24 13:02:46 mail-relay sqlgrey: grey: domain awl match: updating 81.1.237(81.1.237.123), domen.ru
Sep 24 13:02:48 mail-relay postfix/policyd-weight[36812]: decided action=PREPEND X-policyd-weight: using cached result; rate: -7.6; <client=81.1.237.123> <helo=mail.domen.ru> <from=obraztsova@domen.ru> <to=shipizyn@mydomain.ru>; delay: 2s
Sep 24 13:02:48 mail-relay postfix/smtpd[39346]: 4BB0D8441E: client=mail.domen.ru[81.1.237.123]
Sep 24 13:02:48 mail-relay postfix/cleanup[39357]: 4BB0D8441E: message-id=<4AB85B5A.1060808@domen.ru>
Sep 24 13:02:48 mail-relay postfix/smtpd[39346]: disconnect from mail.domen.ru[81.1.237.123]
Sep 24 13:02:48 mail-relay postfix/qmgr[38748]: 4BB0D8441E: from=<obraztsova@domen.ru>, size=34928, nrcpt=1 (queue active)
Sep 24 13:02:48 mail-relay spamd[9996]: spamd: processing message <4AB85B5A.1060808@domen.ru> for spamd:58
Sep 24 13:02:49 mail-relay spamd[9996]: spamd: result: . 0 - AWL scantime=0.6,size=34458,user=spamd,uid=58,required_score=7.0,rhost=localhost.enisey,raddr=127.0.0.1,rport=49449,mid=<4AB85B5A.1060808@domen.ru>,autolearn=ham
Sep 24 13:02:52 mail-relay postfix/pickup[38749]: CE00184426: uid=58 from=<obraztsova@domen.ru>
Sep 24 13:02:52 mail-relay postfix/cleanup[39357]: CE00184426: message-id=<4AB85B5A.1060808@domen.ru>
Sep 24 13:02:52 mail-relay postfix/qmgr[38748]: CE00184426: from=<obraztsova@domen.ru>, size=35226, nrcpt=1 (queue active)

Версия OS такая:

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

uname -a
FreeBSD KREVEDKO 6.3-RELEASE-p10 FreeBSD 6.3-RELEASE-p10 #0: Tue Jun  2 19:52:08 OMSST 2009     admin@KREVEDKO:/usr/src/sys/i386/compile/GW_2009-06-02_1  i386
Правила PF такие:

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

 cat /etc/pf.rules
## Описываем переменные, содержащие имена интерфейсов
#
int_if="vr1"
ext_if="vr0"
isp_if="vr2"
dmz_if="em0"

## ip-адреса хостов, которые нам понадобятся
#
ext_gw="199.142.52.9"
isp_gw="192.168.2.1"
hosting="192.168.0.7"
web_server="192.168.0.8"
test="192.168.1.7"
admin="192.168.1.200"
accountersbs="192.168.1.207"
mail_relay="192.168.1.240"
gps_workstation="192.168.1.249"
president="192.168.1.246"
buhbanks="192.168.1.250"
#
lan_net="192.168.1.0/24"

## табличка с хостами, которым разрешен доступ в обход прокси. ))
table <servers> const {$mail_relay, $president }
table <webstream> const {$admin, $test, $hosting }

# Те кому можно ходить снаружи на наш FTP-сервер
table <ftp-users> const { 177.221.192.198, 77.201.194.102, 170.235.199.150, 195.129.142.85 }

# Те кому можно использовать клиент-банк OPSB
table <opsb-users> const { 192.168.1.148, $buhbanks }

# Те кому можно ходить снаружи на наш WWW-сервер
table <www-users> const { 177.221.192.198, 77.201.194.102, 170.235.199.150, 113.0.0.0/8, 195.129.128.0/20, 94.129.172.250/32 }

## отбрасывать пакеты будем тихо, чтобы никто не догадался.. ))
set block-policy drop
## Игнорируем петлевой интерфейс
set skip on lo0

## нормализуем входящий трафик
scrub in all fragment reassemble

# Вот правила для проксиравания ftp
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"

## пакеты, пришедшие на внешний интерфейс на порт 80, 20, 21 и 25
## отправляем внутрь сети и метим их
rdr on $ext_if inet proto tcp from <www-users> to $ext_if port www tag WEB_SERVER -> $web_server port www
rdr on $ext_if inet proto tcp from <ftp-users> to $ext_if port ftp-data tag FTP_SERVER -> $web_server port ftp-data
rdr on $ext_if inet proto tcp from <ftp-users> to $ext_if port ftp tag FTP_SERVER -> $web_server port ftp
# (1-mail) Перенаправляем входящую почту на почтовый шлюз Mail-relay
rdr on $ext_if inet proto tcp to $ext_if port smtp tag MAIL_SERVER -> $mail_relay port smtp

## Отдаем пакеты идущие к ftp-серверам нашей проксе
rdr pass on $int_if inet proto tcp from $int_if:network to !$web_server port ftp -> 127.0.0.1 port 8021

## натим все пакеты на внешнем(vr0) интерфейсе, которые помечены
nat on $ext_if inet proto tcp tagged WEB_SERVER -> ($ext_if)
nat on $ext_if inet proto tcp tagged FTP_SERVER -> ($ext_if)

# (2-mail) Натим ответные пакеты от почтового шлюза (Mail-relay)
nat on $ext_if inet proto tcp tagged MAIL_SERVER -> ($ext_if)

# Остальные службы
nat on $ext_if inet proto tcp tagged WWW_EXT -> ($ext_if)
nat on $ext_if inet proto tcp tagged ICQ -> ($ext_if)
nat on $ext_if inet proto tcp tagged BUHBANKS -> ($ext_if)
nat on $ext_if inet proto tcp tagged OPSB -> ($ext_if)
nat on $ext_if inet proto tcp tagged LEVOBEREJIE -> ($ext_if)
nat on $ext_if inet proto tcp tagged E_PORTAL -> ($ext_if)

## Наш ftp сервер сможет работать только в активном режиме,
## поэтому натим пакеты идущие от его 20 порта
nat on $ext_if inet proto tcp from $web_server port ftp-data to !$int_if:network -> ($ext_if)

## Натим пакеты идущие к mail серверам
nat on $ext_if inet proto tcp from $int_if:network to any port { smtp, pop3 } -> ($ext_if)

# Разрешаем админскому компу ходить на внешние jabber-сервера
nat on $ext_if inet proto tcp from $admin to any port 5222 -> ($ext_if)

# DNS-запросы наружу из локалки
nat on $ext_if inet proto udp from $int_if:network to port { domain } -> ($ext_if)

# Dns-requests from DMZ
nat on $ext_if inet proto udp from $dmz_if:network to port { domain } -> ($ext_if)

# Подключить правила ftp-proxy.
#
anchor "ftp-proxy/*"

## запрещаем все входящие соединения на внешнем интерфейсе
block in  from any to any
block out from any to any

#pass quick on lo0

# Включаем защиту от спуфинга на внутреннем интерфейсе
antispoof quick for $int_if inet

# LAN
#  пропускаем все исходящие пакеты на внутреннем итерфейсе
pass out on $int_if from any to $lan_net
#  пропускаем (quick) пакеты предназначенные самому шлюзу
pass in quick on $int_if from $lan_net to $int_if keep state

## dns запросы из локалки наружу (работает)
pass in on $int_if inet proto tcp from $int_if:network to any port 53 keep state
pass in on $int_if inet proto udp from $int_if:network to any port 53 keep state

## разрешаем соединяться по ssh c хостингом и с jail-ом (работает)
pass in on $int_if inet proto tcp from $int_if:network to { $hosting, $web_server } port ssh keep state

## Разрешим сети соединяться с почтовыми службами (работает)
pass in on $int_if inet proto tcp from $int_if:network to any port { smtp, pop3 } keep state

## Разрешим почтарю dns и snmp запросы
pass in on $int_if inet proto udp from $mail_relay to any port domain keep state
pass in on $int_if inet proto tcp from $mail_relay to any keep state
pass in on $int_if inet proto udp from $mail_relay to $int_if port snmp keep state

# Разрешаем ходить в инет через платный канал (vr0) компам из таблицы servers
pass in on $int_if inet proto tcp from <servers> to { !$web_server } port { www, https } tag WWW_EXT keep state

# Разрешаем ходить в инет через анлимный канал (vr2) компам из таблицы webstream
pass in on $int_if inet proto tcp from <webstream> to { !$web_server } port { www, https } tag WWW_ISP keep state

## Пропускаем аську
pass in on $int_if inet proto tcp from $int_if:network to any port 5190 tag ICQ keep state

# Dispetcher (работает)
pass in on $int_if inet proto tcp from { $gps_workstation } to { $web_server } port { www } keep state

# Доступ к Openfire и другим Jabber-серверам (работает)
pass in on $int_if inet proto tcp from $admin to !$int_if port 5222 keep state

# Админ have access to local www-server
pass in on $int_if inet proto tcp from $admin to $web_server keep state

# Comp can use bank Levoberejie (работает)
pass in on $int_if inet proto tcp from 192.168.1.221 to 212.17.30.200 port { 540 } tag LEVOBEREJIE keep state

# Comp BuhBanks can use Gazprombank (работает)
pass in on $int_if inet proto tcp from $buhbanks to any tag BUHBANKS keep state

# Comps can use OPSB (работает)
pass in on $int_if inet proto tcp from <opsb-users> to { 217.151.29.24, 217.151.29.33 } port { https } tag OPSB keep state

# E-portal
pass in on $int_if inet proto tcp from { 192.168.1.2, 192.168.1.99, $accountersbs } to any port { smtp, pop3 } tag E_PORTAL keep state

## разрешаем icmp пакеты. Как ни крути, но нужны они! ))
pass in on $int_if inet proto icmp from $int_if:network to any keep state

# EXT
## На пинги отвечаем через тот же интерейс, откуда он пришел
pass in on $ext_if reply-to ($ext_if $ext_gw) inet proto icmp from any to $ext_if keep state

## отвечаем через тот же интерфейс, через который пришел пакет.
## по сути меняем для помеченных пакетов route.
pass in on $ext_if reply-to ($ext_if $ext_gw) inet proto tcp tagged WEB_SERVER keep state
pass in on $ext_if reply-to ($ext_if $ext_gw) inet proto tcp tagged FTP_SERVER keep state
# (3-mail) Пропускаем на внешнем интерфейсе пакеты идущие к почтовому шлюзу (Mail-relay)
pass in on $ext_if reply-to ($ext_if $ext_gw) inet proto tcp tagged MAIL_SERVER keep state

# Включив это правило делаем шлюз приемником почты без посредника (mail-relay)
# Если включаем это правило, то необходимо откличить правила # (1-mail, 2-mail и 3-mail)
#pass in on $ext_if inet proto tcp from <servers> to { !$web_server } port { www, https } tag WWW_EXT keep state

#
pass in on $ext_if inet proto tcp from any to $ext_if port smtp keep state

## Разрещаем входящие соединения для пользователя proxy, из-под него работает ftp-proxy
## Это альтернатива открытию всех портов, которые больше 49152
pass in on $ext_if inet proto tcp from any to $ext_if user proxy keep state

### Разрешаем входящие (из Интернета) DNS-запросы
pass in on $ext_if reply-to ($ext_if $ext_gw) inet proto udp to ($ext_if) port 53 keep state
pass in on $ext_if inet proto udp from ($ext_if:network) to ($ext_if) port 53 keep state

# ISP
#pass in on $isp_if inet proto tcp from <webstream> to { !$web_server } port { www, https } tag WWW_ISP keep state


# DMZ
## Меняем маршрут для пакетов, идущих от порта ftp-data ftp-сервера.
pass in on $dmz_if route-to ($ext_if $ext_gw) inet proto tcp from $web_server port { ftp-data ftp www } to !$int_if:network keep state
pass in on $dmz_if inet proto tcp from $web_server port { ftp-data ftp www } to $int_if:network keep state

# Gps
pass in on $dmz_if inet proto tcp from { $admin, $gps_workstation } to $web_server port www keep state
pass in on $dmz_if inet proto tcp from $admin to $web_server port 22 keep state

## серверам в DMZ нужно общаться с dns
pass in on $dmz_if inet proto udp from { $hosting, $web_server } to port 53 keep state

# Servers from DMZ can fetch sources for ports
pass in on $dmz_if inet proto tcp from $hosting to port { www, https } tag WWW_EXT keep state

# Servers from DMZ cat fetch sources of world and kernel
pass in on $dmz_if inet proto tcp from $hosting to { !$web_server } port { 5999 } tag WWW_EXT keep state

## Ну и информационные сообщения тоже не повредят
pass in on $dmz_if inet proto icmp from $dmz_if:network to $dmz_if keep state

# разрешаем исходящие соединения
pass out on $dmz_if keep state

## pass out
pass out quick route-to ($isp_if $isp_gw) tagged WWW_ISP keep state
pass out quick route-to ($isp_if $isp_gw) from ($isp_if) to !$lan_net keep state
pass out quick from $ext_if to !$lan_net keep state