The OpenNET Project / Index page

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

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

"Маршрутизация между тремя интерфейсами"  +/
Сообщение от Yurov Max email on 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


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

Оглавление

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


1. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Etch on 30-Окт-15, 22:49 
> 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, то это делается фаерволом.

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

2. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Yurov Max email on 30-Окт-15, 22:54 
>> 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, то это делается
> фаерволом.

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

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

3. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от PavelR (??) on 30-Окт-15, 23:04 
>> А если нужно запретить связность между tap1 и tap0, то это делается
>> фаерволом.

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

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

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

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

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

Написал же - убрать всё, что начинается с '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_* тоже нужны (не знаком с ними, так что точно не скажу). Всё остальное уберите.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Yurov Max email on 31-Окт-15, 09:19 
>[оверквотинг удален]
> не понятно, тогда оставьте вот это:
>
# 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-х интерфейсов.
Прошу помочь с написанием правил маршрутизации.

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

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

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

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

7. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Etch on 31-Окт-15, 11:01 
Или погодите. Вы хотите, чтобы пакеты между интерфейсами ходили через наружную сеть?
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

9. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Yurov Max email on 31-Окт-15, 11:37 
> Или погодите. Вы хотите, чтобы пакеты между интерфейсами ходили через наружную сеть?

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

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

8. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Yurov Max email on 31-Окт-15, 11:22 
>> В этом случае весь поток данных пойдёт через интерфейс петля (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>


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

10. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Etch on 31-Окт-15, 12:50 
Не совсем понял зачем вам всё это нужно, если оно всё-равно внутри локального компа ходит... Чтобы 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. В противном случае вся эта куча интерфейсов не была бы нужна. Хоть я и правда до сих пор не понял, зачем вам всё это.

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

11. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Yurov Max email on 31-Окт-15, 13:36 
Я пробовал писать from в правилах - не работало.
В понедельник предоставлю вывод команд "ip r l t ..."
Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Etch on 31-Окт-15, 13:40 
> Я пробовал писать from в правилах - не работало.
> В понедельник предоставлю вывод команд "ip r l t ..."

что именно не работало?

'ping 192.168.0.7 -I 192.168.1.7' что говорит? Что при этом показывает tcpdump?

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

13. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Yurov Max email on 31-Окт-15, 14:10 
>[оверквотинг удален]
>> 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
Или я что-то не правильно понимаю?
Прошу меня поправить.

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

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

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

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

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

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

15. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от Yurov Max email on 31-Окт-15, 14:58 
Большое спасибо за ответ! В понедельник попробую с учётом Ваших объяснений.
Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

16. "Маршрутизация между тремя интерфейсами"  +/
Сообщение от DESTRUCTOR email(ok) on 09-Ноя-15, 11:39 
Большое спасибо, 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

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

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

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




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

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