19 мая 2008 г. 18:50 пользователь Покотиленко Костик <[EMAIL PROTECTED]>
написал:

> В Пнд, 19/05/2008 в 11:20 +0400, Sapytsky Ilya пишет:
> > 19 мая 2008 г. 10:37 пользователь Покотиленко Костик
> > <[EMAIL PROTECTED]> написал:
> >         В Пнд, 19/05/2008 в 09:38 +0400, Sapytsky Ilya пишет:
> >         > вья Добрый день!
> >         > пару дней тут изучал доку по policy routing.
> >         > после прочтения так и не понял можно ли сделать вот такую
> >         штуку:
> >         > чтобы маршрут ставился в зависимости от интерфейса, по
> >         которому пакет
> >         > пришел?
> >         > типа если пришло через eth0 - обратно все пакеты этого
> >         соединения
> >         > через этот интерфейс и отправлять.
> >         > Если через eth1 - отправлять все пакеты этого соединения
> >         через eth1.
> >         > И есть default gw, через который отправлять все исходящие
> >         соединения.
> >
> >
> >         Шаршрутизируй по FWMARK, FWMARK выставляй в iptables. Как
> >         известно в
> >         iptables критериев мноооого. По входящему интерфейсу совсем не
> >         проблема.
> >
> > хм... не понял как это сделать?
> > пока не понятна технология.
> > Почему не понятна - если пришел пакет через eth0, а default gw стоит
> > eth1 то будет следующее - пакет будет пытаться пролезть через eth0, но
> > при этом ip отправителя будет стоять от интерфейса eth1. Или я не
> > прав?
> > можно ли примерчик?
>
> Примерчика нет. Скажу сразу, я такое пытался делать давно, но у меня не
> получилось. В рассылке netfilter'а проскакивают такие темы, я был на
> правильном пути, но видать где-то не доглядел... Если в кратце, то
> принцип такой:
>
> 1. На интересующее входящее с внешней стороны соединение, на пакет
> начинающий соединение (SYN) ставишь CONNMARK в какое-нибудь значение.
>
> 2. На обратном пути (пакеты-ответы) будут иметь такое же значение
> CONNMARK. Поскольку iproute2 не умеет работать с CONNMARK, а работает с
> MARK, тут тебе нужно сделать --restore-mark чтобы скопировать значение
> CONNMARK в MARK.
>
> 3. С помощью альтернативных таблиц маршрутизации делаешь так, чтобы
> пакеты с соответствующей маркой шли куда тебе надо.
>
> Повторить для каждого интерфейса где нада такая фишка.
>
> у меня получилось примерно так же:
на машине firewall (шлюз 2х dmz сетей) всё достаточно просто - mark1 для
входа и mark2 для выхода. никаких conntrack не надо, просто если пришло на
eth2 отдать через eth3 и наоборот - всё просто.
а вот на конечной машине не всё так просто оказалось...

настройки роутинга:
ip route add $GATE dev eth1 table ytk
ip route add default via $GATE dev eth1 table ytk
/sbin/ip rule add fwmark 1 table ytk

GATE - гейт для второго подключения, не default на машине

настройки огненной стенки:
EXT - удаленная машина, TEST1 - конечная, на которой всё и делается...
iptables -t mangle --append PREROUTING --protocol tcp --syn --source $EXT
--dst $TEST1 --in-interface eth1 --jump CONNMARK --set-mark 1
iptables -t mangle --append PREROUTING -m connmark --mark 1 --source $EXT
--dst $TEST1 --in-interface eth1 --jump CONNMARK --restore-mark
iptables --append INPUT -m connmark --mark 1 --source $EXT --dst $TEST1
--in-interface eth1 --jump ACCEPT
до сюда отрабатывает хорошо, всё mark как надо...

iptables -t mangle --append OUTPUT -m connmark --mark 1 --source $TEST1
--dst $EXT --jump CONNMARK --restore-mark
iptables --append OUTPUT --source $TEST1 --dst $EXT --jump LOG --log-prefix
" output eth1 finded "
тут mark тоже ставиться как надо, но при этом на ip rule оно не уходит и
пакет хочет выйти через eth0, хотя в ip rule указано, что надо через eth1
выходить.. Думал, что роутинг срабатывает раньше, чем mangle output
работает, но по докам с картинками routing decision вроде как стоит позже.

Вот на этом и застрял. Гугл ничего про эту ситуацию рассказать мне не смог.
Может чего подскажете? Где я в 5 строчках мог накосячить?
Спасибо!

Ответить