URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 90072
[ Назад ]

Исходное сообщение
"PF с балансировкой +Squid"

Отправлено ikarus , 20-Окт-10 13:49 
freebsd7.3, есть настроенный PF с балансировкой round-robin по двум внешним каналам
задача: сделать редирект 80го порта на сквида
вообщем все работает, однако никак не могу до конца понять отношения pf и сквида.
когда работаем без сквида, то тут видно (по pftop) что пакетики бегут то в один канал то в другой, все нормально, но что происходит когда идет редирект на сквида? куда он дальше шлет пакеты? на шлюз по-умолчанию?

Содержание

Сообщения в этом обсуждении
"PF с балансировкой +Squid"
Отправлено Кирилл_Н , 20-Окт-10 13:54 
> freebsd7.3, есть настроенный PF с балансировкой round-robin по двум внешним каналам
> задача: сделать редирект 80го порта на сквида
> вообщем все работает, однако никак не могу до конца понять отношения pf
> и сквида.
> когда работаем без сквида, то тут видно (по pftop) что пакетики бегут
> то в один канал то в другой, все нормально, но что
> происходит когда идет редирект на сквида? куда он дальше шлет пакеты?
> на шлюз по-умолчанию?

Если в PFе не указано другого, то да, на шлюз по умолчанию.


"PF с балансировкой +Squid"
Отправлено ikarus , 20-Окт-10 15:02 
>> 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 all

nat-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-proxy

block 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 any

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

-----------------------------------------------------------------------------------

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 network

acl CONNECT method CONNECT

http_access allow manager localhost
#http_access deny manager

http_access allow localnet
http_access allow localhost

http_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% 4320

cache_mem 128 MB
maximum_object_size 64 MB
cache_store_log /usr/local/squid/logs/store.log
visible_hostname pavlik
-----------------------------------------------------------------

очень большое желание представлять всю схему досканально :)


"PF с балансировкой +Squid"
Отправлено Кирилл_Н , 20-Окт-10 19:14 
>[оверквотинг удален]
> 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)

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

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


"PF с балансировкой +Squid"
Отправлено ikarus , 21-Окт-10 06:04 
интересно, спасибо


"PF с балансировкой +Squid"
Отправлено ikarus , 21-Окт-10 12:41 
последний вопрос, попытался реализовать балансировку с помощью сквида, вернее трех сквидов (на одной машине), первый кэширующий делает так:

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 маршрутизироваться в нужный канал?


"PF с балансировкой +Squid"
Отправлено reader , 21-Окт-10 13:00 
>[оверквотинг удален]
> 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 не смогли этого сделать.


"PF с балансировкой +Squid"
Отправлено ikarus , 21-Окт-10 13:20 
а теперь проблема в том что я уже не знаю как проверить правильно ли вся эта моя страхобразия  работает :) тем более что шлюз тестовый, и находиться в локальной сети всеми тремя интерфейсами :) но глядя на 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 если не находит парентов, то выкидывает на шлюз по умолчанию?


"PF с балансировкой +Squid"
Отправлено Кирилл_Н , 21-Окт-10 13:14 
>[оверквотинг удален]
> 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 маршрутизироваться
> в нужный канал?

Если сквид сам отправляет пакеты с уже нужного вам адреса, то теоретически эти правила и не понадобятся. Но опять таки лучше посмотреть тисипидампом как оно на самом деле.


"PF с балансировкой +Squid"
Отправлено ikarus , 21-Окт-10 13:21 
а теперь проблема в том что я уже не знаю как проверить правильно ли вся эта моя страхобразия  работает :) тем более что шлюз тестовый, и находиться в локальной сети всеми тремя интерфейсами :) но глядя на 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 если не находит парентов, то выкидывает на шлюз по умолчанию?


"PF с балансировкой +Squid"
Отправлено reader , 21-Окт-10 13:32 
>[оверквотинг удален]
> # 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


"PF с балансировкой +Squid"
Отправлено ikarus , 21-Окт-10 14:08 
>[оверквотинг удален]
>> <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, теперь даже иексплорер, даже по-русски говорит что родительские кэши не доступны :)