LINUX.ORG.RU
ФорумAdmin

Squid и балансировка через nth


0

0

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

#!/bin/sh
IN="eth1"

OUT1="ppp0"
OUT2="ppp1"
OUT3="eth0"

for i in "-F" "-X" "-Z"
do
    for j in "nat" "mangle" "filter"
    do
        iptables -t $j $i
    done
done

iptables -t nat -A POSTROUTING -o $OUT1 -j MASQUERADE 
iptables -t nat -A POSTROUTING -o $OUT2 -j MASQUERADE 
iptables -t nat -A POSTROUTING -o $OUT3 -j SNAT --to-source 111.222.333.116 
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# настраиваем маркировку исходящих соединений
iptables -t mangle -N NEW_OUT_CONN
iptables -t mangle -N FILTER_OUT_CONN

iptables -t mangle -A PREROUTING -m state --state NEW,RELATED \
    -s 192.168.1.32/27 -j FILTER_OUT_CONN
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

iptables -t mangle -A FILTER_OUT_CONN -d 192.168.1.32/27 -j RETURN
iptables -t mangle -A FILTER_OUT_CONN -j NEW_OUT_CONN

iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 1
iptables -t mangle -A NEW_OUT_CONN -m statistic --mode nth --every 2 -j RETURN
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 2

# настраиваем раскидывание соединений по интерфейсам проксика
iptables -t nat -N SQUID

iptables -t nat -A PREROUTING -s 192.168.1.32/27 -p tcp --dport 80 -j SQUID

iptables -t nat -A SQUID -m connmark -p tcp \
    --mark 1 -j REDIRECT --to-ports 8800
iptables -t nat -A SQUID -m connmark -p tcp \
    --mark 2 -j REDIRECT --to-ports 8801
#iptables -t nat -A PREROUTING -s 192.168.1.32/27 -p TCP --dport 80 -j REDIRECT --to-ports 8800 
Правила маршрутизации выглядят так:
#!/bin/sh
ip rule add prio 50 fwmark 1 table ppp0
ip rule add prio 51 fwmark 2 table ppp1

# эти адреса прописаны в tcp_outgoing_address
ip address add 192.168.254.0/22 broadcast + dev lo
ip address add 192.168.254.1/22 broadcast + dev lo

ip rule add prio 48 from 192.168.254.0 table ppp0
ip rule add prio 49 from 192.168.254.1 table ppp1

ip route add default dev ppp0 table ppp0
ip route add default dev ppp1 table ppp1

ip route add unreachable default metric 10 table ppp0
ip route add unreachable default metric 10 table ppp1
Вот squid.conf
cache_mem 256 MB
cache_dir ufs /var/cache/squid 1800 16 256
http_port 192.168.1.62:8800 transparent
http_port localhost:8800 transparent
http_port 192.168.1.62:8801 transparent
http_port localhost:8801 transparent

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl all src 0.0.0.0/0.0.0.0
acl allowed_hosts src 192.168.1.32/27
acl ppp0 myport 8800
acl ppp1 myport 8801

http_access deny manager all
http_access allow allowed_hosts
http_access allow localhost
http_access deny all
#allowed_hosts 
visible_hostname server
 
cache_effective_user proxy
cache_effective_group proxy

cache_log /var/log/squid/cache.log
access_log /var/log/squid/access.log

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

tcp_outgoing_address 192.168.254.0 ppp0
tcp_outgoing_address 192.168.254.1 ppp1

Во-первых, подробное описание балансировки (в том числе через nth) есть в википедии, статья про iptables.

Во-вторых, насколько я понял (многабукаф, лень разбираться), ты зачем-то пытаешься прикручивать маркировку фаервола к роутингу. Зачем — непонятно. По идее, для успешной работы кальмара через оба интерфейса должно быть достаточно

ip rule add prio 48 from 192.168.254.0 table ppp0 
ip rule add prio 49 from 192.168.254.1 table ppp1 
 
ip route add default dev ppp0 table ppp0 
ip route add default dev ppp1 table ppp1 

anonymous
()
Ответ на: комментарий от anonymous

Заметим, что кроме алгоритма случайной балансировки, критерий statistic позволяет реализовать балансировку в режим round robin. Для этого поменяем цепочку select_prov следующим образом:

iptables -t mangle -F select_prov # Очищаем ее
iptables -t mangle -A select_prov -j CONNMARK --set-mark 1 # Ставим всем соединениям маркировку 1
iptables -t mangle -A select_prov -m statistic --mode nth --every 3 -j RETURN # Первый из трех пакетов - выходим
iptables -t mangle -A select_prov -j CONNMARK --set-mark 2 # Ставим всем оставшимся соединениям маркировку 2
iptables -t mangle -A select_prov -m statistic --mode nth --every 2 -j RETURN # Один из оставшихся двух - выходим
iptables -t mangle -A select_prov -j CONNMARK --set-mark 3 # Последний

В википедии написано ровно то же что настроено у меня. Балансировка работает и не скрипит. Почему-то не пашет squid, видимо что-то я упустил, но что - не вижу, поэтому спрашиваю здесь.

Lonli-Lokli ★★
() автор топика

Статью в википедии не читал, ваш конфиг squid'а не смотрел. Но, ИМХО, у вас не правильный подход. Все соединения, проходящие через сервер вы маркируете 1 или 2, потом на основании маркера отправляете пакет через один или другой канал связи. Делайте аналогично для локальных соединений (маркировка в mangle OUTPUT) и будет у вас раскидывание squid по двум каналам.

mky ★★★★★
()
Ответ на: комментарий от mky

Спасибо, про такой вариант не думал. А не подскажете, как бы при этом выцепить соединения только сквида? Выбор по uid подойдёт?

Lonli-Lokli ★★
() автор топика
Ответ на: комментарий от Lonli-Lokli

>А не подскажете, как бы при этом выцепить соединения только сквида? Выбор по uid подойдёт?

Думаю, да.

nnz ★★★★
()
Ответ на: комментарий от Lonli-Lokli

Можно по uid, можно сказать биндится ему на отдельный ip-адрес, а можно, так как squid у вас в режиме transparent и ловит только трафик на порт 80, просто считать его трафиком весь исходящий трафик на порт 80.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.