freebsd7.3, есть настроенный PF с балансировкой round-robin по двум внешним каналам
задача: сделать редирект 80го порта на сквида
вообщем все работает, однако никак не могу до конца понять отношения pf и сквида.
когда работаем без сквида, то тут видно (по pftop) что пакетики бегут то в один канал то в другой, все нормально, но что происходит когда идет редирект на сквида? куда он дальше шлет пакеты? на шлюз по-умолчанию?
> freebsd7.3, есть настроенный PF с балансировкой round-robin по двум внешним каналам
> задача: сделать редирект 80го порта на сквида
> вообщем все работает, однако никак не могу до конца понять отношения pf
> и сквида.
> когда работаем без сквида, то тут видно (по pftop) что пакетики бегут
> то в один канал то в другой, все нормально, но что
> происходит когда идет редирект на сквида? куда он дальше шлет пакеты?
> на шлюз по-умолчанию?Если в PFе не указано другого, то да, на шлюз по умолчанию.
>> freebsd7.3, есть настроенный PF с балансировкой round-robin по двум внешним каналам
>> задача: сделать редирект 80го порта на сквида
>> вообщем все работает, однако никак не могу до конца понять отношения pf
>> и сквида.
>> когда работаем без сквида, то тут видно (по pftop) что пакетики бегут
>> то в один канал то в другой, все нормально, но что
>> происходит когда идет редирект на сквида? куда он дальше шлет пакеты?
>> на шлюз по-умолчанию?
> Если в PFе не указано другого, то да, на шлюз по умолчанию.я видимо не очень понимаю как работает сквид... и вообще прокси-сервер..
вообщем при таком конфиге:
какой путь у пакета с 80м портом назначения?
попадет он под балансировку?pf.conf:
--------------------------------------------------------
ext_if1="rl0" #внешний интерфейс 1го прова
ext_if2="rl2" #внешний интерфейс 2го прова
ext_gw1="192.168.1.8" #шлюз 1го прова
ext_gw2="192.168.1.8" #шлюз 2го прова
int_if="rl1" #локальный интерфейс
localnet="172.16.1.0/24" #локальная сетьden_host="172.16.1.2" #моё
set skip on lo0
set loginterface rl0
set loginterface rl1
set loginterface rl2#нормализация трафа
scrub in all
scrub out allnat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
#редирект на сквида
rdr on $int_if proto tcp from $localnet to any port 80 -> 127.0.0.1 port 3128#натим внешние интерфейсы
nat on $ext_if1 from $int_if:network to any -> ($ext_if1)
nat on $ext_if2 from $int_if:network to any -> ($ext_if2)#редирект на ftp-proxy
rdr pass on $int_if proto tcp from $den_host to any port {ftp,ftp-data} -> 127.0.0.1 port 8021 #редирект на ftp-proxyblock all #блок всего по-умолчанию
antispoof quick for { lo0 $int_if }
anchor "ftp-proxy/*"
pass out log on $int_if from any to $localnet
#пропускаем все пакеты для шлюза из локали
pass in quick log on $int_if from $localnet to $int_if#балансировка
pass in route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin from $localnet to any#основные выпускающие правила
pass out log on $ext_if1 proto tcp from any to any flags S/SA modulate state
pass out log on $ext_if1 proto {udp, icmp} from any to any
pass out log on $ext_if2 proto tcp from any to any flags S/SA modulate state
pass out log on $ext_if2 proto {udp, icmp} from any to anypass 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-----------------------------------------------------------------------------------
squid собран с поддержкой pf-transparent
squid.conf
----------------------------------------------------------------------------------acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl localnet src 172.16.1.0/24 # RFC1918 possible internal networkacl CONNECT method CONNECT
http_access allow manager localhost
#http_access deny managerhttp_access allow localnet
http_access allow localhosthttp_access deny all
http_port 127.0.0.1:3128 intercept
hierarchy_stoplist cgi-bin ?
cache_dir ufs /usr/local/squid/cache 256 16 256
coredump_dir /usr/local/squid/cache
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320cache_mem 128 MB
maximum_object_size 64 MB
cache_store_log /usr/local/squid/logs/store.log
visible_hostname pavlik
-----------------------------------------------------------------очень большое желание представлять всю схему досканально :)
>[оверквотинг удален]
> refresh_pattern ^ftp: 1440 20% 10080
> refresh_pattern ^gopher: 1440 0% 1440
> refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
> refresh_pattern . 0 20% 4320
> cache_mem 128 MB
> maximum_object_size 64 MB
> cache_store_log /usr/local/squid/logs/store.log
> visible_hostname pavlik
> -----------------------------------------------------------------
> очень большое желание представлять всю схему досканально :)балансировка трафика у вас происходит на внутреннем интерфейсе. трафик c 80го порта заворачивается на сквид, а сквид уже отправляет запросы наружу. и эти запросы уходят через интерфейс по умолчанию, т.к. иного не указано. вы можете попробовать балансировать исходящий трафик на интерфейсе по умолчанию. если это $ext_if1, то как то так
pass out on $ext_if1 route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin from ($ext_if1) to any keep state
и добавить правило для ната на другом интерфейсе
nat on $ext_if2 from ($ext_if1) to any -> ($ext_if2)тогда все пакеты будут уходить у вас в интерфейс по умолчанию, для них будет работать нат, после чего они будут попадать под правило балансировки и часть пакетов будет уходить наружу, а часть заворачиваться на второй интерфейс, где будет опять работать нат, но уже на адрес второго интерфейса.
либо посмотрите умеет ли сквид самостоятельно балансировать нагрузку.
интересно, спасибо
последний вопрос, попытался реализовать балансировку с помощью сквида, вернее трех сквидов (на одной машине), первый кэширующий делает так:squid.conf
...
cache_peer 127.0.0.1 parent 3127 3129 round-robin
cache_peer localhost parent 3129 3131 round-robin
...второй и третий соответственно на своих http портах принимают и каждый делает tcp_outgoing_address на разные хосты, соответствующие ip адресу 1го и 2го прова, т.е.:
squidh.conf
tcp_outgoing_address 192.168.1.200
и
squidt.conf
tcp_outgoing_address 192.168.1.205дэк вопрос вот в чем, если я в pf.conf делаю вот такие записи (ext_if1=192.168.1.200,ext_if2=192.168.1.205 соответ.прову один и два)
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то будут ли пакеты выходящие из сквида согласно правилам tcp_outgoing_address маршрутизироваться в нужный канал?
>[оверквотинг удален]
> tcp_outgoing_address 192.168.1.200
> и
> squidt.conf
> tcp_outgoing_address 192.168.1.205
> дэк вопрос вот в чем, если я в pf.conf делаю вот такие
> записи (ext_if1=192.168.1.200,ext_if2=192.168.1.205 соответ.прову один и два)
> 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
> то будут ли пакеты выходящие из сквида согласно правилам tcp_outgoing_address маршрутизироваться
> в нужный канал?нужно пробовать.
на каких то версиях squid этого было достаточно что бы пакеты от squid пошли не через шлюз по умолчанию, но были и сообщения что с помощью tcp_outgoing_address не смогли этого сделать.
а теперь проблема в том что я уже не знаю как проверить правильно ли вся эта моя страхобразия работает :) тем более что шлюз тестовый, и находиться в локальной сети всеми тремя интерфейсами :) но глядя на tcpdump вроде как правильно, т.е. я с клиентской машины захожу на freebsd.org и гляжу на шлюзе:# tcpdump -i rl0 host 192.168.1.200
16:08:53.806863 IP freefall.freebsd.org.http > 192.168.1.205.50876: . ack 540 win 63974 <nop,nop,timestamp 2839697 11593657># tcpdump -i rl2 host 192.168.1.205
16:08:53.838378 IP www.freebsd.org.http > 192.168.1.200.64084: P 4464:4830(366) ack 1593 win 64512 <nop,nop,timestamp 2839697 11593353>только еще один момент смущает, почему когда parent сквиды остановлены инет все равно работает? :) правда активность только на 192.168.1.200 на 1.205 тишина полная :) т.е. получается функция cache_peer если не находит парентов, то выкидывает на шлюз по умолчанию?
>[оверквотинг удален]
> tcp_outgoing_address 192.168.1.200
> и
> squidt.conf
> tcp_outgoing_address 192.168.1.205
> дэк вопрос вот в чем, если я в pf.conf делаю вот такие
> записи (ext_if1=192.168.1.200,ext_if2=192.168.1.205 соответ.прову один и два)
> 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
> то будут ли пакеты выходящие из сквида согласно правилам tcp_outgoing_address маршрутизироваться
> в нужный канал?Если сквид сам отправляет пакеты с уже нужного вам адреса, то теоретически эти правила и не понадобятся. Но опять таки лучше посмотреть тисипидампом как оно на самом деле.
а теперь проблема в том что я уже не знаю как проверить правильно ли вся эта моя страхобразия работает :) тем более что шлюз тестовый, и находиться в локальной сети всеми тремя интерфейсами :) но глядя на tcpdump вроде как правильно, т.е. я с клиентской машины захожу на freebsd.org и гляжу на шлюзе:# tcpdump -i rl0 host 192.168.1.200
16:08:53.806863 IP freefall.freebsd.org.http > 192.168.1.205.50876: . ack 540 win 63974 <nop,nop,timestamp 2839697 11593657># tcpdump -i rl2 host 192.168.1.205
16:08:53.838378 IP www.freebsd.org.http > 192.168.1.200.64084: P 4464:4830(366) ack 1593 win 64512 <nop,nop,timestamp 2839697 11593353>только еще один момент смущает, почему когда parent сквиды остановлены инет все равно работает? :) правда активность только на 192.168.1.200 на 1.205 тишина полная :) т.е. получается функция cache_peer если не находит парентов, то выкидывает на шлюз по умолчанию?
>[оверквотинг удален]
> # tcpdump -i rl0 host 192.168.1.200
> 16:08:53.806863 IP freefall.freebsd.org.http > 192.168.1.205.50876: . ack 540 win 63974
> <nop,nop,timestamp 2839697 11593657>
> # tcpdump -i rl2 host 192.168.1.205
> 16:08:53.838378 IP www.freebsd.org.http > 192.168.1.200.64084: P 4464:4830(366) ack
> 1593 win 64512 <nop,nop,timestamp 2839697 11593353>
> только еще один момент смущает, почему когда parent сквиды остановлены инет все
> равно работает? :) правда активность только на 192.168.1.200 на 1.205 тишина
> полная :) т.е. получается функция cache_peer если не находит парентов, то
> выкидывает на шлюз по умолчанию?squid в случай если родитель не отвечает может сам идти в инет, но это можно изменить, смотрите опции cache_peer
>[оверквотинг удален]
>> <nop,nop,timestamp 2839697 11593657>
>> # tcpdump -i rl2 host 192.168.1.205
>> 16:08:53.838378 IP www.freebsd.org.http > 192.168.1.200.64084: P 4464:4830(366) ack
>> 1593 win 64512 <nop,nop,timestamp 2839697 11593353>
>> только еще один момент смущает, почему когда parent сквиды остановлены инет все
>> равно работает? :) правда активность только на 192.168.1.200 на 1.205 тишина
>> полная :) т.е. получается функция cache_peer если не находит парентов, то
>> выкидывает на шлюз по умолчанию?
> squid в случай если родитель не отвечает может сам идти в инет,
> но это можно изменить, смотрите опции cache_peerотлично, нашел, директива never_direct, теперь даже иексплорер, даже по-русски говорит что родительские кэши не доступны :)