LINUX.ORG.RU
решено ФорумAdmin

Разные default маршруты в зависимости от интерфейса на который пришел запрос?

 


0

1

Доброго времени суток.
Попытаюсь описать проблему: debian 7.8, 2 интерфейса:
eth0 #локальный
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
eth1 #белый
address 80.80.80.46 #адресация вымышленная
netmask 255.255.255.240
gateway 80.80.80.33
route

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
80.80.80.32     *               255.255.255.240 U     0      0        0 eth1
localnet        *               255.255.255.0   U     0      0        0 eth0
Дефолтный шлюз - 192.168.1.1. На debian стоит, например, apache2, и в такой ситуации если постучаться на внешний интерфейс 80.80.80.46 ответ я не получаю, т.к. дефолтный шлюз 192.168.1.1, а не 80.80.80.33. Вопрос: как сделать, чтобы без изменения дефолтного шлюза, на запросы пришедшие на 80.80.80.46 для ответа использовался 80.80.80.33, а не дефолтный?

Зачем вам нужен в таком случае шлюз 192.168.1.1, через него доступна какая-либо другая сеть? Т.е. не 192.168.1.0/24?

kostik87 ★★★★★
()
Ответ на: комментарий от zolden

Спасибо за ответы.
2 kostik87 eth1 предполагается только для определенных задач, apache2 я привел для примера, на самом деле на eth1 будут приходить dns-запросы и на них нужно отвечать с этого же интерфейса, больше eth1 не должен использоваться ни для чего. Интерфейс eth0 - для всего остального (обновления системы etc).
2 zolden Спасибо за ссылку, я так понял это т.н. policy based routing. Вот что я попробовал:

ip route add default via 80.80.80.33 table 110
ip rule add to 80.80.80.46 table 110
т.е. как я понял, трафик пришедший на 80.80.80.46 должен ассоциироваться с таблицей 110 и для ответа будет использоваться 80.80.80.33, а не дефолтный 192.168.1.1, но ответов я все равно не получаю. Можете подсказать что я сделал не так?

nokogerra
() автор топика
Ответ на: комментарий от nokogerra

Может быть можно сделать как-то проще, но у меня не получалось, для PBR приходилось использовать еще и iptables

1. в /etc/iproute2/rt_tables добавляем свою таблицу (110 my_tbl)

2. /sbin/ip route add default via 80.80.80.33 dev eth1 table my_tbl

3. /sbin/ip rule add fwmark 110 table my_tbl

4. iptables:

-A PREROUTING -d 80.80.80.46 -i eth1 -j MARK --set-xmark 110
#...
# на всякий случай
-A POSTROUTING -m mark --mark 110  -j SNAT --to-source 80.80.80.46

anonymous
()
Ответ на: комментарий от zolden

Спасибо за ответы.
2 anonymous чтобы использовать эти марки netfilter должен быть как-то по особенному собран?
2 zolden:
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:50:56:92:5a:f8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::250:56ff:fe92:5af8/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:50:56:92:5b:0a brd ff:ff:ff:ff:ff:ff
    inet 80.80.80.46/28 brd 80.80.80.47 scope global eth1
    inet6 fe80::250:56ff:fe92:5b0a/64 scope link
       valid_lft forever preferred_lft forever

ip r
default via 192.168.1.1 dev eth0
80.80.80.32/28 dev eth1  proto kernel  scope link  src 80.80.80.46
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.10

ip ru
root@debx:~# ip rule
0:      from all lookup local
32765:  from all to 80.80.80.46 lookup 110
32766:  from all lookup main
32767:  from all lookup default
root@debx:~# ip route show table 110
default via 80.80.80.33 dev eth1
правила netfilter на этой машине не применены, политики ACCEPT.

nokogerra
() автор топика
Ответ на: комментарий от nokogerra

чтобы использовать эти марки netfilter должен быть как-то по особенному собран?

Нет. Вот тут рассматривают похожий на твой сценарий, маркируют пакеты и отправляют их через другой интерфейс

http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.html

anonymous
()
Ответ на: комментарий от anonymous

Хм, вот что попробовал:

