Назад | Перейти на главную страницу

Формирование трафика Linux с «tc»: фильтр QoS для запросов непосредственно на хосте не применяется?

Я пытаюсь уменьшить пропускную способность интерфейса для отладки моего приложения на более медленной скорости сети.

Я вспомнил tc заявление, чтобы сделать это на интерфейсе, который работал в прошлом. Я использовал его на выделенной (удаленной) машине для разработки.

Это заявление

 tc qdisc add dev wlan0 root tbf rate 250kbit latency 300ms burst 125kbit

Оно работает хорошо при попытке доступа к локальному сокету от другого хозяина, но при доступе к сокету на этом интерфейсе из моего локальная машина, фильтр не применяется.

Интерфейс:

# ifconfig wlan0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet XXX.XXX.XXX:XXX netmask 255.255.255.0  broadcast XXX.XXX.0.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether XX:XX:XX:XX:XX:XX  txqueuelen 1000  (Ethernet)
        RX packets 31438  bytes 28025182 (26.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27035  bytes 7482740 (7.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Розетка (любая):

# netstat -lntp | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      5990/nginx: master

Разъем (lo / wlan0):

# netstat -lntp | grep 8080
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      7432/nginx: master  
tcp        0      0 XXX.XXX.XXX.XXX:8080      0.0.0.0:*               LISTEN      7432/nginx: master

В браузере пытаюсь зайти http://XXX.XXX.XXX.XXX:8080/path и страница (> 1 МБ содержимого + сборки) отображается сразу (кеш очищен ранее).

На другом хосте, который имеет доступ к моей системе, весь контент загружается (заметно) медленно.

Я, конечно, искал другие ресурсы, но ни один из них у меня не работает:

Я также попытался создать класс, используя tc и искажение пакетов с помощью iptables (как показано в третьей ссылке) не было возможно в Fedora 19. Правило игнорируется (нет ошибки при добавлении правила, но оно не появляется при выдаче iptabls -n -L).

Итак, я подозреваю, что фильтрация применяется только к пакетам, поступающим на интерфейс, или локальные запросы не проходят уровень фильтрации.

Envrionment:

Как заставить работать шейпинг трафика для локальных запросов?

(Также приветствуются советы по альтернативным решениям. Далее я опробую squid в качестве обратного прокси с классами задержки.)

Пакеты, предназначенные для локальной машины, не проходят через сетевой интерфейс. Например, вы можете заполнить IP-адрес вашего интерфейса eth0 (скажем, 100-мегабитная ссылка) 1 ГБ трафика, не передавая через него никаких данных. Следовательно, планировщик не будет использоваться.

FWIW, гораздо проще использовать планировщик netem для того, что вы тестируете, вместо tbf. netem предназначен для того, чтобы делать именно то, что вы пытаетесь сделать. Но в вашем случае это все равно не сработает.

Есть очень грязный прием, который я использовал для тестов с двумя интерфейсами. Допустим, у вас есть eth0 и eth1:

  • Вы соединяете их между собой кабелем
  • Вы назначаете IP-адрес 10.0.0.1/24 на eth0 и 10.0.1.2/24 на eth1
  • Вы добавляете правила NAT для обоих интерфейсов, говоря:
    • Трафик, выходящий из eth0 с IP-адресом DST 10.0.0.2, получает DNAT от 10.0.1.2
    • Трафик, исходящий из eth1 с IP-адресом DST 10.0.1.1, получает DNAT от 10.0.0.1
  • Вы добавляете статические записи ARP, говорящие, что:
    • 10.0.0.2 соответствует MAC-адресу eth1, но связан с интерфейсом eth0
    • 10.0.1.1 соответствует MAC-адресу eth0, но связан с интерфейсами eth1

Затем вы можете пропинговать 10.0.0.2, и это приведет к выходу из eth0 и повторному входу в eth1. После этого вы можете добавить желаемый qdisc в соответствующий интерфейс и запустить тесты.