Добрый день всем!
Имею шлюз на Debian 8.2, двух провайдеров, локальную сеть и NAT. Второй провайдер используется в качестве резервного (распределение нагрузки не используется).
Для маршрутизации прописываю следующее:
ip route add $out dev eth0 src $out_ip table T1
ip route add default via $out_gate table T1
ip route add $out_res dev eth1 src $out_ip_res table T2
ip route add default via $out_gate_res table T2
ip rule add from $out_ip table T1
ip rule add from $out_ip_res table T2
ip route add default via $out_gate metric 10
ip rule add fwmark 0x1/0x3 table T1
ip rule add fwmark 0x2/0x3 table T2
Все правила для iptables приводить, думаю, не имеет смысла, приведу только имеющие отношение к маршрутизации:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -s $local -o $out_int -j MASQUERADE
iptables -t nat -A POSTROUTING -s $local -o $out_int_res -j MASQUERADE
iptables -t mangle -N out-marking
iptables -t mangle -A PREROUTING -m connmark ! --mark 0x0/0x3 -j out-marking
iptables -t mangle -A out-marking -i $local_int -j CONNMARK --restore-mark --mask 0x3
iptables -t mangle -N in-marking
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -j in-marking
iptables -t mangle -A in-marking -i $out_int -j CONNMARK --set-xmark 0x1/0x3
iptables -t mangle -A in-marking -i $out_int_res -j CONNMARK --set-xmark 0x2/0x3
iptables -A INPUT -p all -i $local_int -j ACCEPT
iptables -A OUTPUT -p all -o $local_int -j ACCEPT
iptables -A FORWARD -i $local_int -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Всё прекрасно работает. Пакеты приходят и уходят на правильные интерфейсы. Кроме одного момента - при попытке получить доступ к внешним ip адресам шлюза из локальной сети получаю затык. Сам себя шлюз пингует, с одного провайдера на другого тоже без проблем, а форвардить - никак. Буду благодарен, если подскажете, что куда прописать надобно, я что то уже в тупик зашёл.