понедельник, 6 апреля 2009 г.

Linux Advanced Routing & Traffic Control в деле

На работе наконец-то созрели для подключения второго интернет провайдера.

Для упрощения повествования опустим некоторые детали (типа биллинга). На сервере есть три сетевых интерфейса, два из них для выхода в Интернет.
eth0 - локальная сеть.
eth1 - первый провайдер, используется для postfix и httpd.
eth2 - второй провайдер, для доступа пользователей в интернет.

Путь его IP адрес второго соединения IP_eth2, шлюз GWIP_ETH2.

Доступ в интернет организован с помощью NAT и прозрачного Squid следующим образом:
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
-A POSTROUTING -o eth0 -j SNAT --to-source IP_eth2

default gw на сервере - это eth1, соответственно squid начинает работать именно через него. Пытался использовать в настройках squid параментр tcp_outgoing_address, но он его игнорировал.

В итоге остановился на таком решении:
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
ip rule add fwmark 1 table saturn.out
ip route add default via GWIP_ETH2 dev eth2 table saturn.out
ip route flush cache
Теперь трафик со squid идёт на нужный интерфейс, но остаются сомнения о верности такого решения.