The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
IP route, не тот ip src, !*! Dezex, 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

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

  • IP route, не тот ip src, !*! PavelR, 20:06 , 13-Сен-15 (1)
    >// указываю маршрут до сервера
    >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) Расставьте приоритеты правилам.

    • IP route, не тот ip src, !*! Dezex, 20:33 , 13-Сен-15 (2)

      > 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?


      • IP route, не тот ip src, !*! PavelR, 07:50 , 14-Сен-15 (3)
        1) Правила iptables срабатывают? Счетчики на них растут?
        2) Какие IP-адреса у вас на интерфейсах?
        3) На какой/какие IP-адреса вы шлете трафик (который по-вашему, идет не туда, куда надо).
        • IP route, не тот ip src, !*! Dezex, 11:14 , 14-Сен-15 (5)
          > 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 - не связан с тестом

      • IP route, не тот ip src, !*! PavelR, 08:01 , 14-Сен-15 (4)
        >> 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

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


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

        • IP route, не тот ip src, !*! Dezex, 11:31 , 14-Сен-15 (6)
          > Не совсе понятно, почему тогда проходит
          > 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

        • IP route, не тот ip src, !*! PavelR, 12:55 , 14-Сен-15 (7)
          > 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

          ?

          • IP route, не тот ip src, !*! Dezex, 13:25 , 14-Сен-15 (8)
            >> 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
            > ?

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

          • IP route, не тот ip src, !*! Dezex, 13:26 , 14-Сен-15 (9)
            >> 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
            > ?

            Не проходит

  • IP route, не тот ip src, !*! Dezex, 13:10 , 16-Сен-15 (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

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

  • IP route, не тот ip src, !*! Dezex, 17:01 , 17-Сен-15 (11)
    Странно, что не получилось так... но это был танец с бубном
    Местный старожил и просто линуксовод сразу указал путь:
    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 <исполняемая команда>




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

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