The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"IP route, не тот ip src"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Маршрутизация, NAT / Linux)
Изначальное сообщение [ Отслеживать ]

"IP route, не тот ip src"  +/
Сообщение от Dezex email(ok) on 13-Сен-15, 16:58 
Добрый день!
Я занимаюсь тестированием оборудования. Схема тестирования:
    
     Сервер----(WAN-NAT)роутер(LAN1-4)---(access1-4)коммутатор(trunk)----ПК

  Мне необходимо проверить поддержку QoS на роутере, а именно поддержку 4 очередей на WAN интерфейсе. Для этого мне нужно запустить 4 потока трафика на роутер (на каждый порт 1 трафик). В качестве генератора трафика использую IPERF.
  На сервере запускаю серверную часть IPERF - четыре копии, которые прослушивают разные tcp/udp порты: 5010, 5020, 5030, 5040.
  На ПК запускаю четыре копии клиентской части IPERF, для которых указываются порты tcp/udp для соединения (5010, 5020, 5030, 5040).
  Для того чтобы разделить трафики на каждый из портов роутера использую vlan  (на коммутатор должны приходить потоки с разными VLAN ID).
  
  Проблема в маршрутизации трафика на ПК:
- я создаю 4 саб интерфейса с VLAN ID:

  vconfig add eth0 100
  vconfig add eth0 200
  vconfig add eth0 300
  vconfig add eth0 400

- трафик должен маршрутизироваться в зависимости от tcp/udp порта назначения, поэтому при помощи iptables ставлю соответствующие метки:

  iptables -t mangle -A OUTPUT -p tcp --dport 5010 -j MARK --set-mark 10
  iptables -t mangle -A OUTPUT -p tcp --dport 5020 -j MARK --set-mark 20
  iptables -t mangle -A OUTPUT -p tcp --dport 5030 -j MARK --set-mark 30
  iptables -t mangle -A OUTPUT -p tcp --dport 5040 -j MARK --set-mark 40

  iptables -t mangle -A OUTPUT -p udp --dport 5010 -j MARK --set-mark 10
  iptables -t mangle -A OUTPUT -p udp --dport 5020 -j MARK --set-mark 20
  iptables -t mangle -A OUTPUT -p udp --dport 5030 -j MARK --set-mark 30
  iptables -t mangle -A OUTPUT -p udp --dport 5040 -j MARK --set-mark 40

- создаю новые таблицы маршрутизации:

  echo 201 test_1  >> /etc/iproute2/rt_tables
  echo 202 test_2  >> /etc/iproute2/rt_tables
  echo 203 test_3  >> /etc/iproute2/rt_tables
  echo 204 test_4  >> /etc/iproute2/rt_tables
  
- добавляю правила маршрутизации для промаркированного трафика:

  ip rule add fwmark 10 table test_1
  ip rule add fwmark 20 table test_2
  ip rule add fwmark 30 table test_3
  ip rule add fwmark 40 table test_4

- теперь в каждую созданную таблизу добавляю маршруты:

  //указываю с каким ip_src нужно обращаться с каждего созданного интерфейса

  ip route add 192.168.0.0/24 dev eth0.100 proto kernel  scope link  src 192.168.0.10 table test_1
  ip route add 192.168.0.0/24 dev eth0.200 proto kernel  scope link  src 192.168.0.20 table test_2
  ip route add 192.168.0.0/24 dev eth0.300 proto kernel  scope link  src 192.168.0.30 table test_3
  ip route add 192.168.0.0/24 dev eth0.400 proto kernel  scope link  src 192.168.0.40 table test_4

  // указываю маршрут до сервера
  ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100 table test_1
  ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.200 table test_2
  ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.300 table test_3
  ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.400 table test_4

- ip route flush cache

.....................

Проблема в том, что трафик от IPERF в зависимости от порта назначения четко маршрутизируется в саб интерфейс. Однако вне зависимости от интерфейса в сгенерированных пакетах указан не тот ip_src. У меня существует соединенеи с интернетом через eth0:

# ip route show table main
default via 192.168.15.254 dev eth0  proto static
192.168.15.128/25 dev eth0  proto kernel  scope link  src 192.168.15.188  metric 1

И в качестве ip_src везеде используеться 192.168.15.188. Хотя я думал он должен использовать ip_src записанного в созданных таблицах:

ip route add 192.168.0.0/24 dev eth0.100 proto kernel  scope link  src 192.168.0.10 table test_1
  ip route add 192.168.0.0/24 dev eth0.200 proto kernel  scope link  src 192.168.0.20 table test_2
  ip route add 192.168.0.0/24 dev eth0.300 proto kernel  scope link  src 192.168.0.30 table test_3
  ip route add 192.168.0.0/24 dev eth0.400 proto kernel  scope link  src 192.168.0.40 table test_4

