[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: хитрый policy routing



В Срд, 21/05/2008 в 15:58 +0400, Sapytsky Ilya пишет:
> 19 мая 2008 г. 18:50 пользователь Покотиленко Костик
> <casper@meteor.dp.ua> написал:
>         В Пнд, 19/05/2008 в 11:20 +0400, Sapytsky Ilya пишет:
>         
>         > 19 мая 2008 г. 10:37 пользователь Покотиленко Костик
>         > <casper@meteor.dp.ua> написал:
>         >         В Пнд, 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 строчках мог накосячить?
> Спасибо!

Смотри, в INPUT попадают пакеты адресованные самому роутеру, в OUTPUT
попадают пакеты посылаемые самим роутером. На сколько я понял TEST1 и
роутер это разные машины, если это так то тут и косяк.

Честно говоря, я не въехал в схему подключения, можешь нарисовать?

-- 
Покотиленко Костик <casper@meteor.dp.ua>


Reply to: