LINUX.ORG.RU
ФорумAdmin

Маршрутизация маркированных iptables пакетов.

 ,


3

1

Добрый день. Имеется роутер с 2мя сетевухами к разным провайдерам и одной в локальную сеть. Вот конфигурация сетевух

провайдер 1 (в таблицах rt_tables указан как P1):
IF1=eno33554960
IP1=192.168.5.69
GW1=192.168.5.90
NET1=192.168.5.0/24
провайдер 2 (в таблицах rt_tables указан как P2):
IF2=eno16777736
IP2=172.16.69.100
GW2=172.16.69.2
NET2=172.16.69.0/24
локальная сеть:
IF_LOCAL=eno50332184
IP_LOCAL=192.168.50.90
NET_LOCAL=192.168.50.0/24
После настройки имеем такие виды маршрутов в таблицах
[root@fedora ~]# ip route
default via 192.168.5.90 dev eno33554960 
127.0.0.0/8 dev lo  scope link 
172.16.69.0/24 dev eno16777736  scope link  src 172.16.69.100 
192.168.5.0/24 dev eno33554960  scope link  src 192.168.5.69 
192.168.50.0/24 dev eno50332184  scope link 
[root@fedora ~]# ip route show table P1
default via 192.168.5.90 dev eno33554960 
127.0.0.0/8 dev lo  scope link 
172.16.69.0/24 dev eno16777736  scope link 
192.168.5.0/24 dev eno33554960  scope link  src 192.168.5.69 
192.168.50.0/24 dev eno50332184  scope link 
[root@fedora ~]# ip route show table P2
default via 172.16.69.2 dev eno16777736 
127.0.0.0/8 dev lo  scope link 
172.16.69.0/24 dev eno16777736  scope link  src 172.16.69.100 
192.168.5.0/24 dev eno33554960  scope link 
192.168.50.0/24 dev eno50332184  scope link 
и такие правила
[root@fedora ~]# ip rule
0:	from all lookup local 
32734:	from all fwmark 0x1 lookup P1 
32735:	from all fwmark 0x2 lookup P2 
32736:	from 192.168.5.69 lookup P1 
32737:	from 172.16.69.100 lookup P2 
32766:	from all lookup main 
32767:	from all lookup default 
в iptables все открыто и настроен маскарадинг
[root@fedora ~]# iptables -vL
Chain INPUT (policy ACCEPT 429 packets, 42872 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 930 packets, 602K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 327 packets, 54592 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@fedora ~]# iptables -t nat -vL
Chain PREROUTING (policy ACCEPT 223 packets, 12249 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 198 packets, 10968 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 3 packets, 228 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  any    eno16777736  anywhere             anywhere            
   25  1363 MASQUERADE  all  --  any    eno33554960  anywhere             anywhere            
[root@fedora ~]# iptables -t mangle -vL
Chain PREROUTING (policy ACCEPT 1493 packets, 657K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 560 packets, 54913 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 930 packets, 602K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 417 packets, 63164 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 1347 packets, 665K bytes)
 pkts bytes target     prot opt in     out     source               destination         
Пакеты по маршруту по умолчанию ходят замечательно. Если какой-нибудь IP завернуть на второго провайдера через
 
[root@fedora ~]# ip rule add from 192.168.50.150 table P2
[root@fedora ~]# ip rule
0:	from all lookup local 
32733:	from 192.168.50.150 lookup P2 
32734:	from all fwmark 0x1 lookup P1 
32735:	from all fwmark 0x2 lookup P2 
32736:	from 192.168.5.69 lookup P1 
32737:	from 172.16.69.100 lookup P2 
32766:	from all lookup main 
32767:	from all lookup default 
то он на него поворачивает
 
1    <1 мс    <1 мс    <1 мс  192.168.50.90
  2     *       <1 мс    <1 мс  172.16.69.2
  3     *        *        *     Превышен интервал ожидания для запроса.
  4     1 ms    <1 мс    <1 мс  192.168.0.1
  5     4 ms     4 ms     4 ms  100.70.0.1
и т.д.
Но если попробовать маркировать пакеты через iptables
[root@fedora ~]# iptables -t mangle -A PREROUTING -s 192.168.50.150 -j MARK --set-mark 2
[root@fedora ~]# iptables -t mangle -vL
Chain PREROUTING (policy ACCEPT 82 packets, 6542 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       all  --  any    any     192.168.50.150       anywhere             MARK set 0x2

Chain INPUT (policy ACCEPT 79 packets, 6410 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 66 packets, 6568 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 66 packets, 6568 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@fedora ~]# ip rule
0:	from all lookup local 
32734:	from all fwmark 0x1 lookup P1 
32735:	from all fwmark 0x2 lookup P2 
32736:	from 192.168.5.69 lookup P1 
32737:	from 172.16.69.100 lookup P2 
32766:	from all lookup main 
32767:	from all lookup default 
то картина получается такая
 1    <1 мс    <1 мс    <1 мс  192.168.50.90
 2    <1 мс    <1 мс    <1 мс  172.16.69.2
 3     *        *        *     Превышен интервал ожидания для запроса.
 4     *        *        *     Превышен интервал ожидания для запроса.
 5     *        *        *     Превышен интервал ожидания для запроса.
 6     *        *        *     Превышен интервал ожидания для запроса.
 7     *        *        *     Превышен интервал ожидания для запроса.
Если по умолчанию поставить второго провайдера, и пакеты маркировать как 0х1, чтобы они согласно правилам поворачивали на первого, то ситуация не меняется.Что мешает маркированным пакетам вернуться? Может кто глянет свежим взглядом. ОС Fedora 23.

Первое что видно:

Пакеты по маршруту по умолчанию ходят замечательно. Если какой-нибудь IP завернуть на второго провайдера через....
то он на него НЕ поворачивает

починил
у вас 1 <1 мс <1 мс <1 мс 192.168.50.90
а 192.168.50.90 это вроде как первый пров а не второй

anc ★★★★★ ()

Второе:
что делает

127.0.0.0/8 dev lo  scope link 
172.16.69.0/24 dev eno16777736  scope link 
192.168.5.0/24 dev eno33554960  scope link  src 192.168.5.69 
192.168.50.0/24 dev eno50332184  scope link 

в таблицах P1 и P2 не совсем поняно, может конечно оно и нормально, но я такого не видел.

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

192.168.50.90 это адрес который смотрит на локальную сеть. трасерт я делал с адреса 192.168.50.150 для которого 192.168.50.90 является шлюзом. поэтому для 192.168.50.150 порядок по умолчанию такой 192.168.50.90 -> 192.168.5.90 -> и дальше по сети провайдера.

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

Сорри туплю .50. и .5 путают. Ощущение как будто маскарад не работает. Посмотрите tcpdump-м с какого он адреса на интерфейсе eno16777736 уходит.

anc ★★★★★ ()

я уже устал повторять про элементарных правила при работе с policy-routing

1) проверка прямых маршрутов (table main) обязательно идет сразу после table local! В main не долно быть маршрута по-умолчанию!!!

ip ru
0:      from all lookup local 
128:    from all lookup main 

2) после main уже можно смотреть fwmark & src для каждого провайдера/клиента