Объясните пожалуйста как так происходит и как исправить

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "IP route, не тот ip src"  +/
Сообщение от PavelR (??) on 13-Сен-15, 20:06 
>// указываю маршрут до сервера
>ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100 table test_1
>ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.200 table test_2
>ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.300 table test_3
>ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.400 table test_4

1) Тут тоже надо указать src.

>- добавляю правила маршрутизации для промаркированного трафика:
>
>  ip rule add fwmark 10 table test_1
>  ip rule add fwmark 20 table test_2
>  ip rule add fwmark 30 table test_3
>  ip rule add fwmark 40 table test_4

2) Посмотрите ip ru sh
3) Расставьте приоритеты правилам.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "IP route, не тот ip src"  +/
Сообщение от Dezex (ok) on 13-Сен-15, 20:33 

> 1) Тут тоже надо указать src.

Вы имеете ввиду:
ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100  proto kernel  scope link  src 192.168.0.10 table test_1

Не проходит - RTNETLINK answers: No such process

У меня обращение к серверу идет, через роутер, то есть использую я только ip_src из его подсети. Как я понимаю он должен искать ip_src там, где указан маршрут до сети роутера:
192.168.0.0/24 dev eth0.100  proto kernel  scope link  src 192.168.0.10

> 2) Посмотрите ip ru sh
> 3) Расставьте приоритеты правилам.

С этим проблем я не вижу:
# ip rule
0:    from all lookup local
32762:    from all fwmark 0x28 lookup test_4
32763:    from all fwmark 0x1e lookup test_3
32764:    from all fwmark 0x14 lookup test_2
32765:    from all fwmark 0xa lookup test_1
32766:    from all lookup main
32767:    from all lookup default

================================
Я конечно же (надеюсь пока) мало понимаю в Linux. Рассуждаю так:
Прежде чем послать пакет, который будет потом помечен, отловлен и маршрутизирован,
ПО нужно сформировать пакет - установить ip_src. Оно ведь тоже смотрит куда то - таблицу маршрутизации. И он просматривает только 32766:    from all lookup main?


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "IP route, не тот ip src"  +/
Сообщение от PavelR (??) on 14-Сен-15, 07:50 
1) Правила iptables срабатывают? Счетчики на них растут?
2) Какие IP-адреса у вас на интерфейсах?
3) На какой/какие IP-адреса вы шлете трафик (который по-вашему, идет не туда, куда надо).
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "IP route, не тот ip src"  +/
Сообщение от Dezex (ok) on 14-Сен-15, 11:14 
> 1) Правила iptables срабатывают? Счетчики на них растут?

Да счетчики "крутятся"
Chain OUTPUT (policy ACCEPT 482K packets, 244M bytes)
pkts bytes target     prot opt in     out     source               destination        
   18  1080 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:5010 MARK set 0xa
    4   240 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:5020 MARK set 0x14
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:5030 MARK set 0x1e
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:5040 MARK set 0x28
    0     0 MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:5010 MARK set 0xa
    0     0 MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:5020 MARK set 0x14
    0     0 MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:5030 MARK set 0x1e
    0     0 MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:5040 MARK set 0x28

> 2) Какие IP-адреса у вас на интерфейсах?

#ip route show table local
    broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
    local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
    local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1
    broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
    broadcast 192.168.0.0 dev eth0.100  proto kernel  scope link  src 192.168.0.10
    broadcast 192.168.0.0 dev eth0.200  proto kernel  scope link  src 192.168.0.20
    broadcast 192.168.0.0 dev eth0.300  proto kernel  scope link  src 192.168.0.30
    broadcast 192.168.0.0 dev eth0.400  proto kernel  scope link  src 192.168.0.40
    local 192.168.0.10 dev eth0.100  proto kernel  scope host  src 192.168.0.10
    local 192.168.0.20 dev eth0.200  proto kernel  scope host  src 192.168.0.20
    local 192.168.0.30 dev eth0.300  proto kernel  scope host  src 192.168.0.30
    local 192.168.0.40 dev eth0.400  proto kernel  scope host  src 192.168.0.40
    broadcast 192.168.0.255 dev eth0.100  proto kernel  scope link  src 192.168.0.10
    broadcast 192.168.0.255 dev eth0.200  proto kernel  scope link  src 192.168.0.20
    broadcast 192.168.0.255 dev eth0.300  proto kernel  scope link  src 192.168.0.30
    broadcast 192.168.0.255 dev eth0.400  proto kernel  scope link  src 192.168.0.40
    broadcast 192.168.15.128 dev eth0  proto kernel  scope link  src 192.168.15.188
    local 192.168.15.188 dev eth0  proto kernel  scope host  src 192.168.15.188
    broadcast 192.168.15.255 dev eth0  proto kernel  scope link  src 192.168.15.188

