- Ограничение пропускной способности сетевого соединения в Linux
- Ограничение пропускной способности сетевого соединения на уровне приложения в Linux
- Ограничение пропускной способности сетевого соединения на уровне сетевого интерфейса в Linux
- Заключение
- Как ограничить скорость трафика с конкретным ip адресом?
- tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
- Re: tc, ограничение скорости
Ограничение пропускной способности сетевого соединения в Linux
Оригинал: How to limit network bandwidth on Linux
Автор: Dan Nanni
Дата публикации: 26 января 2016 г.
Перевод: А. Панин
Дата перевода: 23 мая 2016 г.
Если в процессе работы с вашей системой Linux для настольных компьютеров вы нередко одновременно используете множество работающих с сетью приложений или разделяете пропускную способность своего домашнего сетевого соединения между несколькими компьютерами, вы наверняка хотите максимально контролировать использование ресурсов имеющегося сетевого соединения. В противном случае при загрузке файлов большого объема с помощью специализированного приложения ваша интерактивная сессия SSH может начать работать с большим замедлением или перестать работать вообще. Либо в процессе синхронизации директории большого объема с сервером Dropbox ваши домашние могут начать жаловаться на постоянные перерывы, возникающие в процессе просмотра видео из сети.
В данном руководстве я постараюсь описать два различных подхода к ограничению пропускной способности сетевого соединения в Linux.
Ограничение пропускной способности сетевого соединения на уровне приложения в Linux
Одним из инструментов для ограничения пропускной способности сетевого соединения, использующим интерфейс командной строки системы, является утилита под названием trickle . Trickle позволяет осуществлять шейпинг трафика, генерируемого любым из существующих приложений, путем «подгрузки» библиотеки с реализацией механизма сетевых сокетов и алгоритмов ограничения пропускной способности сетевого соединения в процессе запуска приложения. Преимущество утилиты trickle заключается в том, что она функционирует исключительно в пространстве пользователя, поэтому вам не понадобятся привилегии пользователя root для ограничения пропускной способности сетевого соединения на уровне какого-либо из приложений. Для совместимости с утилитой trickle приложение должно использовать интерфейс сетевых сокетов без статического связывания с соответствующей системной библиотекой. Утилита trickle может оказаться полезной тогда, когда вам нужно ограничить пропускную способность сетевого соединения на уровне приложения, которое не имеет аналогичного встроенного механизма.
Для установки trickle в Ubuntu, Debian и производных дистрибутивах следует использовать следующую команду:
Для установки trickle в дистрибутивах Fedora или CentOS/RHEL (с подключенным репозиторием EPEL) следует использовать следующую команду:
Утилита trickle используется следующим образом. Необходимо просто разместить вызов trickle (а также флаги и значения лимитов скоростей) перед командой, которую вы желаете исполнить.
С помощью данной команды устанавливаются заданные лимиты скоростей приема и передачи данных (в КБ/с) для приложения, запускаемого с помощью заданной команды.
Например, для установки ограничения максимальной скорости передачи данных для утилиты scp, равного 100 КБ/с, может использоваться следующая команда:
При желании вы можете установить ограничение максимальной скорости приема данных (равное, к примеру, 300 КБ/с) для вашего веб-браузера Firefox, создав специальный файл запуска приложения со следующей командой запуска:
Наконец, утилита trickle может запускаться в режиме демона и контролировать «общую» пропускную способность сетевого соединения для всех приложений, которые были запущены с помощью нее. Для запуска trickle в режиме демона (т.е., trickled) может использоваться следующая команда:
После того, как демон trickled начнет работу в фоновом режиме, вы можете запускать другие приложения с помощью утилиты trickle. Теперь, если вы запустите с помощью утилиты trickle одно приложение, его скорость приема данных будет ограничиваться 1000 КБ/с. Если же вы запустите с помощью утилиты trickle еще одно приложение, скорость приема данных каждого из этих приложений будет ограничиваться 500 КБ/с и так далее…
Ограничение пропускной способности сетевого соединения на уровне сетевого интерфейса в Linux
Еще один способ управления пропускной способностью вашего сетевого соединения заключается в установке лимитов скоростей приема и передачи данных на уровне сетевого интерфейса. Данный подход может оказаться полезным тогда, когда вы делите соединение с сетью Интернет с кем-либо еще. Как и в подавляющем большинстве случаев, в Linux есть необходимый для этого инструмент. Сценарий wondershaper предназначен для выполнения описанной задачи: он ограничивает пропускную способность сетевого соединения на уровне сетевого интерфейса.
На самом деле, wondershaper является простым сценарием командной оболочки, который использует утилиту tc для установки параметров шейпинга трафика и качества сетевого соединения на уровне заданного сетевого интерфейса. Шейпинг исходящего трафика осуществляется путем распределения пакетов по очередям с разными приоритетами, шейпинг входящего трафика — путем отбрасывания пакетов.
Фактически, список полезных функций сценария wondershaper не ограничивался добавлением возможности управления пропускной способностью для каждого из сетевых интерфейсов. Wondershaper также пытается максимально снизить задержки интерактивных сессий, таких, как SSH в процессе загрузки или передачи файлов больших объемов. Кроме того, он гарантирует, что при передаче файлов больших объемов (например, при синхронизации директорий с сервером Dropbox) не будет значительно снижаться скорость загрузки файлов и наоборот.
Для установки wondershaper в Ubuntu, Debian и производных дистрибутивах следует использовать следующую команду:
Для установки wondershaper в дистрибутиве Fedora или CentOS/RHEL (с подключенным репозиторием EPEL) следует использовать следующую команду:
Сценарий wondershaper используется следующим образом:
Например, для установки максимальных скоростей приема/передачи данных для сетевого интерфейса eth0, равных 1000 и 500 Кб/с соответственно, может использоваться следующая команда:
Вы можете удалить установленное ограничение пропускной способности сетевого интерфейса с помощью следующей команды:
Если вас интересует принцип работы сценария wondershaper, вы можете изучить его содержимое (/sbin/wondershaper).
Заключение
В данном руководстве я рассказал о двух различных вариантах ограничения пропускной способности сетевого соединения в системе Linux для настольных компьютеров, а именно, об ограничении пропускной способности сетевого соединения на уровне отдельных приложений и на уровне сетевых интерфейсов. Оба рассмотренных инструмента являются максимально простыми и позволяют быстро и просто организовать шейпинг ранее никоим образом не контролируемого сетевого трафика. Те из вас, кто желает узнать больше о способах ограничения пропускной способности сетевых соединений в Linux, могут ознакомиться со следующим руководством .
Источник
Как ограничить скорость трафика с конкретным ip адресом?
говорят вроде как для этого хорошо подходит IPtables или shorewall. Но мануалы какие-то большие и что-то всё сложно, нигде не могу просто найти как конкретно выглядит команда, чтобы ограничить трафик например по ip и всё.
Мне нужно ограничить исходящий трафик с браузера в CentOS, но и ограничение для одного ip пока сойдет.
iptables здесь опосредованно, тебе нужен iproute2
Здесь мы создаём очередь и класс на устройстве eth0, лимитируем общую скорость до 10 мегабит/сек для этого класса. Также указываем что трайфик, промаркированный меткой 100 отправится в этот класс. Теперь осталось только указать в iptables что направить в этот класс.
В данном примере весь трафик с портом источника 80 с интерфейса eth0 будет отправлен в этот класс. Если eth0 — это устройство через которое у тебя идет Интернет, это означает что трафик с веб-сайтов с 80 порта не сможет занять больше чем 10 мегабит/сек полосы пропускания на eth0.
Сразу скажу — можно было обойтись и без меток и шейпить сразу правилом tc. Но с метками получается несколько гибче, лично мое мнение — синтаксис iproute2 гораздо более зубодробительный чем iptables.
Вопрос агрегации и шейпинга трафика с нескольких интерфейсов(через IFB или IMQ) оставляю на самостоятельное изучение 😉
спасиб) а с помощью них нельзя конкретную приложуху или конкретный ip ограничить? Просто у меня есть сервак удаленный, и мне иногда нужно заходить на него и через браузер загружать большой файлик на чужой сайт. И нужно ограничить исходящий траф с этого браузера, потому что на моем сервере есть сайты, которые начнут тупить)
В общем случае нельзя. Но можно запускать приложение из под другого пользователя, а уже все процессы запущенные из под этого пользователя ограничивать через iptables
Опять же — iptables
А ещё можно запустить приложение в network namespace, привязать к виртуальному интерфейсу и применять tc qdisc уже к этому интерфейсу.
Источник
tc, ограничение скорости
Дайте plz готовый скрипт, который бы просто ограничивал скорость в N кбайт/с на таком-то интерфейсе. Без приоритетов, без распределения по адресам и т.д.
Re: tc, ограничение скорости
Re: tc, ограничение скорости
Если кому понадобится:
tc=`which tc` $tc qdisc del dev eth0 root
$tc qdisc add dev $lan root handle 1: htb $tc class add dev $lan parent 1: classid 1:6 htb rate 1024kbit ceil 2048kbit $tc filter add dev $lan protocol ip parent 1: prio 1 u32 match ip dst 192.168.0.0/24 flowid 1:6
На что влияет ceil я так и не понял, выше установленного в rate прыгнуть не получилось никак.
Re: tc, ограничение скорости
Злое факин форматирование.
$tc qdisc del dev eth0 root
$tc qdisc add dev $lan root handle 1: htb
$tc class add dev $lan parent 1: classid 1:6 htb rate 1024kbit ceil 2048kbit
$tc filter add dev $lan protocol ip parent 1: prio 1 u32 match ip dst 192.168.0.0/24 flowid 1:6
Re: tc, ограничение скорости
> На что влияет ceil я так и не понял, выше установленного в rate прыгнуть не получилось никак.
rate — минимально гарантированная скорость;
ceil — максимально возможная
Немного не понял смысла всех этих твоих движений. Если нужно просто жёстко ограничить скорость, то можно посмотреть в сторону других более приспособленных для этого дисциплин:
#!/bin/sh
lan=eth0
tc=`which tc`
$tc qdisc del dev $lan root
$tc qdisc add dev $lan handle 1:0 root tbf burst 20k limit 20k mtu 1514 rate 2048kbps
Если же нужно зарезервировать канал для сети 192.168.0.0/24 (при этом есть ещё сети), то нужно поменять правила htb, ибо в таком виде, как сейчас при нагруженном канале только 1024kbit и будет.
В данном примере сеть 192.168.0.0/24 имеет приоритет перед остальными адресами. Причём приоритет практически полный:
#!/bin/sh
lan=eth0
tc=`which tc`
$tc qdisc del dev $lan root
$tc qdisc add dev $lan root handle 1: htb default 3
$tc class add dev $lan parent 1: classid 1:1 htb rate 2048kbit
$tc class add dev $lan parent 1:1 classid 1:2 htb rate 2024kbit ceil 2048kbit prio 1
$tc class add dev $lan parent 1:1 classid 1:3 htb rate 24kbit ceil 2048kbit prio 2
$tc filter add dev $lan protocol ip parent 1: u32 match ip dst 192.168.0.0/24 flowid 1:2
P.S. только не забывай, что максимальная скорость, используемая в tc, должна быть немного меньше реальной пропускной способности канала. Иногда с этим «немного меньше» приходится ограничивать макс.скорость до 70% от реальной.
Re: tc, ограничение скорости
> tc qdisc add dev $lan handle 1:0 root tbf burst 20k limit 20k mtu 1514 rate 2048kbps
И всё, одна строчка, без filter и class?
> В данном примере сеть 192.168.0.0/24 имеет приоритет перед остальными адресами. Причём приоритет практически полный:
С классами этими и дисциплинами мозг вывихнуть можно. Всё равно спасибо за советы 🙂
Re: tc, ограничение скорости
>> tc qdisc add dev $lan handle 1:0 root tbf burst 20k limit 20k mtu 1514 rate 2048kbps
>И всё, одна строчка, без filter и class?
И всё. TBF — это безклассовая дисциплина. То есть конечная, или, краевая дисциплина. Поэтому больше ничего и не нужно прописывать.
> С классами этими и дисциплинами мозг вывихнуть можно.
Ну. дисциплина — это фактически название алгоритма «нарезки» канала.
Класс — это правило «нарезки» внутри алгоритма.
Re: tc, ограничение скорости
> И всё. TBF — это безклассовая дисциплина. То есть конечная, или, краевая дисциплина. Поэтому больше ничего и не нужно прописывать.
> Ну. дисциплина — это фактически название алгоритма «нарезки» канала. Класс — это правило «нарезки» внутри алгоритма.
Чёрт, так просто. Спасибо ещё раз. 🙂
Re: tc, ограничение скорости
а нет какой нибудь GUI утилиты для генерирования таких скриптов?
Re: tc, ограничение скорости
Гуй я не встречал.
Для упрощения лепил своё. перловое и негуёвое :). Конфиг в XML, на выходе даёт готовый к запуску bash-скрипт. Похоже на tcng. Велосипед сделал, но свой велосипед, какой мне надо. 🙂
Кому интересно — выложу где-нить.
Re: tc, ограничение скорости
наверное было бы интересно.
Хотя запрос у меня будет примерно такой наверное
локальные порты 2106 7777 8085 — максимальный приоритет
для того что на них висит
LAN 192.168.1.0/24
с низким приоритетом, без ограничения скорости
подсети провайдера, несколько разных блоков 91.122 89.110 92.100 и чего-то там еще — наименьший приоритет, ограничение на upstream
исходящие на last.fm (87.117.0.0/16) — максимальный приоритет
исходящие на порт 22 — тоже максимально
остальное — поровну между всеми соединениями класса
Re: tc, ограничение скорости
Это на файрволле будет настраиваться? Сколько сетевых на нём?
Сейчас подготовлю архив и куда-нить выложу.
Re: tc, ограничение скорости
./bin/ — исполняемые файлы
ethloop — генератор трафика
gnutc-cgi — формирует страничку с графиками.
gnutc-make-diagram
gnutc-parce-config
gnutc-prepare-test
gnutc-show-trafic-table
Из названий примерно понятно для его оно всё. 🙂
./cfgs/ — конфиги
main.conf — общий конфиг (пути и т.д.); tc.conf — основной конфиг для tc. Там заданы общие для всех переменные. tc- .conf — конфиги для каждого интерфейса.
./cgi-bin/
gnutc-cgi — формирует страничку с графиками. дублирует gnutc-cgi из bin. Руки не дошли в порядок привести 🙂
./contrib/
htb_ethloop_ex.tgz — исходники генератора трафика
./doc/
readme.txt — мнэ. «хочешь сильно наказать программера — посади его описывать свои поделки. » Про меня 🙂
./img/
В этом каталоге создаются графики по результатам тестов.
./out/
Сюда валятся все файлы, которые создаются. По идее временный каталог.
./tests/
Набор правил для формирования тестового трафика
./.htaccess
Если обратиться браузером к нашему каталогу, то отображаем страницу с результатами тестов.
./start.sh
Непосредственно для запуска всего этого добра
./tests.sh
Для запуска тестов.
У меня оно всё лежит в каталоге /var/www/html/gnutc (ЦГИшка в /var/www/cgi-bin). Набираю в браузере http://127.0.0.1/gnutc и вижу результаты тестов. На роутере оно в другом месте, соответственно. запускается только start.sh Оно всё пока не приведено в божеский вид, но если «пойдёт в массы» — сделаю нормально, а не «достаточно для меня».
Пока всё. По созданию XML-конфига под конкретные нужды обращайтесь — либо расскажу, либо пофиксю 🙂
Источник