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 строчках мог накосячить? Спасибо!

