Здравствуйте!
Дано:Сервер на debian lenny с тремя интерфейсами,два из которых внешние.На нем крутится сквид с аутинтификацией на AD.
Задача: Нужно сделать так чтоб веб трафик делился на эти два канала (только порт 80)
История:Был испробован iproute2 с балансировкой по весам (весь траф делится согласно weight), но при нем ssl pos терминалы работают через раз , что не приемлемо.
Был истробован iproute + iptables CONMARK +random ,но в этой конфигурации отказался работать squid и на се попытки подключения выдавал только "access denied"
Подскажите пожалуйста где косяк , и как его обойти.
Ниже приведены конфиги обоих способов:1.
#!/bin/bash
ip route flush table T1
ip route flush table T2
ip rule delete table T1
ip rule delete table T2
ip rule add from x.x.x.x table T1
ip rule add from y.y.y.y table T2ip route add x.x.x.0/24 via x.x.x.y dev ppp0 table T1
ip route add y.y.y.0/25 via y.y.y.x dev eth2 src y.y.y.y table T1
ip route add 10.168.0.0/24 dev eth0 src 10.168.0.254 table T1
ip route add 127.0.0.0/8 dev lo table T1
ip route add default dev ppp0 table T1ip route add y.y.y.0/25 via y.y.y.x dev eth2 table T2
ip route add x.x.x.0/24 via x.x.x.y dev ppp0 src x.x.x.x table T2
ip route add 10.168.0.0/24 dev eth0 src 10.168.0.254 table T2
ip route add 127.0.0.0/8 dev lo table T2
ip route add default via y.y.y.x dev eth2 table T2ip route add default scope global nexthop dev ppp0 weight 1 nexthop via y.y.y.x dev eth2 weight 1
ip route flush cache(x.x.x.x,y.y.y.y -адреса интерфеисов)
(x.x.x.0 ,y.y.y.0 -сети провайдеров)
(x.x.x.y,y.y.y.x -гейты провайдеров)
2.
###################Balancer###################
/sbin/iptables -t mangle -N balancer
###############################################
/sbin/iptables -t mangle -A OUTPUT -p tcp -m multiport --dport 80,443 -m state --state NEW,RELATED -j balancer
######################### 34% mark with 1
/sbin/iptables -t mangle -A balancer -j CONNMARK --set-mark 1
/sbin/iptables -t mangle -A balancer -m statistic --mode random --probability 0.49 -j RETURN# all remaining packetsark with2
/sbin/iptables -t mangle -A balancer -j CONNMARK --set-mark 2
/sbin/iptables -t mangle -A balancer -m statistic --mode random --probability 1 -j RETURN#MARKING ALL PACKETS
/sbin/iptables -t mangle -A OUTPUT -p tcp -m multiport --dport 80,443 -j CONNMARK --restore-mark
/sbin/iptables -t mangle -A OUTPUT -m mark --mark 1 -j ACCEPT #а эти цепочки просто для поверки
/sbin/iptables -t mangle -A OUTPUT -m mark --mark 2 -j ACCEPT
Неужели никто не сталкивался с такой задачей?
> Неужели никто не сталкивался с такой задачей?есть решение похожей задачи, пример:
есть два провайдера ютк и цтс, шлюз по умолчанию идёт на ютк а надо чтобы сквид сидел на канале цтс..
начинаем с iproute2
echo 200 cts_prov >> /etc/iproute2/rt_table
потом
ip route add default via 83.1.1.2 dev eth0 table cts_prov
этим самым мы добавили дополнительную маршрутизацию на канал цтс.
этим:
ip rule add fwmark 1 table cts_prov
айпироут2 будет помеченные пакеты меткой "1" отправлять на канал провайдера цтс.
следующим этапом надо заставить iptables маркировать пакеты меткой "1"
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
первое правило метит пакеты идущие на порт 80
второе правило метит все исходящие пакеты порта 80
результат такой, все машины в локальной сети пользуются шлюзом по умолчанию ЮТК, а сквид едет через второй канал ЦТС...
при настройке сиё руководствовался статьями:
http://web.opennet.ru/base/net/iproute2.txt.html
http://opennet.ru:8101/base/net/iproute2_cebka.txt.html
http://www.iptables.ru/iptables1119.html
обращаю внимание что как-то самостоятельно направить сквид на шлюз не поумолчанию с помощью tcp_outgoing_address обернулись провалом!!! пришлось делать как есть.
Всё вышенаписанное работает испытал на собственной шкуре
>[оверквотинг удален]
> ip rule add from x.x.x.x table T1
> ip rule add from y.y.y.y table T2
> ip route add default dev ppp0 table T1
> ip route add default via y.y.y.x dev eth2 table T2
> ip route add default scope global nexthop dev ppp0 weight 1 nexthop
> via y.y.y.x dev eth2 weight 1
> ip route flush cache
> (x.x.x.x,y.y.y.y -адреса интерфеисов)
> (x.x.x.0 ,y.y.y.0 -сети провайдеров)
> (x.x.x.y,y.y.y.x -гейты провайдеров)в ip ru не замечено выбора таблицы маршрутизации на основе флажка (маркера).
> ip route add x.x.x.0/24 via x.x.x.y dev ppp0 table T1
> ip route add y.y.y.0/25 via y.y.y.x dev eth2 src y.y.y.y table T1
> ip route add 10.168.0.0/24 dev eth0 src 10.168.0.254 table T1
> ip route add 127.0.0.0/8 dev lo table T1
> ip route add y.y.y.0/25 via y.y.y.x dev eth2 table T2
> ip route add x.x.x.0/24 via x.x.x.y dev ppp0 src x.x.x.x table T2
> ip route add 10.168.0.0/24 dev eth0 src 10.168.0.254 table T2
> ip route add 127.0.0.0/8 dev lo table T2Эту хрень не надо пихать в таблицы Т1 и Т2, оно должно жить в main в единственном экземпляре.
127.0/8 вообще пихать туда не надо
таким образом, в т1 и т2 будут только по одной записи:
ip route add default dev ppp0 table T1
ip route add default via y.y.y.x dev eth2 table T2
кроме того, надо убрать дефолт из таблицы майн и добавить его в таблицу defaultполучим примерно такой порядок проверки правил:
0: from all lookup local
1000: from all lookup main
1010: from 1.2.144.38 lookup prov1
1030: from 3.4.185.33 lookup prov2
2000: from 192.168.0.0/24 lookup prov1 #без балансировки
3000: from all fwmark 0x2 lookup prov2 #или по маркерам
3005: from all fwmark 0x1 lookup prov1
32766: from all lookup main
32767: from all lookup defaultМаркеры проверяются после проверки src, поскольку в случае ошибочной маркировки поимеем отправку пакетов "не через тот канал". Проверять "наоборот" требуется в редких случаях, например когда посылать "не через тот канал" можно. =)
Читаем:
http://www.opennet.me/tips/2009_policy_route_linux.shtml
http://www.opennet.me/tips/1651_route_iptables_linux_nat.shtmlИ используем четкие указания приоритетов в правилах ip ru.