Сервер: 5 сетевух. eth0 смотрит в сеть (172.31.254.1), eth1-4 в инет(172.31.[1-4].254, шлюз 172.31.[1-4].1)
Задача: с помощью iptables отмаркировать некоторые пакеты одной меткой (например только icmp, tcp 80, tcp 443 и т.д.)
А iproute2 заставить отмаркированные пакеты ходить в определенный интерфейс в соответствии с источником пакета (src), примерно так: ip rule add src 172.31.254.2 fwmark 2 lookup chan3
Все немаркированные пакеты отправить по дефолтному маршрутуЧто делаю я.
1. убираю все дефолтные маршруты и т.д. Т.е. машина чистая.
2. создаю маршруты на 1 канал в таблице chan1:
ip route add 172.31.254.0/24 via 172.31.254.1 dev eth0 table chan1
ip route add 172.31.4.0/24 via 172.31.4.254 dev eth4 table chan1
ip route add 172.31.1.0/24 via 172.31.1.254 dev eth1 table chan1
ip route add 172.31.3.0/24 via 172.31.3.254 dev eth3 table chan1
ip route add 172.31.2.0/24 via 172.31.2.254 dev eth2 table chan1
ip route add default via 172.31.1.1 dev eth1 table chan1
3. создаю правило маршрутизации для icmp и своего компа (172.31.254.2)
ip rule add src 172.31.254.2 fwmark 2 lookup chan1
iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 2
4. поднимаю NAT на eth1
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.31.1.254
И... Нифига не работает!
По трасерту видно, что пакеты дальше шлюза (172.31.1.1) не уходят, хотя tcpdump показывает, что ответ из инета до сервака доходит, но вот сервер моей машине отдавать не хочет (не работает НАТ?)
если же напишу ip rule add src 172.31.254.2 lookup chan1 (т.е. заворачиваю весь трафик), все работает прекрасно...
Где я ошибся?