1020:   from all fwmark 0x1 lookup 11 
1021:   from yy.yy.yy.yy lookup 11
1030:   from all fwmark 0x2 lookup 12 
1031:   from xx.xx.xx.xx lookup 12

3) (настоятельно рекомендуется) нужно просмотреть таблицу с DGW которая определяла маршрут если нет предпочтений.

2070:   from all lookup 12

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

проверка прямых маршрутов (table main) обязательно идет сразу после table local! В main не долно быть маршрута по-умолчанию!!!

Почему? Чем мешает вариант когда у main есть def route но при этом она в конце? Я серьезно спрашиваю, ваши «я уже устал повторять про элементарных правила» или как-то пропустил или не обратил внимание. Если не тяжело скиньте линк или повторитесь.
Спасибо.

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

привел конфигурацию к виду

[root@fedora ~]# ip route
127.0.0.0/8 dev lo  scope link 
172.16.69.0/24 dev eno16777736  scope link  src 172.16.69.100 
192.168.5.0/24 dev eno33554960  scope link  src 192.168.5.69 
192.168.50.0/24 dev eno50332184  scope link 
[root@fedora ~]# ip route show table P1
default via 192.168.5.90 dev eno33554960 
127.0.0.0/8 dev lo  scope link 
172.16.69.0/24 dev eno16777736  scope link  src 172.16.69.100 
192.168.5.0/24 dev eno33554960  scope link  src 192.168.5.69 
192.168.50.0/24 dev eno50332184  scope link  src 192.168.50.90 
[root@fedora ~]# ip route show table P2
default via 172.16.69.2 dev eno16777736 
127.0.0.0/8 dev lo  scope link 
172.16.69.0/24 dev eno16777736  scope link  src 172.16.69.100 
192.168.5.0/24 dev eno33554960  scope link  src 192.168.5.69 
192.168.50.0/24 dev eno50332184  scope link  src 192.168.50.90 
[root@fedora ~]# ip rule
0:	from all lookup local 
32766:	from all lookup main 
32770:	from all fwmark 0x1 lookup P1 
32775:	from 192.168.5.69 lookup P1 
32780:	from all fwmark 0x2 lookup P2 
32785:	from 172.16.69.100 lookup P2 
32790:	from all lookup P1 
ситуация не изменилась

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

