nixp.ru v3.0

19 октября 2017,
четверг,
04:56:20 MSK

DevOps с компанией «Флант»
Аватар пользователя Dezex
Dezex написал 16 сентября 2015 года в 17:26 (2615 просмотров) Ведет себя как четкий пацан; открыл 1 тему в форуме, оставил 2 комментария на сайте.

Добрый день!
Не сочтите за ахинею

1)———————

Я занимаюсь тестированием оборудования. Схема тестирования:

Сервер—-(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

теперь в каждую созданную таблизу добавляю маршруты:

/1/ указываю с каким 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

/2/ указываю маршрут до сервера
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 записанного в созданных таблицах см. /1/. То есть:

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)

2)————————-

После, того как я создал интерфейсы
vconfig add eth0 100
vconfig add eth0 200
vconfig add eth0 300
vconfig add eth0 400

Я использовал ifconfig (чтобы появились записи-маршруты в table local):
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

Сегодня же сделал все заново, НО без 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

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

3) ——————--

В какойто степени исправилась ситуация — нужный ip_src, спользовал таблицу nat в iptables:

~# iptables -t nat -A POSTROUTING -o eth0.100 -j SNAT --to-source 192.168.0.10
~# iptables -t nat -A POSTROUTING -o eth0.200 -j SNAT --to-source 192.168.0.20
~# iptables -t nat -A POSTROUTING -o eth0.300 -j SNAT --to-source 192.168.0.30
~# iptables -t nat -A POSTROUTING -o eth0.400 -j SNAT --to-source 192.168.0.40

Но не устанавливается TCP соединение:
—> server TCP (SYN)
<— server TCP (SYN, Ack)
и покругу (retransmition), а должно:
—> server TCP (Ack)

Приложение видимо не получает пакет — он теряется. Не разобрался в чем дело
Объясните пожалуйста как так происходит и как исправить

Dezex

Странно, что не получилось так… но это был танец с бубном
Местный старожил и просто линуксовод сразу указал путь:
путь

Блин, обидно, что вы не подсказали(
Если вдруг,… то для моего случая так:

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 <исполняемая команда>

Dezex

Единственно проблема со скоростью:
- все nets используют один канал — 100 mb/s
при линке в 1 Гбит/с