howtoSAMS + squid+2 интернет канала

Имеем локальную сеть, шлюз(прокси сервер) на базе Linux и два интернет-канала — быстрый и дорогой, медленный и дешевый
Задача состоит в том, чтобы пускать заданных пользователей (в данном случае только веб-трафик) через быстрый канал, а всех остальных — через медленный
eth0 — интерфейс локальной сети
eth1 — оптика: дорогой и быстрый канал
eth2(ppp0) — adsl: дешевый и медленный

Топология следующаяя

Во многих статьях в интернете я встречал, что с двумя каналами, помимо стандартных таблиц маршрутизации, создают две отдельные таблицы. В некоторых случая это правильно, но в моей сети nat используется только для почты, поэтому создавать вторую дополнительную таблицу смысла не имеет. На самом деле это зависит от конкретной задачи — хотите ли вы полностью разбить трафик на два канала (см. вторую часть статьи), или же просто пустить определенную часть пользователей прокси-сервера через другой канал.
В моем случае я просто создал дополнительную таблицу:
echo 200 inet_opt >> /etc/iproute2/rt_tables 
Добавил в нее маршруты для моей локальной сети, маршрут по умолчанию, ну и сеть самого провайдера:
ip route add 192.168.0.0/24 dev eth0 table inet_opt
ip route add 10.10.10.0/24 dev tap3 table inet_opt
ip route add default via 10.10.10.1  table inet_opt
И создадим правило — чтобы пакеты с src-адресом быстрого канала использовали его же:
ip rule add from 10.10.10.10  inet_opt
(Подразумевается, что общий маршрут по умолчанию в таблице main у вас уже задан и смотрит на второй — медленный канал)
В итоге мы получаем, то что любой пакет, вышедший из шлюза с src ip-адресом быстрого канала, будет ходить через него, а с src ip-адресом медленного — будет идти через медленный.
В squid есть параметр tcp_outgoing_address, благодаря которому мы и сможем пускать разных пользователей через разные каналы(привязка каналов будет происходить к шаблонам). Если в sams создать шаблон и добавить в него пользователей, то в /etc/squid/случайная_последовательность.sams запишется имя (при ncsa-, ntlm-авторизации), или ip-адрес (при ip-авторизации) — sams не дает напрямую использовать в squid.conf acl, которые он сам создал, поэтому приходится идти в обход; к примеру, если мы создали шаблон «opt» и добавили в него пользователя, нашли в какой /etc/squid/случайная_последовательность.sams записался пользователь, то можно сделать так:
ln -s /etc/squid/случайная_последовательность.sams /etc/squid/opt_acl
В squid.conf добавим новую acl
Для ip-авторизации
acl opt_acl src "/etc/squid/opt_acl"
Для ncsa, ntlm
acl opt_acl proxy_auth "/etc/squid/opt_acl"
а далее просто добавим в squid.conf правило для нашей новой acl
tcp_outgoing_address 10.10.10.10 opt_acl
Таким образом пользователи обычных шаблонов в sams будут ходить через медленный канал — а тех, кого мы добавим в шаблон «opt», будет пускать через быстрый канал. Назначая и убирая пользователя из этого шаблона можно регулировать через какой канал ходит его веб-трафик.
Аналогично можно сделать и с отдельными сайтами, но в этом случае придется вручную править список сайтов из консоли:
Создадим файл /etc/squid/site_opt, в котором содержиться список сайтов с доступом через быстрый канал, далее создадим acl:
acl site_opt dstdomain "/etc/squid/site_opt"
и также для нее правило:
tcp_outgoing_address 10.10.10.10 site_opt
Что же касается локальной сети, то nat по умолчанию идет на ip медленного канала; отдельный nat на ip быстрого — только для определенных адресов(это правило должно стоять перед общим натом на медленный канал), до которых также статикой брошен машрут через быстрый канал в таблице main
ip route add 195.98.32.206 via 10.10.10.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 195.98.32.206 -j SNAT --to 10.10.10.10 
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE


PS такая схема одно время использовалась у нас, сейчас же я реализовал полное разделение трафика по каналам: через один канал идет городская сеть, через другой — весь внешний интернет. Это справедливо как для самого шлюза, так и для сети за ним. Если кому интересно — пишите в коментах, отпишу как именно
PS2 прошу сильно не пинать- одна из первых статей
  • +6
  • CraDem
  • 16 сентября 2009, 01:40

Комментарии (9)

спасибо
пожалуйста)
  • avatar
  • v0id
  • 16 сентября 2009, 18:33
  • #
  • 1
Может перенести в HowTo?
я не против, только не знаю как
Жми редактировать, потом вверху, под надписью «В какой блог публикуем?», выбери HowTo, но для этого надо быть подписанным на этот блог.
  • avatar
  • fog
  • 20 сентября 2009, 11:30
  • #
  • 0
Я тут подумал, если бы не заминка с переносом в нужный блог, я бы наверное пназвал этот пост «образцово-показательным первым» постом. Написана полезная и интересная информация + хорошее оформление. B-)
спасибо
Интересно было бы узнать как настраивать что бы через один канал шел внешний интернет, а через другой «городская сеть» именно такая проблема возникла у меня. Буду очень благодарен если появится материал по этой теме в виде пошаговой инструкции.
при наличии должного количества свободного времени и сил постараюсь написать, но это не раньше выходных
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.