У меня проблема другого плана: шлюз на Debian 4.0 (ядро 2.6.18) Маршрутизатор на 3 интерфейса, непосредственно к шлюзу интернет не подключен.
eth0: 192.168.20.3
eth1: 192.168.33.2
eth2: 192.168.31.2дефолтным шлюзом в таблице main стоит 192.168.31.222 через eth2, но трём пользователям из подсети 192.168.31.0/24 нужно сделать таблицу, чтобы они ходили в инет через 192.168.33.26.
Простая маршрутизация по источнику даёт им только дефолтный шлюз на инет. а локалка не работает (двадцать одна подсеть! Из них 19 подсетей клиент не видит)
маркировка пакетов (один из проблемных адресов клиентов 192.168.31.217):
iptables -t mangle -A PREROUTING -s 192.168.31.217 -d 192.168.0.0/16 -j MARK --set-mark 1
т е пакеты исходящие с адреса 192.168.31.217 с адресом назначения, который начинается на 192.168 (таких в инете нет)маркируются меткой 1
далее задаём правило для пакетов с меткой 1:
ip rule add fwmark 1 table main
Не работает! всё пакеты идут на дефолтный шлюз из личной таблицы клиента.
При этом раскладе клиент видит только 2 подсети: свою и ту, в которой его интернет-шлюз
Пробовал прописывать в личную таблицу клиента локальные маршруты, но похоже там какой то замудрёный синтаксис, который нигде не описан. Локальные маршруты не принимаются из за ошибки в синтаксисе. Как ни бился, ничего не получилось.
Пробовал делать наоборот. Создавал таблицу с 192.168.33.26 в качестве дефолтного шлюза.
Только не привязывал по источнику, а направлял в эту таблицу только маркированные пакеты с меткой 1:
iptables -t mangle -A PREROUTING -s 192.168.31.217 -d ! 192.168.0.0/16 -j MARK --set-mark 1
т е теоретически должно быть так:
если пакет от 31,217 адресован в локалку. он попадает в таблицу main и направляется по соответствующему маршруту в нужную подсеть. если пакет с 31,217 адресован в интернет (не соответствует шаблону 192.168.0.0/16) то он маркируется меткой 1 и попадает в таблицу inet3326, где прописан только дефолтный шлюз 192.168.33.26.
На практике: локалка у клиента работает нормально, инет не работает. При попытке протрассировать какой нибудь интернет сервер, например ya.ru, трассировка идёт только до интерфейса интернет шлюза 192.168.33.26, далее превышен интервал ожидания для запроса. То есть пакеты в инет идут не через таблицу main, а через таблицу inet3326. Я подозреваю, что не доходят обратные пакеты из интернета.
Что посоветуете? как поступить? Мне больше нравится последний описанный вариант, если бы он работал. он более гибкий и по моему мнению, правильный.