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_41) Тут тоже надо указать 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_1192.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 <исполняемая команда>
|