tcpdump в случае когда ничего не маркируем и трафик идет на шлюз по умолчанию

[root@fedora ~]# tcpdump -nn -t -v -p -i eno33554960 icmp
tcpdump: listening on eno33554960, link-type EN10MB (Ethernet), capture size 262144 bytes
IP (tos 0x0, ttl 127, id 35782, offset 0, flags [none], proto ICMP (1), length 60)
    192.168.5.69 > 8.8.8.8: ICMP echo request, id 512, seq 56067, length 40
IP (tos 0x0, ttl 55, id 60681, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 192.168.5.69: ICMP echo reply, id 512, seq 56067, length 40
IP (tos 0x0, ttl 127, id 35785, offset 0, flags [none], proto ICMP (1), length 60)
    192.168.5.69 > 8.8.8.8: ICMP echo request, id 512, seq 56323, length 40
IP (tos 0x0, ttl 55, id 61584, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 192.168.5.69: ICMP echo reply, id 512, seq 56323, length 40
IP (tos 0x0, ttl 127, id 35790, offset 0, flags [none], proto ICMP (1), length 60)
    192.168.5.69 > 8.8.8.8: ICMP echo request, id 512, seq 56579, length 40
IP (tos 0x0, ttl 55, id 62561, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 192.168.5.69: ICMP echo reply, id 512, seq 56579, length 40
IP (tos 0x0, ttl 127, id 35793, offset 0, flags [none], proto ICMP (1), length 60)
    192.168.5.69 > 8.8.8.8: ICMP echo request, id 512, seq 56835, length 40
IP (tos 0x0, ttl 55, id 62990, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 192.168.5.69: ICMP echo reply, id 512, seq 56835, length 40
^C
8 packets captured
8 packets received by filter
0 packets dropped by kernel
на пингующей машине пинг проходит нормально. добавляем маркировку и слушаем соответствующий интерфейс
[root@fedora ~]# iptables -t mangle -A PREROUTING -s 192.168.50.150 -j MARK --set-mark 2
[root@fedora ~]# iptables -t mangle -vL
Chain PREROUTING (policy ACCEPT 74 packets, 6060 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       all  --  any    any     192.168.50.150       anywhere             MARK set 0x2

Chain INPUT (policy ACCEPT 74 packets, 6060 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 60 packets, 6292 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 60 packets, 6292 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@fedora ~]# tcpdump -nn -t -v -p -i eno16777736 icmp
tcpdump: listening on eno16777736, link-type EN10MB (Ethernet), capture size 262144 bytes
IP (tos 0x0, ttl 127, id 36145, offset 0, flags [none], proto ICMP (1), length 60)
    172.16.69.100 > 8.8.8.8: ICMP echo request, id 512, seq 57091, length 40
IP (tos 0x0, ttl 128, id 65426, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 172.16.69.100: ICMP echo reply, id 512, seq 57091, length 40
IP (tos 0x0, ttl 127, id 36162, offset 0, flags [none], proto ICMP (1), length 60)
    172.16.69.100 > 8.8.8.8: ICMP echo request, id 512, seq 57347, length 40
IP (tos 0x0, ttl 128, id 65427, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 172.16.69.100: ICMP echo reply, id 512, seq 57347, length 40
IP (tos 0x0, ttl 127, id 36181, offset 0, flags [none], proto ICMP (1), length 60)
    172.16.69.100 > 8.8.8.8: ICMP echo request, id 512, seq 57603, length 40
IP (tos 0x0, ttl 128, id 65428, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 172.16.69.100: ICMP echo reply, id 512, seq 57603, length 40
IP (tos 0x0, ttl 127, id 36200, offset 0, flags [none], proto ICMP (1), length 60)
    172.16.69.100 > 8.8.8.8: ICMP echo request, id 512, seq 57859, length 40
IP (tos 0x0, ttl 128, id 65429, offset 0, flags [none], proto ICMP (1), length 60)
    8.8.8.8 > 172.16.69.100: ICMP echo reply, id 512, seq 57859, length 40
^C
8 packets captured
8 packets received by filter
0 packets dropped by kernel
пингующая машина показывает все это время Превышен интервал ожидания для запроса. Действительно похоже на маскарадинг, но вот куда смотреть я уже не знаю. Ситуация усугубляется тем, что есть сервер с совпадающими настройками по ip rule,ip route,iptables где все работает замечательно, отличия - там ОС Fedora 12. Может в модулях\ядре дело?

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

Основная ценность main - в нее автоматом вносятся прямые маршруты, без которых нельзя обратиться соседним хостам в сети. В прямом маршруте есть очень важный параметр - «src ip» который необходим в случае когда у нас не задан явно адрес источник.

Если в main есть dgw, то первое обращение к ней даст маршрут и все остальные правила не будут работать.

Пусть у нас есть 3 интерфейса (2 внешних и 1 локальный), один линк дефолтный и один для избранных (трафик с меткой 7). Делаем 3 правила

0:      from all lookup local
64:     from all fwmark 0x7 lookup 2
32766:  from all lookup main
В main есть dgw через первый внешний линк. В таблице 2 есть только dgw через второй внешний линк

Если мы пошлем пакет соседней машине в локальной сети, а он окажется отмеченный меткой 7, то наступает засада, т.к. пакет уходит в dgw через второй линк. Наличие нескольких локальных интерфейсов, блоков белых адресов от провайдеров или иерархическая локальная сеть будет только увеличивать вероятность попадания в такую засаду.

Именно из-за этого и рекомендуется просматривать main сразу после local, а кроме прямых маршрутов в main можно указать маршруты в свои подсети (если локальна сеть иерархическая)

В данном случае проблему можно решить путем более аккуратной маркировки пакетов (т.е. смотреть не только на тип/источник, но и проверять адрес назначения)

Но если правило 64 сформулировано в виде «from xx.xx.xx.xx», то засаду не обойти. Нужно либо продублировать все необходимые маршруты в доп. таблицу (при статической конфигурации с двумя внешинми линками это просто), либо вынести dgw в разные таблицы. Втрой вариант предпочтителен, если внешних линков больше двух или если они не просто ethernet/vlan.

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

«ip ro get ... » покажет какой маршрут будет использован.

Можно сравнить «ip ro get 8.8.8.8 from 192.168.5.69», с «ip ro get 8.8.8.8 from 172.16.69.100»

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

при приведенной выше конфигурации ip rule, ip route следующее

[root@fedora ~]# ip ro get 8.8.8.8 from 192.168.5.69
8.8.8.8 from 192.168.5.69 via 192.168.5.90 dev eno33554960 
    cache 
[root@fedora ~]# ip ro get 8.8.8.8 from 172.16.69.100
8.8.8.8 from 172.16.69.100 via 172.16.69.2 dev eno16777736 
    cache 
и при трасерте видно что трафик поворачивает на нужный маршрут
1    <1 мс    <1 мс    <1 мс  192.168.50.90
 2    <1 мс    <1 мс    <1 мс  172.16.69.2
 3     *        *        *     Превышен интервал ожидания для запроса.
 4     *        *        *     Превышен интервал ожидания для запроса.

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

счетчикм пакетов в nat для MASQUERADE увеличиваются ?

Я бы на время отключил внутренний интеллект MASQUERADE SNAT-ом

B еще могут быть грабли в виде rp_filter. Он должен быть отключен.

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

А посмотрите куда оно (icmp ответ) потом девается, может с другого итерфейса уходит. tcpdump -i any ....

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

Спасибо огромное!!! Все очень подробно разжевали. Я вот как раз занимался всегда костылестроением " проблему можно решить путем более аккуратной маркировки пакетов".

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

Решено. Спасибо за помощь. Проблема была rp_filter. У меня было так

net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eno167777736.rp_filter = 0 (если присмотреться слишком много семерок, интерфейс не существует)
а надо убрать фильтр с правильного интерфейса ( в моем случае eno16777736)
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eno16777736.rp_filter = 0
на будущее надо будет для таких имен интерфейсов начать что ли ctrl+c/ctrl+v пользовать

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