- Ограничение пропускной способности сетевого соединения в Linux
- Ограничение пропускной способности сетевого соединения на уровне приложения в Linux
- Ограничение пропускной способности сетевого соединения на уровне сетевого интерфейса в Linux
- Заключение
- Как ограничить скорость трафика с конкретным ip адресом?
- IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Re: IPtables как ограничить скорость
- Уменьшить скорость выхода в Интернет для одного IP
Ограничение пропускной способности сетевого соединения в 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 уже к этому интерфейсу.
Источник
IPtables как ограничить скорость
Есть несколько машин, которые ходят через нат с помощью такого правила
-A POSTROUTING -s 10.10.10.10 -d ! 111.111.111.26/255.255.255.240 -o eth0 -j SNAT —to-source 111.111.111.27
нужно ограничить скорость для этой машины.
Думаю, что нужно использовать критерий limit, но как, не понимаю 🙁
Если кто знает — подскажите пожалуйста.
Re: IPtables как ограничить скорость
Re: IPtables как ограничить скорость
Спасибо, и что? каким образом туда конкретный IP пристроить?
Re: IPtables как ограничить скорость
Re: IPtables как ограничить скорость
совершенно правильно понимаешь,
очень просто делается
. -m limit —limit число_пакетов_в_секунду . —jump чего делать
tc в твоем случае применять нет никакой необходимости, т.к.
iptables вполне нормально будет резать трафик по tbf.
Re: IPtables как ограничить скорость
Re: IPtables как ограничить скорость
Что то я не совсем понял, как ты собираешся по числу пакетов определить скорость ? Это первое, и каким образом оно будет трафик резать, причем там tbf ?
покажи пример, ато больше на ересь похоже..
Re: IPtables как ограничить скорость
как обычно — скорость = число_пакетов * AVG pkt size
а трафик будет резаться откидыванием пакетов. tbf это
метод, при помощи которого модуль limit регулирует скорость.
про ересь не заикайся даже, лучше rtfm:
iptables —append FORWARD -p icmp -m limit —limit 100 —jump ACCEPT
Re: IPtables как ограничить скорость
нууу. не путайте firewall и qos 🙂
limit просто отбрасывает «лишние» пакеты
tbf же их задерживает в буффере и отбрасывает только когда буффер заполняется.
Re: IPtables как ограничить скорость
есть одно «но» , отмечу что это мое мнение , основанное на моем понимании передачи пакетов в сети езернет . Значит так — если вы ограничите скорость , теблями , т.е. колво пакетов , допустим в 10 пакетов в секунду максимум , то предположим в идеале размер пакета 1500 байт то максимальная скорость будет 1500*10=15000 , тобишь примерно 15 кб , но , ситуации разные бывают , пакеты не всегда 1500 , они могут быть и меньше при большой нагрузке , то.е. например 1000 , уже бует 10 кб в сек ( это я как мог дословно объяснил ). Так что если вы хотите ограничит скорость — ограничивайте используя например скрипты htb.init или cbq.init , что бы не мучится с самостоятельным прописыванием правил . На если вам именно пакеты в сек — используйте иптеблес .
Почему я это тут сказал — из работы . Вывод этот сделан на основе показаний например iptraf . Т.е. если клиенту стоит 8 кб в сек , то имея у себя вирусную активность у него не 5 пакетов в секунду максимум как могло бы быть предположено а все 50-100 . И он еще позвонит и спросит — «хули у меня нэт тормазит !?» .
Поэтому те кто предлагает резать СКОРОСТЬ используя limit , т.е. резав пакеты — ОШИБАЕТСЯ , в идеале надо резать скорость клиенту используя tc , т.е. скрипты всякие , такие как htb.init , если клиентов дофига то проще скрипт заюзать . И ТАК ЖЕ надо зарезать максимальное количество (. ) пакетов используя ресурсы теблей . Мы пока не сделали этого , но пока оптимальный вариант — 20-30 пакетов в секунду для скорости 256 кбит .
Кстати это достаточно серьезно — клиенты-юзвери с достаточно прямолинейной логикой , если в флашгете написано что чем больше одновременных закачек ставить тем больше производительность канала и больший кпд и большая скорость . Он и ставит 100 одновременных сессий на скорости 256 кбит . Ну все зашибись — скорость у него 32 кб , по нашим графикам нагрузки канала . А вот пакетов у него больше 40-50 , при этом у него наблюдаются страшные тормаза с нэтом , закачка с ошибками и он еще и звонит и тоже спрашивает — что там за фигня у вас с нэтом , все качается с ошибками , так что лучше ему зарезать что бы ниче не качалось выше нормы =)
Если я не прав — скажите где — и скажите почему — с сылками в интернете а без голословных утверждений . Я тут все написал изходя из практики .
Источник
Уменьшить скорость выхода в Интернет для одного IP
Как в Линуксе уменьшить скорость выхода (загрузки и отдача) в Интернет для отдельного IP ?
Если не ошибаюсь, это называется шейпинг
Читай про утилиту tc.
# tc qdisc add dev wlan0 root handle 1: htb default 15
# tc class add dev wlan0 parent 1:1 classid 1:1 htb rate 256kbps
# tc filter add dev wlan0 protocol ip parent 1:1 prio 1 u32 match ip src 192.168.1.136 flowid 1:150
Скорость не уменьшает
Вот пример (там правда не по IP а по марке которая ставится через iptable).
Насколько я помню корневым правилом (1:1) резать канал нельзя, оно просто опысывает максимальную скорость на интерфейсе. Потом уже можно ее разделять по калсcам + нужно продекларировать очередь для класса на котором есть ограничение
Сделал как в вашем примере, но скорость осталась прежней:
tc qdisc add dev $DEV root handle 1: htb default 1
tc class add dev $DEV parent 1: classid 1:50 htb rate 512Kbit prio 5 burst 1400
tc filter add dev $DEV parent 1: protocol ip prio 5 u32 match ip dst 192.168.1.136 flowid 1:1
tc qdisc add dev $DEV parent 1: sfq perturb 60
Может есть варианты через iptables урезать скорость для 192.168.1.136 по IP или MAC ?
192.168.1.136 стоит за NAT
Написать юнит для systemd?
А как замеряешь?
на роутере нет systemd
У вас чтото совсем не то написано
Вот это строчку:
tc class add dev $DEV parent 1: classid 1:1 htb rate 100Mbit prio 0
Удалять нельзя, это ROOT шейпера от которого нарезаются каналы
и wlan0 — это должен быть локальный интерфейс (WiFi)
Проверь лучше iperf-ом, у этих онлайн-измерителей свои приколы (яндекс как-то недавно заявлял, что скорость в районе 70, при том что подключение было через спутник и максимум, который можно было достичь — 2,6)
Пкетный фильтр FreeBSD ipfw и система ограничения пропускной способности dummynet были успешно портированы в Linux.
Установить IPFW на Linux и настройте PIPE
Теперь ограничение работает. СПАСИБО!
Ограничение скорости загрузки:
# tc qdisc add dev wlan0 root handle 1: htb default 1
# tc class add dev wlan0 parent 1: classid 1:1 htb rate 100Mbit prio 0
# tc class add dev wlan0 parent 1: classid 1:50 htb rate 512Kbit prio 5
# tc filter add dev wlan0 parent 1: protocol ip prio 1 u32 match ip dst 192.168.1.136 flowid 1:50
(для блокировки по MAC: tc filter add dev wlan0 parent 1: protocol ip prio 1 u32 match ether dst 6c:4e:36:68:a7:55 flowid 1:50)
# tc qdisc add dev wlan0 parent 1:50 sfq perturb 60
Ограничение скорости отдачи:
# tc qdisc add dev ifb0 root handle 1: htb default 1
# tc class add dev ifb0 parent 1: classid 1:1 htb rate 100Mbit prio 0
# tc class add dev ifb0 parent 1: classid 1:50 htb rate 512Kbit prio 5
# tc filter add dev ifb0 parent 1: protocol ip prio 1 u32 match ip src 192.168.1.136 flowid 1:50
(для блокировки по MAC: tc filter add dev ifb0 parent 1: protocol ip prio 1 u32 match ether src 6c:4e:36:68:a7:55 flowid 1:50)
# tc qdisc add dev ifb0 parent 1:50 sfq perturb 60
Поставить еще squid. У него есть все средства для борьбы с наглыми узерами. Даже ограничение количества сессий.
Пример ограничения скорости в предыдущем моем посте не работает. Вот рабочий пример:
tc qdisc add dev wlan0 handle ffff: ingress tc filter add dev wlan0 parent ffff: protocol ip prio 50 u32 match ether src 00:1B:77:40:99:E2 police rate 2Mbit burst 12k drop flowid :1
Источник