# ip route show table main
    default via 192.168.15.254 dev eth0  proto static
    10.176.159.106 dev tun0  proto kernel  scope link  src 10.176.159.105
    192.168.15.128/25 dev eth0  proto kernel  scope link  src 192.168.15.188  metric 1
# ip route show table test_1
    192.168.0.0/24 dev eth0.100  proto kernel  scope link  src 192.168.0.10  metric 1
    213.177.97.66 via 192.168.0.1 dev eth0.100
# ip route show table test_2
    192.168.0.0/24 dev eth0.200  proto kernel  scope link  src 192.168.0.20
    213.177.97.66 via 192.168.0.1 dev eth0.200
# ip route show table test_3
    192.168.0.0/24 dev eth0.300  proto kernel  scope link  src 192.168.0.30
    213.177.97.66 via 192.168.0.1 dev eth0.300
# ip route show table test_4
    192.168.0.0/24 dev eth0.400  proto kernel  scope link  src 192.168.0.40
    213.177.97.66 via 192.168.0.1 dev eth0.400


> 3) На какой/какие IP-адреса вы шлете трафик (который по-вашему, идет не туда,
> куда надо).

В принципе без разницы некий ip_dst. Вы не совсем поняли. Трафик маршрутизируется в зависимости от порта tcp/udp правильно:

   5010 --- > eth0.100, но ip_src = 192.168.15.188 (должен 192.168.0.10)
   5020 --- > eth0.200, но ip_src = 192.168.15.188 (должен 192.168.0.20)
   5030 --- > eth0.300, но ip_src = 192.168.15.188 (должен 192.168.0.30)
   5040 --- > eth0.400, но ip_src = 192.168.15.188 (должен 192.168.0.40)

192.168.15.188 - весит на eth0 - не связан с тестом

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

4. "IP route, не тот ip src"  +/
Сообщение от PavelR (??) on 14-Сен-15, 08:01 
>> 1) Тут тоже надо указать src.
> Вы имеете ввиду:
> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100  proto kernel  
> scope link  src 192.168.0.10 table test_1
> Не проходит - RTNETLINK answers: No such process

Не совсе понятно, почему тогда проходит

ip route add 192.168.0.0/24 dev eth0.100 proto kernel  scope link  src 192.168.0.10 table test_1


> У меня обращение к серверу идет, через роутер, то есть использую я
> только ip_src из его подсети. Как я понимаю он должен искать
> ip_src там, где указан маршрут до сети роутера:
> 192.168.0.0/24 dev eth0.100  proto kernel  scope link  src 192.168.0.10

Мне кажется, что это ошибочное мнение.


Также попробуйте проанализировать, каким путем и _почему_ будет идти ответный трафик.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

6. "IP route, не тот ip src"  +/
Сообщение от Dezex (ok) on 14-Сен-15, 11:31 
> Не совсе понятно, почему тогда проходит
> ip route add 192.168.0.0/24 dev eth0.100 proto kernel  scope link  
> src 192.168.0.10 table test_1

192.168.0.10 из подсети 192.168.0.0/24. То есть при обращении к некоторой сети он должен использовать ip_src из той же подсети. Как я понимаю:

   а) ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100
ага значит я "ПК" должен обратится к 213.177.97.66/32 через 192.168.0.1
   б) а какой ip_src у меня в той же сети, что и 192.168.0.1? :
192.168.0.0/24 dev eth0.100  proto kernel  scope link  src 192.168.0.10

!!!Извиняюсь, возможно я неправ))) Не читал, так домыслил!!!!
Просто если вы например:

   # ifconfig eth0 10.10.10.10/24
   # ip route add defaut via 10.10.10.1 dev eth0

То (если ip-ки действительны) все работает и:

#ip route show table main
   default via 192.168.15.254 dev eth0  proto static
   192.168.15.128/25 dev eth0  proto kernel  scope link  src 192.168.15.188  metric 1

Как и у меня - аналогия (правда тут штука такая - proto static, надо почитать)

> Мне кажется, что это ошибочное мнение.
> Также попробуйте проанализировать, каким путем и _почему_ будет идти ответный трафик.

  Вот про это я еще и не думал, сначала надо сделать правильными ip_src.
Хотя думаю особого труда не составит - iptables -t main -A INPUT ... метки по аналогии, но уже для port_src. Потом правила маршрутизации.
===============================================================
  Хотя может и этого не надо, достаточно маршрутов в table local

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "IP route, не тот ip src"  +/
Сообщение от PavelR (??) on 14-Сен-15, 12:55 
> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100  proto kernel  
> scope link  src 192.168.0.10 table test_1
> Не проходит - RTNETLINK answers: No such process

ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100 src 192.168.0.10 table test_1

?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

