Добрый день!
Я занимаюсь тестированием оборудования. Схема тестирования:
Сервер----(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
Объясните пожалуйста как так происходит и как исправить