ip route add default via 80.80.80.33 table 110
ip rule add fwmark 5 table 110
ipt:
iptables -t mangle -A PREROUTING -d 80.80.80.46 -i eth1 -j MARK --set-mark 5
почему-то в iptables-save это выглядит так:
*mangle
:PREROUTING ACCEPT [2621:245481]
:INPUT ACCEPT [2398:228083]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [207:24417]
:POSTROUTING ACCEPT [207:24417]
-A PREROUTING -d 80.80.80.46/32 -i eth1 -j MARK --set-xmark 0x5/0xffffffff
в ip rule:
0:      from all lookup local
32765:  from all fwmark 0x5 lookup 110
32766:  from all lookup main
32767:  from all lookup default
В итоге не работает. Пробовал добавлять:
iptables -t nat -A POSTROUTING -m mark --mark 5 -j SNAT --to-source 80.80.80.46
Я так понимаю подмена адреса отправителя на 80.80.80.46. В итоге тоже не работает. В статье вообще правило в POSTROUTING не указано и якобы все работать должно.

nokogerra
() автор топика
Ответ на: комментарий от nokogerra

попробуй по интерфейсу, а не по адресу

echo «110 dns» >> /etc/iproute2/rt_tables
ip rule add iif eth1 table dns
ip route add default via 80.80.80.33 table dns proto static
ip route flush cache

Не забудь снять дамп, чтобы убедиться, что пакеты вообще приходят

zolden ★★★★★
()
Последнее исправление: zolden (всего исправлений: 2)
Ответ на: комментарий от nokogerra

не работает

Эта фраза не несёт никакого смысла.
Попробуй её переформулировать.
Подскажу начало «судя по дампу, пакеты приходят на ..., потом ... в итоге»

zolden ★★★★★
()
Ответ на: комментарий от nokogerra

В статье вообще правило в POSTROUTING не указано

Да его и не надо, наверное. Это я из конфига, который натит в разные каналы по метке скопировал

В /etc/iproute2/rt_tables добавил таблицу? Может это важно?

anonymous
()
Ответ на: комментарий от nokogerra

А вообще должно работать без помощи iptables, вот в такой последовательности -

1) добавляем таблицу -

echo "300 tab1" >> /etc/iproute2/rt_tables

2) задаем роуты в новую таблицу. вариант «ленивый» -

ip route show table main | grep -Ev '^default' \
   | while read ROUTE ; do
     ip route add table tab1 $ROUTE
done

3) указываем роут по умолчанию, и также соурс роутинг -

ip route add default via 80.80.80.33  table tab1
ip rule add from 80.80.80.46/32 table tab1
FreeBSD ★★★
()
Ответ на: комментарий от FreeBSD

Спасибо, заработало. Проблема была в моем непонимании, и оно осталось о_О. Я писал:

ip rule add to 80.80.80.46/32 table 110
а рабочий вариант:
ip rule add from 80.80.80.46/32 table 110
Но почему так не понимаю. По идее, если трафик пришел на 80.80.80.46, то использовать таблицу 110, где указан нужный шлюз. А в данном случае - если трафик пошел С 80.80.80.46, то использовать таблицу 110. Не понимаю почему это работает вообще.
Спасибо всем за помощь.

nokogerra
() автор топика
Ответ на: комментарий от nokogerra

Но почему так не понимаю

Трафик ходит в двух направлениях. Правилом «ip rule add from 80.80.80.46/32 table 110» мы указываем на то, что весь трафик, адресованый хосту 80.80.80.46, возвращаем через таблицу «N». Если этого не указать, то трафик с 80.80.80.46 будет возвращаться через дефолтную таблицу, и работать это не будет т.к. там другая адресация. Правило «ip rule add to 80.80.80.46/32 table 110» не несет никакого смысла в данном случае, т.к. входящий трафик к хосту 80.80.80.46 и так без помощи этого правила доходит.

Надеюсь стало понятней.

FreeBSD ★★★
()
Ответ на: комментарий от nokogerra

Какая-то адская содомия. А если не-directly-connected хост со стороны интерфейса eth0 «постучится» на белый 80.80.80.46? Исходящий трафик будет иметь src 80.80.80.46 и этим правилом вкупе с таблицей 110 выбрасываться через интерфейс eth1.

Правильный путь это не policy based routing городить с кучей таблиц маршрутизации, а одну основную таблицу маршрутизации сделать правильной. Чтобы 0.0.0.0/0 шёл через eth1, а 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 (может быть ещё какие-то «белые» подсети) шли через eth0.

iliyap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.