- Маршрутизация между тремя интерфейсами, 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 ..."
- Маршрутизация между тремя интерфейсами, Etch, 13:40 , 31-Окт-15 (12)
> Я пробовал писать from в правилах - не работало. > В понедельник предоставлю вывод команд "ip r l t ..." что именно не работало? 'ping 192.168.0.7 -I 192.168.1.7' что говорит? Что при этом показывает tcpdump?
- Маршрутизация между тремя интерфейсами, 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
|