Продолжаем мытарства с созданием идеальной платформы для продажи VDS на основе debian и KVM. Данная статья в принципе верна для любого дистрибутива, только пакетным менеджером воспользуйтесь правильно. И верна она не только для виртуализации, а вообще… Но мой шкурный интерес здесь именно в том, чтобы ограничить максимальную скорость сети для отдельно взятой VDSки.
Как обычно — предыстория. На днях заметил, что периодически скорость скачивания файлов с моей VDS падает. При том падает достаточно быстро и возвращается к нормальному состоянию так же быстро. На хосте — 7 виртуальных серверов, один из которых я использую для экспериментов, а 6 — сдаю знакомым в аренду. Расследование показало, что на одном из VDS размещается бэкап-хост для другого сервера. Было приятно увидеть, что файлы с него дёргались со скоростью аж 80 мбит в секунду, но оставлять 10 мбит всем остальным VDS, пусть и на короткий период? Нет, так не пойдёт.
Ковыряние в packages.debian.org вывело меня на очень простую и удобную утилиту — wondershaper. Я не вдавался в подробности того, как она работает, для меня важно то, что она работает. Собственно, как использовать:
wondershaper [ interface ] [ downlink ] [ uplink ] — устанавливает ограничение для интерфейса
wondershaper [ interface ] — показывает ограничение для интерфейса
wondershaper clear [ interface ] — удаляет ограничение для интерфейса
Теперь подробнее применительно к KVM. Для начала узнаем, какой интерфейс в текущий момент использует ненавистная для нас VDS с жутким потреблением bandwidth
Если вы использовали мой прошлый мануал ( /16 ) для настройки KVM, то сделаем следующее:
Debian:~# ps aux | grep vds10
root 3351 3.4 8.4 1685376 691888 ? Sl Jun16 1340:50 /usr/bin/kvm -S -M pc -m 1024 -smp 1 -name vds10 -monitor pty -boot c -drive file=/vms/vds10.img,if=ide,index=0,boot=on -drive file=/iso/debian-504-i386-CD-1.iso,if=ide,media=cdrom,index=2 -net nic,macaddr=54:52:00:38:00:fb,vlan=0 -net tap,fd=11,script=,vlan=0,ifname=vnet0 -serial pty -parallel none -usb -vnc 127.0.0.1:0 -k en-us
Если не использовали мой мануал… Ну во-первых, зря, во-вторых — вам всё равно нужно узнать интерфейс. Сделать это можно через virt-manager или отключая интерфейсы через iptables, пингуя нужную VDS.
Итак, в приведенной мной цитате из grep выше vds10 у нас бегает с интерфейсом vnet0. Начнём её жестоко мучать:
Debian:~# wondershaper vnet0 10000 10000
Мы выставили ограничение для интерфейса в 10000 кбит в секунду на download и 10000 на upload. К сожалению, я не разобрался, как указывать ограничения в мегабитах, но оно и не так важно.
Debian:~# wondershaper vnet0
Этой командой вы можете посмотреть статистику по интерфейсу. Она большая и непонятная, но всё же)
Теперь мы стали добрыми и решили убрать ограничение для интерфейса (VDSки). Делаем
Debian:~# wondershaper vnet0 clear
Ограничение на интерфейс больше не распространяется.
Как ещё можно использовать wondershaper… Ну например, ограничивать суммарную скорость всех VDS на сервере, если они используют одно устройство bridge (wondershaper br0 100 100), чтобы у хоста оставалась гарантированная свободная полоса. Можно группировать VDSы на разные bridge (в одной из следующих статей расскажу как) и ограничивать им скорость по группам.
Ну и выводы.
Данный метод не защищает ни VDS, ни хост от инкапсуляции трафиком. Он не поможет пережить вам 200 мегабитный ddos одной из VDS.
Данный метод в общем-то полезен, только если вы желаете ограничить скорость исходящего трафика VDS. Ограничивать входящую скорость я не рекомендую.
Можешь вкратце обьяснить почему не можно ограничить входяший трафик для VDS?
Я так понимаю что при ограничении конкретного инерфейса VDS трафик всеравно будет приходить на хост машину в полном обьеме. Тоесть оно не ограничит входяший.
Само собой. Трафик будет прилетать на порт, а fw будет его резать. В общем то бессмысленная затея, если вы что то на этом пытаетесь сэкономить)
Ну собственно проблема в том что на vds стоят 3 парсера и когда они все дружно работают то забирают весь канал и до остальных vds очень трудно прорватся
Собственно и думаю как подрезать сеть на парсерах
>Само собой. Трафик будет прилетать на порт, а fw будет его резать. В общем то бессмысленная затея, если вы что то на этом пытаетесь сэкономить)
Да нет же. Если трафик от ддоса — то безполезно конечно, а если трафик tcp’шный или «нормальный UDP» (в протоколе реализовано нечто похожее на проверку доставки), то протокол увидит что не умещается в доступную полосу и не будет сильно усердствовать. То есть и входящий трафик так тоже можно шейпить в большинстве случаев.
Удобная прога!!! Еще бы добавить возможность подрезать трафик только на конкретном порту заданного интерфейса и вообще бы цены б ей не было!
Это уже в tc лезть придется (
Можно какой-то более понятный генератор правил для tc поискать разве что.