ifconfig
Локалка
re0: inet 192.168.10.254 netmask 0xffffff00 broadcast 192.168.10.2551-провайдер (какой-то местный провайдер)
re1: inet "DHCP"2-провайдер (yota-street)
re2: inet "DHCP"3-провайдер (Адсл)
re3: inet 210.20.10.35 netmask 0xfffffff8 broadcast 217.27.139.39Фаерволл стоит "PF"
Посоветуйте, как грамотнее сделать маршрутизацию или какие написать правила в фаерволле.
Если требуется такая схема:1-провайдер — сидит вся подсеть 192.168.10.0/24
2-провайдер — сидит только 192.168.10.230 - 192.168.10.240
3-провайдер — сидит только 192.168.10.2 - 192.168.10.8
route-to
прошелся по темам, почитал. не работает. Не подскажете, где я ошибся?isp1="re1" #akado
isp1_gw="192.168.1.1"isp2="re2" #yota
isp2_gw="10.133.251.1"isp3="re3" #prov
isp3_gw="210.20.10.33"#range of users
table <users> persist { 192.168.10.230 }lan="re0"
office="192.168.10.0/24"
# Scrub
scrub in all
scrub all reassemble tcp# nat
nat on $isp3 from $office to any -> ($isp3)
#nat on $isp1 from $office to any -> ($isp1)
nat on $isp2 from $office to any -> ($isp2)
nat on $isp1 from <users> to any -> ($isp1)rdr pass on $lan proto tcp from $office to any port 80 -> ($lan) port 3128
# block all
block log all#pass quick all keep state
# allow localhost
pass log quick on lo# pass icmp
pass quick proto icmp# pass out
pass out quick keep state# allow ssh
pass in quick proto tcp from any to any port 22 keep state
# allow office
pass in quick on $lan proto tcp from $office to any port 1985 keep state
pass in quick on $lan from $office to any keep state
#route-to & reply-to
pass out on $isp1 route-to ( $isp1 $isp1_gw ) inet from $isp1 to <users>
pass in on $isp1 reply-to ( $isp1 $isp1_gw ) inet proto tcp from any to <users> flags S/SA keep state
>[оверквотинг удален]
># allow office
>pass in quick on $lan proto tcp from $office to any port
>1985 keep state
>pass in quick on $lan from $office to any keep state
>
>
>#route-to & reply-to
>
>pass out on $isp1 route-to ( $isp1 $isp1_gw ) inet from $isp1 to <users>
>pass in on $isp1 reply-to ( $isp1 $isp1_gw ) inet proto tcp from any to <users> flags S/SA keep statehttp://www.opennet.me/openforum/vsluhforumID1/76063.html
http://www.opennet.me/openforum/vsluhforumID1/88785.html
http://www.openbsd.ru/files/etc/pf-dual.conf
>>#route-to & reply-to
>>
>>pass out on $isp1 route-to ( $isp1 $isp1_gw ) inet from $isp1 to <users>
>>pass in on $isp1 reply-to ( $isp1 $isp1_gw ) inet proto tcp from any to <users> flags S/SA keep state
>IMCHO нужно смотреть tcpdump на требуемых интерфейсах, вполне возможно какое-то правило срабатывает раньше. + смотреть pflog.
Я бы еще обратил внимание на то, где ловить пакеты, например в моем случае
все запросы в сети приходят на интерфейс $int_admin.#это правило разрешает входящий трафик на внутреннем интерфейсе из сети <in_host>, этот трафик ходит по маршрутам по умолчанию
pass in on $int_admin from <in_host> to any flags S/SA keep state#!!! Вот ЗДЕСЬ говорим, что трафик от хоста $newserv пришедший на ВНУТРЕННИЙ интерфейс int_admin удовлетворяющий условиям (источник $newserv) направлять на интерфейс $ext_nl со шлюзом $gw_nl, который не является маршрутом по умолчанию.
pass in on $int_admin route-to { ($ext_nl $gw_nl) } proto tcp from $newserv to {!<no_kiev>, !<webmoney>, !<my_host>} flags S/SA modulate state
# основные "выпускаюшие" правила на внешнем интерфейсе
pass out on $ext_nl proto tcp from any to any flags S/SA modulate state
pass out on $ext_nl proto { udp, icmp } from any to any keep stateДумаю должно быть как-то так.
>[оверквотинг удален]
>pass in on $int_admin route-to { ($ext_nl $gw_nl) } proto tcp from $newserv to {!<no_kiev>, !<webmoney>, !<my_host>} flags S/SA modulate state
>
>
># основные "выпускаюшие" правила на внешнем интерфейсе
>pass out on $ext_nl proto tcp from any to any flags S/SA
>modulate state
>pass out on $ext_nl proto { udp, icmp } from any to
>any keep state
>
>Думаю должно быть как-то так.а можешь скинуть, пожалуйста, весь конфиг пф и pfctl -sn?
>>[оверквотинг удален]
>># allow office
>http://www.opennet.me/openforum/vsluhforumID1/76063.html
>http://www.opennet.me/openforum/vsluhforumID1/88785.html
>http://www.openbsd.ru/files/etc/pf-dual.confспасибо, но так до меняи не доходит = ( я ни как не могу избавить от того, что трафик идет через default gateway который указан в rc.conf
вот пришел к такому виду пф
ext_if_a = "sk0" #akado
ext_gw_a = "192.168.1.1"ext_if_b = "re1" #yota
ext_gw_b = "10.133.251.1"ext_if_c = "sk1" #bitway
ext_gw_c = "240.25.1.30"int_if = "re0"
set skip on lo
# Scrub
scrub in# nat
nat on $ext_if_a inet from !(self) -> ($ext_if_a:0)
nat on $ext_if_b inet from !(self) -> ($ext_if_b:0)
nat on $ext_if_c inet from !(self) -> ($ext_if_c:0)rdr pass on $int_if proto tcp from 192.168.10.0/24 to any port 80 -> ($int_if) port 3128
block on { $ext_if_a $ext_if_b $ext_if_c }
block return on { $ext_if_a $ext_if_b $ext_if_c } inet proto tcp# allow ssh
pass in quick proto tcp from any to any port 22 keep state
pass out route-to ($ext_if_a $ext_gw_a) inet from ($ext_if_a)
pass out route-to ($ext_if_b $ext_gw_b) inet from ($ext_if_b)
pass out route-to ($ext_if_c $ext_gw_c) inet from ($ext_if_c)
pass out inet from { $ext_if_a $ext_if_b $ext_if_c} to (self:network)pass in quick from ($ext_if_a:network) tagged EXT_IF_A
pass in quick reply-to ($ext_if_a $ext_gw_a) tagged EXT_IF_A
pass in quick from ($ext_if_b:network) tagged EXT_IF_B
pass in quick reply-to ($ext_if_b $ext_gw_b) tagged EXT_IF_B
pass in quick from ($ext_if_c:network) tagged EXT_IF_C
pass in quick reply-to ($ext_if_c $ext_gw_c) tagged EXT_IF_Cpass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) inet proto icmp \
to ($ext_if_a) icmp-type echoreq code 0
pass in on $ext_if_a inet proto icmp from ($ext_if_a:network) \
to ($ext_if_a) icmp-type echoreq code 0
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) inet proto icmp \
to ($ext_if_b) icmp-type echoreq code 0
pass in on $ext_if_b inet proto icmp from ($ext_if_b:network) \
to ($ext_if_b) icmp-type echoreq code 0
pass in on $ext_if_c reply-to ($ext_if_c $ext_gw_c) inet proto icmp \
to ($ext_if_c) icmp-type echoreq code 0
pass in on $ext_if_c inet proto icmp from ($ext_if_c:network) \
to ($ext_if_c) icmp-type echoreq code 0и не хтает правил, которые заставят
пользователя 192.168.10.20 ходить через 1 шлюз
пользователя 192.168.10.22 ходить через 3 шлюз
пользователя 192.168.10.21 ходить через 2 шлюз
>[оверквотинг удален]
>code 0
>pass in on $ext_if_c inet proto icmp from ($ext_if_c:network) \
> to ($ext_if_c) icmp-type echoreq
>code 0
>
>и не хтает правил, которые заставят
>
>пользователя 192.168.10.20 ходить через 1 шлюз
>пользователя 192.168.10.22 ходить через 3 шлюз
>пользователя 192.168.10.21 ходить через 2 шлюзправила для них на внутреннем интерфейсе пишите
http://www.opennet.me/base/sec/pf_extended.txt.html#top5....
pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
from $lan_net to any keep stateОпция route-to используется для приема трафика на внутреннем интерфейсе и назначения ему внешнего сетевого интерфейса и шлюза, таким образом обеспечивая балансировку. Обратите внимание, что опция route-to должна быть указана в каждом правиле, предназначенном для балансировки трафика. Ответные пакеты приходят на тот интерфейс, с которого ушел запрос и они будут перенаправлены во внутрь как обычно.
Для гарантии того, что пакеты с $ext_if1 всегда направляются к $ext_gw1 (и соответственно для $ext_if2 к $ext_gw2), в правилах можно указать следующее:
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 \
to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 \
to any....
там же и про тэгирование пакетов читайте
+1
Опция route-to используется для приема трафика на внутреннем интерфейсе и назначения ему внешнего сетевого интерфейса и шлюза,...замените
pass out route-to ($ext_if_a $ext_gw_a) inet from ($ext_if_a)
на
pass in on $int_if route-to ($ext_if_a $ext_gw_a) inet from (ТРАФИК ИЗ СЕТИ КОТОРЫЙ НУЖНО ОТПРАВИТЬ ЧЕРЕЗ ИНТЕРФЕЙС $ext_if_a) keep state
>+1
>Опция route-to используется для приема трафика на внутреннем интерфейсе и назначения ему
>внешнего сетевого интерфейса и шлюза,...
>
>замените
>pass out route-to ($ext_if_a $ext_gw_a) inet from ($ext_if_a)
>на
>pass in on $int_if route-to ($ext_if_a $ext_gw_a) inet from (ТРАФИК ИЗ СЕТИ
>КОТОРЫЙ НУЖНО ОТПРАВИТЬ ЧЕРЕЗ ИНТЕРФЕЙС $ext_if_a) keep stateСпасибо, всем откликнувшимся.
До сих пор бьюсь.
Задачу решить не могу.Уже перепробовал все предложенные варианты, возможно я туплю...
Есть ли у кого время он-лайн обсудить это?
отблагодарю
>Есть ли у кого время он-лайн обсудить это?
>отблагодарюделал что-то подобное. пиши в аську - чем смогу помогу. 339683075
1. Уберите все правила, и начните отлаживать с внутреннего интерфейса.2. Для отладки используйте tcpdump -i <re0, pflog0 и т.д.>
в правилах добавляйте по очереди логирование
pass in log quick on $int from any to any keep state3. Не пишите сразу много правил, начните с минимально необходимых.
4. не забывайте что маршрутизировать нужно приходящий трафик на внутреннем интерфейсе плюс нужно разрешить входящий/исходящий трафик на выпускающих интерфейсах. Иначе трафик завернутый на выпускающий интерфейс не выйдет из него.
5. После изменений правил не забывайте делать команду
pfctl -F nat -f /etc/pf.conf
pfctl -F rules -f /etc/pf.conf6. Не зацикливайтесь на этой праблеме, сходите на пляж, отвлекитесь на недельку, дайте время себе осознать принцип работы правил в PF.
7. Почитайте http://www.openbsd.org/faq/pf/ru/pools.html Load Balance Outgoing Traffic
8. Скачайте с сайта http://house.hcn-strela.ru/BSDCert/ Учебный курс, там есть большой раздел посвященный pf.
9. Если нужно рулить трафиком ИНИЦИИРОВАННЫЙ САМИМ СЕРВЕРОМ, то делается это немного по другому. см http://www.opennet.me/openforum/vsluhforumID10/4433.html#6
Всем огромное спасибо. Мне очень помог Кирилл_Н (ok) on 11-Авг-10, 15:37 ,
Конфигарация стала следующая, Но проблема осталась только в SQUID, как его заставить работать на 3-х шлюзах, что бы ограничивал трафик на 3 шлюзах.
set skip on lo
# Scrub
scrub intable <int_a> persist file "/etc/pf/int_a.conf"
table <int_b> persist file "/etc/pf/int_b.conf"
table <int_c> persist file "/etc/pf/int_c.conf"# nat
nat on $ext_if_a inet from !(self) -> ($ext_if_a:0)
nat on $ext_if_b inet from !(self) -> ($ext_if_b:0)
nat on $ext_if_c inet from !(self) -> ($ext_if_c:0)#rdr pass on $int_if proto tcp from $int_if:network to any port 80 -> ($int_if) port 3128
#block in all
#block out all
pass in on $int_if route-to ($ext_if_a $ext_gw_a) proto tcp from <int_a> to any flags S/SA keep state
pass in on $int_if route-to ($ext_if_a $ext_gw_a) proto { udp, icmp } from <int_a> to any keep statepass in on $int_if route-to ($ext_if_b $ext_gw_b) proto tcp from <int_b> to any flags S/SA keep state
pass in on $int_if route-to ($ext_if_b $ext_gw_b) proto { udp, icmp } from <int_b> to any keep statepass in on $int_if route-to ($ext_if_c $ext_gw_c) proto tcp from <int_c> to any flags S/SA keep state
pass in on $int_if route-to ($ext_if_c $ext_gw_c) proto { udp, icmp } from <int_c> to any keep statepass in on $int_if proto tcp from $int_if:network to ($int_if) flags S/SA keep state
pass in on $int_if proto { udp, icmp } from $int_if:network to ($int_if) keep statepass out on $int_if proto tcp from ($int_if) to $int_if:network flags S/SA keep state
pass out on $int_if proto { udp, icmp } from ($int_if) to $int_if:network keep statepass out on $ext_if_a proto tcp from <int_a> to any flags S/SA keep state
pass out on $ext_if_a proto { udp, icmp } from <int_a> to any keep state
pass out on $ext_if_b proto tcp from <int_b> to any flags S/SA keep state
pass out on $ext_if_b proto { udp, icmp } from <int_b> to any keep state
pass out on $ext_if_c proto tcp from <int_c> to any flags S/SA keep state
pass out on $ext_if_c proto { udp, icmp } from <int_c> to any keep statepass out on $ext_if_a proto tcp from self to any flags S/SA keep state
pass out on $ext_if_a proto { udp, icmp } from self to any keep state
/etc/pf/int_a.conf
/etc/pf/int_b.conf
/etc/pf/int_c.confтут я прописываю нужные мне адреса и работает как все задуманно.
И вот конфиг сквида, который предстоит побороть.
Но при этом в PF у меня нету правила для сквидаrdr pass on $int_if proto tcp from 192.168.0.0/24 to any port 80 -> ($int_if) port 3128
конфиг сквида
cat /usr/local/etc/squid/squid.conf
# squid config file with cached# network
http_port 8080
http_port 3128 intercept
forwarded_for off
visible_hostname gw.local# acl
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl clients src 192.168.10.0/24
acl QUERY urlpath_regex cgi-bin \? chat
acl blocked url_regex "/usr/local/etc/squid/blocked"
acl Vip src 192.168.10.2 192.168.10.3
# access
http_access deny manager all
http_access allow Vip
http_access deny blocked
http_access allow clients
http_access deny all
icp_access allow clients
icp_access allow Vip
icp_access deny all
miss_access allow clients
miss_access allow Vip
miss_access deny all# cache and log
hierarchy_stoplist cgi-bin ? chat
no_cache deny QUERY
cache_dir ufs /usr/local/squid/cache 10000 16 256
cache_access_log /usr/local/squid/logs/access.log
cache_log /usr/local/squid/logs/cache.log
cache_store_log /usr/local/squid/logs/store.log
negative_ttl 1 minutes
cache_effective_user squid
cache_effective_group squid
cache_mem 256 MB
maximum_object_size 100 MB
logfile_rotate 30
решил добавить как написанно в мануалахacl subnet1 src 192.168.10.230/255.255.255.240
acl subnet2 stc 192.168.10.52/255.255.255.240
tcp_outgoing_address 192.168.1.1 subnet1
tcp_outgoing_address 10.133.251.1 subnet2
не пашет, лог пишет
Aug 11 20:54:57 squid: Bungled squid.conf line 16: acl subnet2 stc 192.168.10.52
1. вам же писал я
>замените
>pass out route-to ($ext_if_a $ext_gw_a) inet from ($ext_if_a)
>на
>pass in on $int_if route-to ($ext_if_a $ext_gw_a) inet from (ТРАФИК ИЗ СЕТИстало
pass in on $int_if route-to ($ext_if_a $ext_gw_a) proto tcp from <int_a> to any flags S/SA keep state2. Если вы хотите чтобы все запросы которые идут от разных клиентов к прокси, шли каждый через свой шлюз, то это ИМХО значительно усложняет задачу и вам нужно смотреть
>9. Если нужно рулить трафиком ИНИЦИИРОВАННЫЙ САМИМ СЕРВЕРОМ, то делается это немного по
>другому. см http://www.opennet.me/openforum/vsluhforumID10/4433.html#6как мне кажется уто уже лишнее, трафик от сервера будет идти в шлюз по умолчанию.
2. Если вы хотите чтобы все запросы которые идут от разных клиентов
>к прокси, шли каждый через свой шлюз, то это ИМХО значительно
>усложняет задачу и вам нужно смотреть
>>9. Если нужно рулить трафиком ИНИЦИИРОВАННЫЙ САМИМ СЕРВЕРОМ, то делается это немного по
>>другому. см http://www.opennet.me/openforum/vsluhforumID10/4433.html#6
>
>как мне кажется уто уже лишнее, трафик от сервера будет идти в
>шлюз по умолчанию.спасибо.
А разве нельзя заставить просто фильтровать трафик?
но не управлять им
Может вообще отказать от сквида.
У меня задача, все запросы которые идут на http, https блокировать к социальным сетям и другим сайтам, а так же есть группа пользователей которая может ходить на эти сайты.И торренты их блокировать красиво для разных пользователей, а отдельной группе дать доступ.
А сквид, у меня только по именам сайтов это все блочит.
Вот если бы задача стояла бы просто заблокировать, я бы перенаправил трафик и проблема была бы решена.
а могу я оставить в том виде в котором сейчас у меня работает PF, т.к. он полностью решил мою проблему с натом.У меня только не решен вопрос с 80 портом, может можно заставить по такой же аналогии работать сквид, что бы он группы пользователей направлял через определенный шлюз
см http://download.bsdmag.org/en/BSD_04_2010.pdf
FreeBSD Firewall with Transparent Proxy Server, DHCP Server and Name Server# Redirect all www traffic to squid proxy server
rdr on $int inet proto tcp from $lan to any port $www -> $gw port 3128
Проблемы продолжаются, только уже с самой операционной системой - )дело было так:
1 сутки --
все нормально, дальше я настраивал Yota которая работает по dhcp
после получения адресов через dhclient, на третий раз появилась ошибка
Fatal trap 12: page fault while in kernel node cpuid * 1; apic id = 61http://imglink.ru/show-image.php?id=7f99b9de8bb5333ccfb5256e...
полетела файловая система, пару раз в синг юзере fsck -y и проблема ушла
2 сутки
прошла неделя без проблем.
далее опять Fatal trap 12И теперь если грузиться с новым конфигом, то все номально.
Если применить новый конфиг pfctl -f или же через rc.conf или rc.localсразу фатал трап вылетает.
Поменял сетевые карты, проблема осталась.
FreeBSD server.local 8.0-RELEASE-p2 FreeBSD 8.0-RELEASE-p2 #1: Wed Mar 17 18:43:23 MSK 2010 root@server.local:/usr/obj/usr/src/sys/GATE i386rc.conf
# LAN
ifconfig_re0="inet 192.168.10.1 netmask 255.255.255.0"# Akado
ifconfig_stge0="inet 192.168.1.253 netmask 255.255.255.0"# Yota
ifconfig_stge1="DHCP"# Bitway
ifconfig_stge2="inet 210.20.10.34 netmask 255.255.255.248"keymap="ru.koi8-r"
sshd_enable="YES"
zabbix_agentd_enable="YES"
# pf
pf_enable="YES"
pf_rules="/etc/pf.conf.backup"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""# squid
squid_enable="YES"# dns
named_enable="YES"# ipfw
firewall_enable="YES"
firewall_type="open"
firewall_logging="YES"
конфиг pf.conf
ext_if_a = "stge0" #akado
ext_gw_a = "192.168.1.1"ext_if_b = "stge1" #yota
ext_gw_b = "10.116.124.1"ext_if_c = "stge2" #bitway
ext_gw_c = "210.20.10.33"int_if = "re0"
set skip on lo
# Scrub
scrub in
table <usersquid> persist file "/etc/pf/usersofsquid"
table <int_a> persist file "/etc/pf/int_a.conf"
table <int_b> persist file "/etc/pf/int_b.conf"
table <int_c> persist file "/etc/pf/int_c.conf"# nat
nat on $ext_if_a inet from !(self) -> ($ext_if_a:0)
nat on $ext_if_b inet from !(self) -> ($ext_if_b:0)
nat on $ext_if_c inet from !(self) -> ($ext_if_c:0)#rdr pass on $int_if proto tcp from $int_if:network to any port 80 -> ($int_if) port 3128
rdr pass on $int_if proto tcp from <usersquid> to any port 80 -> ($int_if) port 3128
#block in all
#block out allpass in on $ext_if_c proto tcp from any to ($ext_if_c) port 22 flags S/SA keep state
pass in on $ext_if_c reply-to ($ext_if_c $ext_gw_c) proto tcp from any to ($ext_if_c) port 22 flags S/SA keep statepass in on $int_if route-to ($ext_if_a $ext_gw_a) proto tcp from <int_a> to any flags S/SA keep state
pass in on $int_if route-to ($ext_if_a $ext_gw_a) proto { udp, icmp } from <int_a> to any keep statepass in on $int_if route-to ($ext_if_b $ext_gw_b) proto tcp from <int_b> to any flags S/SA keep state
pass in on $int_if route-to ($ext_if_b $ext_gw_b) proto { udp, icmp } from <int_b> to any keep statepass in on $int_if route-to ($ext_if_c $ext_gw_c) proto tcp from <int_c> to any flags S/SA keep state
pass in on $int_if route-to ($ext_if_c $ext_gw_c) proto { udp, icmp } from <int_c> to any keep statepass in on $int_if proto tcp from $int_if:network to ($int_if) flags S/SA keep state
pass in on $int_if proto { udp, icmp } from $int_if:network to ($int_if) keep statepass out on $int_if proto tcp from ($int_if) to $int_if:network flags S/SA keep state
pass out on $int_if proto { udp, icmp } from ($int_if) to $int_if:network keep statepass out on $ext_if_a proto tcp from <int_a> to any flags S/SA keep state
pass out on $ext_if_a proto { udp, icmp } from <int_a> to any keep state
pass out on $ext_if_b proto tcp from <int_b> to any flags S/SA keep state
pass out on $ext_if_b proto { udp, icmp } from <int_b> to any keep state
pass out on $ext_if_c proto tcp from <int_c> to any flags S/SA keep state
pass out on $ext_if_c proto { udp, icmp } from <int_c> to any keep statepass out on $ext_if_a proto tcp from self to any flags S/SA keep state
pass out on $ext_if_a proto { udp, icmp } from self to any keep state
попробовал убрать из rc.conf всю загрузку PF
и в ручную
pfctl -f /etc/pf.conf.new
pfctl -e
и опять fatal trap 12