Реальные конфиги очень большие и тяжёлые, поэтому смоделировал проблему на виртуалках и пробую решить её там.
На шлюзе PROXY есть два подключения к интернету: eth1 и eth2. В качестве PROXY использовались Debian Lenny и CentOS 5.5, результат одинаковый.
Задача: выпускать компьютер HOST(10.10.0.68) в интернет через второе подключение, остальные компьютеры - через первое.
Настройки PROXY:
Интерфейсы:
lo 127.0.0.1/8
eth0 10.10.0.2/24 # локальная сеть
eth1 192.168.1.252/24 # провайдер, default gw 192.168.1.1
eth2 10.0.0.61/24 # провайдер, default gw 10.0.0.2
Правила роутинга:
# ip rule list
0: from all lookup 255
100: from all fwmark 0x2 lookup 100
32766: from all lookup main
32767: from all lookup default
Список маршрутов:
# ip route list
10.0.0.0/24 dev eth2 proto kernel scope link src 10.0.0.61 # интерфейс в интернет
92.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.252
10.10.0.0/24 dev eth0 proto kernel scope link src 10.10.0.2
default via 10.0.0.2 dev eth2
# ip route list table 100
192.168.1.0/24 dev eth1 scope link src 192.168.1.252
default via 192.168.1.1 dev eth1
Настройка iptables(SNAT и маркировка пакетов):
echo "1" > /proc/sys/net/ipv4/ip_forward
# NAT
# выпускаем локалку в интернет
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth1 -j MASQUERADE
# ROUTING
ip route flush table 100
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.252 table 100
ip route add default via 192.168.1.1 dev eth1 table 100
ip rule del pri 100
ip rule add fwmark 2 lookup 100 pri 100
# MARK RULES
iptables -t mangle -A FORWARD -s 10.10.0.68 -j MARK --set-mark 2
iptables -t mangle -A FORWARD -s 10.10.0.68 -d 127.0.0.0/8 -j MARK --set-mark 0
iptables -t mangle -A FORWARD -s 10.10.0.68 -d 10.0.0.0/8 -j MARK --set-mark 0
iptables -t mangle -A FORWARD -s 10.10.0.68 -d 192.168.0.0/16 -j MARK --set-mark 0
iptables -t mangle -A FORWARD -s 10.10.0.68 -d 172.16.0.0/12 -j MARK --set-mark 0
# COUNT RULES
iptables -t mangle -A POSTROUTING -m mark --mark 2 -j ACCEPT
ip route flush cache
Последнее правило заведено для проверки работы маркировки. Действительно, при прохождении пакета на внешние хосты его счётчик увеличивается, то есть маркировка выставлется верно. Все возможные модули со словом mark в названии загружены:
#lsmod | grep -i mark
xt_connmark 6209 0
xt_CONNMARK 6465 0
xt_CONNSECMARK 6465 0
xt_SECMARK 6852 0
xt_mark 5953 1
xt_MARK 6465 5
ip_conntrack 53281 8 xt_connmark,xt_CONNMARK,xt_CONNSECMARK,ipt_MASQUERADE,iptable_nat,ip_nat,ip_conntrack_netbios_ns,xt_state
x_tables 17349 14 xt_connmark,xt_CONNMARK,xt_CONNSECMARK,xt_SECMARK,xt_mark,xt_MARK,ipt_MASQUERADE,iptable_nat,ipt_REJECT,xt_state,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables
Интерфейсы:
eth0 10.0.0.68/24
lo 127.0.0.1/8
#ip rule list
0: from all lookup 255
32766: from all lookup main
32767: from all lookup default
Проверяем - не работает:
Запуск traceroute на HOST показывает, что трафик до 8.8.8.8(гуглёвский бесплатный DNS) всё равно идёт через 10.10.0.2 и потом 10.0.0.2, то есть через первого провайдера.
Проверяем работу второго провайдера:
Меняем на PROXY маршрут по-умолчанию на 192.168.1.1:
# ip route del default
# ip route add default via 192.168.1.1 dev eth1
В чём может быть проблема? Весь гугл облазил - вроде всё правильно. :( :( *смайлик, бьющийся головой об стену*