8. "IP route, не тот ip src"  +/
Сообщение от Dezex (ok) on 14-Сен-15, 13:25 
>> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100  proto kernel
>> scope link  src 192.168.0.10 table test_1
>> Не проходит - RTNETLINK answers: No such process
> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100 src 192.168.0.10 table test_1
> ?

Тоже не проходит

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "IP route, не тот ip src"  +/
Сообщение от Dezex (ok) on 14-Сен-15, 13:26 
>> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100  proto kernel
>> scope link  src 192.168.0.10 table test_1
>> Не проходит - RTNETLINK answers: No such process
> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100 src 192.168.0.10 table test_1
> ?

Не проходит

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "IP route, не тот ip src"  +/
Сообщение от Dezex email(ok) on 16-Сен-15, 13:10 
Нашел свою оплошность (правда все также не работает)

После, того как я создал интерфейсы  
  vconfig add eth0 100
  vconfig add eth0 200
  vconfig add eth0 300
  vconfig add eth0 400

Я использовал ifconfig:
  ifconfig eth0.100 192.168.0.10/24
  ifconfig eth0.200 192.168.0.20/24
  ifconfig eth0.300 192.168.0.30/24
  ifconfig eth0.400 192.168.0.40/24

В результате в таблицу main были добавлены записи:
  192.168.0.0/24 dev eth0.100  proto kernel  scope link  src 192.168.0.10
  192.168.0.0/24 dev eth0.400  proto kernel  scope link  src 192.168.0.40
  192.168.0.0/24 dev eth0.300  proto kernel  scope link  src 192.168.0.30
  192.168.0.0/24 dev eth0.200  proto kernel  scope link  src 192.168.0.20

После этого с успехом вводились записи

> // указываю маршрут до сервера
> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.100 table test_1
> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.200 table test_2
> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.300 table test_3
> ip route add 213.177.97.66/32 via 192.168.0.1 dev eth0.400 table test_4

Но правда я потом почистил main от этих записей.

Сегодня же сделал все заново, НО без ifconfig - без записей в main. Попытался сделать то же самое
>// указываю маршрут до сервера...

Но ничего не вышло. Получается, что записи до хоста через роутер будут добавлятся в новые таблицы только, при наличии записей до сети роутера в таблице main. Хотя эти записи уже есть в новых таблицах:

# ip route show table test_1
    192.168.0.0/24 dev eth0.100  proto kernel  scope link  src 192.168.0.10
# ip route show table test_2
    192.168.0.0/24 dev eth0.200  proto kernel  scope link  src 192.168.0.20
# ip route show table test_3
    192.168.0.0/24 dev eth0.300  proto kernel  scope link  src 192.168.0.30
# ip route show table test_4
    192.168.0.0/24 dev eth0.400  proto kernel  scope link  src 192.168.0.40

Я ничего не понемаю...

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

11. "IP route, не тот ip src"  +/
Сообщение от Dezex email(ok) on 17-Сен-15, 17:01 
Странно, что не получилось так... но это был танец с бубном
Местный старожил и просто линуксовод сразу указал путь:
http://net-labs.in/2014/04/06/примеры-применения-linux-network-namespaces-netns/

Блин, обидно, что вы не подсказали(
Если вдруг,... то для моего случая так:

ip netns add cl_1
ip netns add cl_2
ip netns add cl_3
ip netns add cl_4

vconfig add eth0 100
vconfig add eth0 200
vconfig add eth0 300
vconfig add eth0 400

ip link set eth0.100 netns cl_1
ip link set eth0.200 netns cl_2
ip link set eth0.300 netns cl_3
ip link set eth0.400 netns cl_4

ip netns exec cl_1 ifconfig eth0.100 192.168.0.10/24 up
ip netns exec cl_2 ifconfig eth0.200 192.168.0.20/24 up
ip netns exec cl_3 ifconfig eth0.300 192.168.0.30/24 up
ip netns exec cl_4 ifconfig eth0.400 192.168.0.40/24 up

ip netns exec cl_1 ip route add default via 192.168.0.1 dev eth0.100
ip netns exec cl_2 ip route add default via 192.168.0.1 dev eth0.200
ip netns exec cl_3 ip route add default via 192.168.0.1 dev eth0.300
ip netns exec cl_4 ip route add default via 192.168.0.1 dev eth0.400

ip netns exec cl_1 ifconfig eth0.100 hw ether 00:10:20:30:40:1
ip netns exec cl_2 ifconfig eth0.200 hw ether 00:10:20:30:40:2
ip netns exec cl_3 ifconfig eth0.300 hw ether 00:10:20:30:40:3
ip netns exec cl_4 ifconfig eth0.400 hw ether 00:10:20:30:40:4

Правильно и красиво

Далее запуск ПО ведется в нужном netns:
ip netns exec <исполняемая команда>

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру