The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Маршрутизация между тремя интерфейсами, !*! Yurov Max, 30-Окт-15, 20:05  [смотреть все]
Доброго времени суток!

У меня следующая задача.
На локальной машине с Ubuntu настроено три виртуальных сетевых интерфейса: tap0, tap1 и tap2 со следующими IP адресами:
1) tap0 - 192.168.0.7/24
2) tap1 - 192.168.1.7/24
3) tap2 - 192.168.2.7/24

Нужно проложить следующие маршруты:
1) tap0 <-> tap1
2) tap0 <-> tap2
3) tap1 <-> tap2
Т.е. если данные передаются с 192.168.0.7 (tap0) на 192.168.1.7 (tap1) нужно чтобы данные передавались в tap1. И так далее.

Все это должно работать через vde_switch.

Я сделал как понимаю, но почему пакеты маршрутизируются не правильно.

В перспективе, количество интерфейсов будет увеличено.

Прошу помочь знатоков и профессионалов!

Заранее благодарен!

Я сделал следующее:

# reset interfaces
ip link del tap0 2>/dev/null || :
ip link del tap1 2>/dev/null || :
ip link del tap2 2>/dev/null || :

# create interfaces
vde_tunctl -t tap0
vde_tunctl -t tap1
vde_tunctl -t tap2

# assign addresses
ip addr add 192.168.0.7/24 dev tap0
ip addr add 192.168.1.7/24 dev tap1
ip addr add 192.168.2.7/24 dev tap2

# put ifs up
ip link set tap0 up
ip link set tap1 up
ip link set tap2 up

# lower priority of kernel local table to 500
ip rule del pref   0 lookup local 2>/dev/null || :
ip rule del pref 500 lookup local 2>/dev/null || :
ip rule add pref 500 lookup local

# on rx side handle packets by local table, so we can receive them
ip rule del pref 10 2>/dev/null || :
ip rule del pref 11 2>/dev/null || :
ip rule del pref 12 2>/dev/null || :
ip rule add pref 10 iif tap0 lookup local
ip rule add pref 11 iif tap1 lookup local
ip rule add pref 12 iif tap2 lookup local

# tx
ip rule del pref 100 2>/dev/null || :
ip rule del pref 101 2>/dev/null || :
ip rule del pref 102 2>/dev/null || :
ip rule add pref 100 to 192.168.0.7 lookup 100
ip rule add pref 101 to 192.168.1.7 lookup 101
ip rule add pref 102 to 192.168.2.7 lookup 102

ip route flush table 100
ip route flush table 101
ip route flush table 102
ip route add default dev tap0 table 100
ip route add default dev tap1 table 101
ip route add default dev tap2 table 102

vde_switch --tap tap0 --tap tap1 --tap tap2


  • Маршрутизация между тремя интерфейсами, !*! Etch, 22:49 , 30-Окт-15 (1)
    > 1) tap0 - 192.168.0.7/24
    > 2) tap1 - 192.168.1.7/24
    > 3) tap2 - 192.168.2.7/24

    У вас же не пересекающиеся подсети, зачем вам source based роутинг? Выкидываете все свои манипуляции с ip rule, оставьте только маршруты в основной таблице и всё само заработает.
    А если нужно запретить связность между tap1 и tap0, то это делается фаерволом.

    • Маршрутизация между тремя интерфейсами, !*! Yurov Max, 22:54 , 30-Окт-15 (2)
      >> 1) tap0 - 192.168.0.7/24
      >> 2) tap1 - 192.168.1.7/24
      >> 3) tap2 - 192.168.2.7/24
      > У вас же не пересекающиеся подсети, зачем вам source based роутинг? Выкидываете
      > все свои манипуляции с ip rule, оставьте только маршруты в основной
      > таблице и всё само заработает.
      > А если нужно запретить связность между tap1 и tap0, то это делается
      > фаерволом.

      Пожалуйста, по-подробнее про "оставьте только маршруты в основной таблице и всё само заработает". Я не совсем понял. Какие команды нужны, а какие нет. Просто я с маршрутизацией столкнулся в первый раз.

      • Маршрутизация между тремя интерфейсами, !*! PavelR, 23:04 , 30-Окт-15 (3)
        >> А если нужно запретить связность между tap1 и tap0, то это делается
        >> фаерволом.

        Он пытается маршрутизировать адреса, которые навесил на интерфейсы.

        > Пожалуйста, по-подробнее про "оставьте только маршруты в основной таблице и всё само
        > заработает". Я не совсем понял. Какие команды нужны, а какие нет.
        > Просто я с маршрутизацией столкнулся в первый раз.

        Вы не сможете ни к чему придти, т.к. у вас нет цели.
        По крайней мере, вы её не смогли озвучить.

      • Маршрутизация между тремя интерфейсами, !*! Etch, 01:20 , 31-Окт-15 (4)
        > Пожалуйста, по-подробнее про "оставьте только маршруты в основной таблице и всё само
        > заработает". Я не совсем понял. Какие команды нужны, а какие нет.
        > Просто я с маршрутизацией столкнулся в первый раз.

        Написал же - убрать всё, что начинается с 'ip rule'. Если так не понятно, тогда оставьте вот это:

        # assign addresses
        ip addr add 192.168.0.7/24 dev tap0
        ip addr add 192.168.1.7/24 dev tap1
        ip addr add 192.168.2.7/24 dev tap2

        # put ifs up
        ip link set tap0 up
        ip link set tap1 up
        ip link set tap2 up

        И наверное команды vde_* тоже нужны (не знаком с ними, так что точно не скажу). Всё остальное уберите.
        • Маршрутизация между тремя интерфейсами, !*! Yurov Max, 09:19 , 31-Окт-15 (5)
          >[оверквотинг удален]
          > не понятно, тогда оставьте вот это:
          >
          # assign addresses 
          > ip addr add 192.168.0.7/24 dev tap0
          > ip addr add 192.168.1.7/24 dev tap1
          > ip addr add 192.168.2.7/24 dev tap2
          > # put ifs up
          > ip link set tap0 up
          > ip link set tap1 up
          > ip link set tap2 up
          И наверное команды vde_* тоже нужны (не знаком

          > с ними, так что точно не скажу). Всё остальное уберите.

          В этом случае весь поток данных пойдёт через интерфейс петля (loopback). А мне надо, чтобы шёл через соответствующий tapX. С этой целью я понизил приоритет таблицы local до 500 и перед ней вставил остальные правила.
          Для двух интерфейсов работает если сделать как написано в это статье: http://blog.asiantuntijakaveri.fi/2012/08/send-to-self-on-li...
          Но мне надо больше 2-х интерфейсов.
          Прошу помочь с написанием правил маршрутизации.

          • Маршрутизация между тремя интерфейсами, !*! Etch, 09:51 , 31-Окт-15 (6)
            > В этом случае весь поток данных пойдёт через интерфейс петля (loopback). А
            > мне надо, чтобы шёл через соответствующий tapX. С этой целью я
            > понизил приоритет таблицы local до 500 и перед ней вставил остальные
            > правила.

            Ничего в лупбэк не пойдёт, если вы не изменяли таблицу local. По умолчанию там перечислены только локальные IP-адреса, на что и намекает название - local. А когда в таблице нет правила для маршрутизации пакета (дефолтного маршрута там тоже быть не должно) - идёт переход на следующую таблицу.

            • Маршрутизация между тремя интерфейсами, !*! Etch, 11:01 , 31-Окт-15 (7)
              Или погодите. Вы хотите, чтобы пакеты между интерфейсами ходили через наружную сеть?
              • Маршрутизация между тремя интерфейсами, !*! Yurov Max, 11:37 , 31-Окт-15 (9)
                > Или погодите. Вы хотите, чтобы пакеты между интерфейсами ходили через наружную сеть?

                Интерфейсы tap0, tap1 и tap2 - локальные виртуальные интерфейсы. Мне надо чтобы трафик между ними шёл не через лупбэк.
                Если  маршруты не прописывать, то трафик пойдёт через лупбэк т.к. интерфейсы локальные.
                Я думаю (но не уверен), что мне надо прописать следующие маршруты:
                1) Если целевой IP пакета <IP tap0>, то передать пакет на dev tap0.
                2) Если целевой IP пакета <IP tap1>, то передать пакет на dev tap1.
                3) Если целевой IP пакета <IP tap2>, то передать пакет на dev tap2.
                Я пробовал так делать, но ничего не работает. Возможно я не правильно делал.

            • Маршрутизация между тремя интерфейсами, !*! Yurov Max, 11:22 , 31-Окт-15 (8)
              >> В этом случае весь поток данных пойдёт через интерфейс петля (loopback). А
              >> мне надо, чтобы шёл через соответствующий tapX. С этой целью я
              >> понизил приоритет таблицы local до 500 и перед ней вставил остальные
              >> правила.
              > Ничего в лупбэк не пойдёт, если вы не изменяли таблицу local. По
              > умолчанию там перечислены только локальные IP-адреса, на что и намекает название
              > - local. А когда в таблице нет правила для маршрутизации пакета
              > (дефолтного маршрута там тоже быть не должно) - идёт переход на
              > следующую таблицу.

              Судя по тестам без указания маршрутов всё идёт через лупбэк.
              Вот тест:
              1) Запускаю "tcpdump -i tap0" для захвата трафика на интерфейсе tap0.
              2) Запускаю "iperf -s -B <IP-адрес tap0>" - сервер для тестов пропускной способности с биндом к интерфейсу tap0
              3) Запускаю "iperf -с <IP-адрес tap0> -B <IP-адрес tap1>" - клиент с биндом к интерфейсу tap1
              В результате tcpdump ничего не регистрирует.

              Если же сделать как в вышеуказанной статье (http://blog.asiantuntijakaveri.fi/2012/08/send-to-self-on-li...), то всё работает. Т.е. tcpdump показывает трафик через tap0.
              Но у меня не получается повторить для более чем 2-х интерфейсов.

              Кстати, не пойму почему в статье указаны следующие правила:
              1) ip rule add pref 100 to <IP-адрес tap0> lookup 100
              Т.е. при получателе с адресом <IP-адрес tap0> нужно смотреть таблицу 100 - это понятно
              2) ip route add default dev tap1 table 100
              Это запись в таблицу 100: по умолчанию использовать устройство tap1. Я правильно понимаю?
              Т.е. получается, что если получатель <IP-адрес tap0>, то пакет нужно выдавать на tap1? Почему не на на tap0?
              А если установить вместо tap1 -> tap0, то будет выдаваться ошибка при:
              ip route get from <IP-адрес tap0> to <IP-адрес tap1>


              • Маршрутизация между тремя интерфейсами, !*! Etch, 12:50 , 31-Окт-15 (10)
                Не совсем понял зачем вам всё это нужно, если оно всё-равно внутри локального компа ходит... Чтобы tcpdump смотреть с привязкой к интерфейсу?
                Ну да ладно. В изначальном своём скрипте замените в этих строках:
                ip rule add pref 100 to 192.168.0.7 lookup 100
                ip rule add pref 101 to 192.168.1.7 lookup 101
                ip rule add pref 102 to 192.168.2.7 lookup 102
                слово 'to' на 'from'.

                Если не заработает, то от вас нужен вывод команд:
                ip ru
                ip r l t 100
                ip r l t 101
                ip r l t 102


                > Кстати, не пойму почему в статье указаны следующие правила:
                > 1) ip rule add pref 100 to <IP-адрес tap0> lookup 100
                > 2) ip route add default dev tap1 table 100
                > Это запись в таблицу 100: по умолчанию использовать устройство tap1. Я правильно
                > понимаю?
                > Т.е. получается, что если получатель <IP-адрес tap0>, то пакет нужно выдавать на
                > tap1? Почему не на на tap0?

                Потому что пакет должен идти из tap1 через vde_switch на tap0. В противном случае вся эта куча интерфейсов не была бы нужна. Хоть я и правда до сих пор не понял, зачем вам всё это.

                • Маршрутизация между тремя интерфейсами, !*! Yurov Max, 13:36 , 31-Окт-15 (11)
                  Я пробовал писать from в правилах - не работало.
                  В понедельник предоставлю вывод команд "ip r l t ..."
                • Маршрутизация между тремя интерфейсами, !*! Yurov Max, 14:10 , 31-Окт-15 (13)
                  >[оверквотинг удален]
                  >> 1) ip rule add pref 100 to <IP-адрес tap0> lookup 100
                  >> 2) ip route add default dev tap1 table 100
                  >> Это запись в таблицу 100: по умолчанию использовать устройство tap1. Я правильно
                  >> понимаю?
                  >> Т.е. получается, что если получатель <IP-адрес tap0>, то пакет нужно выдавать на
                  >> tap1? Почему не на на tap0?
                  > Потому что пакет должен идти из tap1 через vde_switch на tap0. В
                  > противном случае вся эта куча интерфейсов не была бы нужна. Хоть
                  > я и правда до сих пор не понял, зачем вам всё
                  > это.

                  Хочу уточнить, почему надо заменить 'to' на 'from'?
                  Мне же надо,например, чтобы пакет к 192.168.0.7, отправляемый с любого интерфейса отправлялся на tap0.
                  Я поэтому и описал такие правила:
                  1) Если пакет для 192.168.0.7, то смотрим таблицу 100
                  2) Таблица 100: по умолчанию устройство tap0
                  Или я что-то не правильно понимаю?
                  Прошу меня поправить.

                  • Маршрутизация между тремя интерфейсами, !*! Etch, 14:48 , 31-Окт-15 (14)
                    Нет, маршрутизация может только указывать через какой интерфейс отправить пакет. В соответствии с этой парадигмой вам и нужно мыслить, т.е. вам надо чтобы пакеты с исходящим IP 192.168.0.7 уходили через интерфейс tap0. Дальнейшей судьбой пакета занимается удалённая железка, в вашем случае это vde_switch.

                    > Мне же надо,например, чтобы пакет к 192.168.0.7, отправляемый с любого интерфейса отправлялся на tap0.

                    Конкретно вот здесь у вас ошибка - маршруты должны указывать с какого конкретно интерфейса отправлять пакет, а вы пишете "с любого". Компьютер такую формулировку не поймёт :)
                    В статье, по которой вы делали, всего лишь два интерфейса, поэтому там нет такой проблемы - пакеты для первого IP отправляются через второй интерфейс, и наоборот. Именно это и делают те две команды, которых вы не поняли.

                    И вторая ошибка - пакет к 192.168.0.7 не отправляется на tap0, а приходит через него. Т.е., опять же, вы не можете своей маршрутизацией притянуть пакет к себе. Вы можете только принять его, если он уже пришёл.

                    • Маршрутизация между тремя интерфейсами, !*! Yurov Max, 14:58 , 31-Окт-15 (15)
                      Большое спасибо за ответ! В понедельник попробую с учётом Ваших объяснений.
                      • Маршрутизация между тремя интерфейсами, !*! DESTRUCTOR, 11:39 , 09-Ноя-15 (16)
                        Большое спасибо, Etch!
                        Вот так всё работает:

                        ip_tap0="192.168.0.10"
                        ip_tap1="192.168.1.20"
                        ip_tap2="192.168.2.30"


                        killall -9 vde_switch


                        # reset interfaces
                        ip link del tap0 2>/dev/null || :
                        ip link del tap1 2>/dev/null || :
                        ip link del tap2 2>/dev/null || :


                        # create interfaces
                        #vde_tunctl -t tap0
                        #vde_tunctl -t tap1
                        #vde_tunctl -t tap2
                        tunctl -u user -t tap0
                        tunctl -u user -t tap1
                        tunctl -u user -t tap2


                        # assign addresses
                        ip addr add $ip_tap0/24 dev tap0
                        ip addr add $ip_tap1/24 dev tap1
                        ip addr add $ip_tap2/24 dev tap2


                        # put ifs up
                        ip link set tap0 up
                        ip link set tap1 up
                        ip link set tap2 up


                        # lower priority of kernel local table to 500
                        ip rule del pref   0 lookup local 2>/dev/null || :
                        ip rule del pref 500 lookup local 2>/dev/null || :
                        ip rule add pref 500 lookup local

                        # on rx side handle packets by local table, so we can receive them
                        ip rule del pref 10 2>/dev/null || :
                        ip rule del pref 11 2>/dev/null || :
                        ip rule del pref 12 2>/dev/null || :

                        ip rule add pref 10 iif tap0 lookup local
                        ip rule add pref 11 iif tap1 lookup local
                        ip rule add pref 12 iif tap2 lookup local


                        # tx
                        ip rule del pref 100 2>/dev/null || :
                        ip rule del pref 101 2>/dev/null || :
                        ip rule del pref 102 2>/dev/null || :
                        ip rule add pref 100 from $ip_tap0 lookup 100
                        ip rule add pref 101 from $ip_tap1 lookup 101
                        ip rule add pref 102 from $ip_tap2 lookup 102


                        ip route flush table 100
                        ip route flush table 101
                        ip route flush table 102

                        ip route add default dev tap0 protocol static table 100
                        ip route add default dev tap1 protocol static table 101
                        ip route add default dev tap2 protocol static table 102


                        ip route flush cache


                        # ensure (visually) we've set up it ok
                        echo
                        echo " >>> rules:"
                        ip rule

                        echo
                        echo " >>> tap(0|1) routing table:"
                        ip route show table all | grep '\<tap\(0\|1\)\>'

                        # tx path
                        echo
                        echo " >>> checking routing for tx path:"
                        ip route get $ip_tap0 connected
                        ip route get $ip_tap1 connected
                        ip route get $ip_tap2 connected


                        # rx path
                        echo
                        echo " >>> checking routing for rx path:"
                        ip route get from $ip_tap1 to $ip_tap0 iif tap0
                        ip route get from $ip_tap2 to $ip_tap0 iif tap0

                        # start switch and connect switch-tap0 and switch-tap1
                        echo
                        echo " >>> ready to start vde_switch and connect wires..."

                        vde_switch &
                        vde_plug2tap tap0 &
                        vde_plug2tap tap1 &
                        vde_plug2tap tap2 &

                        # for test
                        konsole -e tcpdump -i tap0

                        konsole -e ping $ip_tap1 -I $ip_tap0
                        konsole -e ping $ip_tap2 -I $ip_tap0




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

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