Добрый день!
Не сочтите за ахинею
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)
Приложение видимо не получает пакет — он теряется. Не разобрался в чем дело
Объясните пожалуйста как так происходит и как исправить
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Странно, что не получилось так… но это был танец с бубном
Местный старожил и просто линуксовод сразу указал путь:
путь
Блин, обидно, что вы не подсказали(
Если вдруг,… то для моего случая так:
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 <исполняемая команда>
Единственно проблема со скоростью:
- все nets используют один канал — 100 mb/s
при линке в 1 Гбит/с