PF, шлюзы с балансировкой нагрузки и Squid - PullRequest
0 голосов
/ 04 мая 2010

Итак, у меня есть маршрутизатор FreeBSD с PF и Squid, и он имеет три сетевых интерфейса: два подключены к вышестоящим провайдерам (em0 и em1 соответственно) и один для локальной сети (re0), которую мы обслуживаем. Существует некоторая балансировка нагрузки, настроенная с помощью PF. По сути, он направляет весь трафик на порты 1-1024 через один интерфейс (em0), а все остальное - через другой (em1).

Теперь у меня есть прокси-сервер Squid, работающий на коробке, который прозрачно перенаправляет любой HTTP-запрос из локальной сети на порт 3128 в 127.0.0.1. Поскольку Squid перенаправляет этот запрос на HTTP извне, он должен следовать правилу балансировки нагрузки через em0, нет? Проблема в том, что когда мы тестировали его (при переходе с компьютера в локальной сети на http://whatismyip.com, он сообщает внешний IP-адрес интерфейса em1! Когда мы выключаем Squid, внешний IP-адрес em0 сообщается, как и ожидалось.

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

Вот соответствующие настройки в /etc/pf.conf, которые у меня есть:

ext_if1="em1"   # DSL
ext_if2="em0"   # T1
int_if="re0"

ext_gw1="x.x.x.1"
ext_gw2="y.y.y.1"

int_addr="10.0.0.1"
int_net="10.0.0.0/16"

dsl_ports = "1024:65535"
t1_ports = "1:1023"

...

squid=3128
rdr on $int_if inet proto tcp from $int_net \
        to any port 80 -> 127.0.0.1 port $squid
pass in quick on $int_if route-to lo0 inet proto tcp \
        from $int_net to 127.0.0.1 port $squid keep state

...

# load balancing
pass in on $int_if route-to ($ext_if1 $ext_gw1) \
        proto tcp from $int_net to any port $dsl_ports keep state
pass in on $int_if route-to ($ext_if1 $ext_gw1) \
        proto udp from $int_net to any port $dsl_ports

pass in on $int_if route-to ($ext_if2 $ext_gw2) \
        proto tcp from $int_net to any port $t1_ports keep state
pass in on $int_if route-to ($ext_if2 $ext_gw2) \
        proto udp from $int_net to any port $t1_ports

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

Я попытался добавить следующее правило, но оно ничего не сделало:

pass in on $int_if route-to ($ext_if2 $ext_gw2) \
        proto tcp from 127.0.0.1 to any port $t1_ports keep state

Спасибо!

1 Ответ

1 голос
/ 27 июня 2010

Если вы хотите, чтобы все исходящие запросы squid отправлялись на определенный IP-адрес на определенном интерфейсе, вы можете использовать опцию "tcp_outgoing_address" в squid.conf для указания IP-адреса на em0.

...