| |
Пользовательский логинРеклама: |
Bandwidth Limiting HOWTOHOWTO по ограничению пропускной способности сетиTomasz Chmielewski
|
|||||||||||||||||||||
| Редакции документа: | ||
|---|---|---|
| Редакция 0.9 | 2001-11-20 | Выполнена: tc |
Этот документ описывает настройку Linux-сервера для ограничения пропускной способности (скорости) канала доступа в Internet. Кроме того, рассматриваются вопросы эффективного совместного использования доступа в Internet.
Назначение этого руководства -- продемонстрировать способы ограничения входящего трафика, позволяющие более эффективно использовать разделяемый Internet-канал.
Это особенно полезно при медленном доступе к Internet или когда пользователи ЛВС загружают "тонны" mp3-файлов, образы новых дистрибутивов Linux и т.п.
Последнюю версию этого документа можно взять на сайте Linux Documentation Project (LDP) http://www.linuxdoc.org.
Ни автор, ни лица, так или иначе распространяющие этот HOWTO, не несут никакой ответственности за физические, финансовые, моральные или какие-либо другие убытки, нанесенные в результате использования советов и рекомендаций, приведенных в этом документе.
Авторское право на этот документ принадлежит Томашу Чмелевски (Tomasz Chmielewski), 2001. Публикуется в соответствии с лицензией GNU Free Documentation License, которая включена, как ссылка.
Если у Вас есть вопросы или комментарии к этому документу, присылайте их Томашу Чмелевски -- tch@metalab.unc.edu. Я буду рад как советам, так и критике. Если Вы обнаружите в этом документе ошибку или опечатку (а Вы их найдете в большом количестве, так как английский -- не мой родной язык), дайте мне знать и я смогу исправить ее в следующей версии. Спасибо.
Я хотел бы поблагодарить Ами М. Эчеверри (Ami M. Echeverri) lula@pollywog.com, помогшей мне преобразовать HOWTO в формат SGML и исправить некоторые ошибки. Так же хочу поблагодарить Ричарда Просовича (Ryszard Prosowicz) prosowicz@poczta.fm за полезные советы.
Представим следующую ситуацию:
У нас есть модемный канал со скоростью 115,2 кбит/с (115,2/10 = 11,5 кбайт/с). Примечание: при соединении сетевых карт (ethernet) мы должны были бы разделить 115,2 на 8; при модемном соединении (рpp), мы делим на 10 из-за стартового и стопового битов (8 + 1 + 1 = 10).
У нас имеется несколько машин в локальной сети, пользователи которых постоянно загружают из Internet большие файлы.
Мы хотим, чтобы web-страницы открывались быстро вне зависимости от числа загружаемых файлов.
Наш Internet интерфейс -- ppp0.
Наш локальный сетевой интерфейс -- eth0.
Адрес нашей ЛВС - 192.168.1.0/24
Верите или нет, но ограничение входящего трафика -- задача простая и Вам не нужно читать груду литературы по маршрутизации и алгоритмам очередей.
Для того, чтобы заработали ограничения, нам, как минимум, нужен прокси-сервер Squid; если же мы захотим все настроить достаточно тонко, то нам придется ознакомиться еще и с программами ipchains или iptables, и алгоритмом CBQ (Class-Based Queue - Прим. пер.).
В целях тестирования настроек, установим программу IPTraf.
Наверное, Squid -- самый мощный HTTP прокси-сервер, доступный для платформы Linux. Он может помочь нам сохранить пропускную способность нашего канала благодаря двум своим функциям:
Первая функция, которая является основной характеристикой прокси-серверов -- сохранение загруженных web-страниц, картинок и других объектов в памяти и на диске. Так, если два человека обратятся к одной и той же странице, она не будет повторно загружена из Internet, а будет восстановлена из локального кэша.
Кроме обычного кэширования, Squid обладает возможностью, которая называется "пулами задержки" (delay pools). Благодаря этим пулам становится возможным ограничивать трафик при помощи так называемых "магических слов", которые присутствуют в URL. Например, магическим словом может быть '.mp3', '.exe' или '.avi'. Любая отличительная часть URL (такая как .avi) может быть определена как магическое слово. (Безусловно, это не единственный критерий, по которому можно ограничить трафик. -- Прим.пер.)
Пользуясь Squid, мы можем настроить его таким образом, что загрузка файлов определенного типа будет происходить на указанной скорости (в нашем примере это будет около 5 кбайт/c). Если даже несколько наших локальных пользователей будут выкачивать файлы одновременно, то все равно на них всех будет выделено 5 кбайт/c, а остальная пропускная способность будет использоваться для просмотра web-страниц, почты, новостей, irc, и т.п.
Конечно, Internet используется не только для загрузки файлов по протоколам http и ftp. Позже мы рассмотрим вопрос об ограничении трафика для Napster, Realaudio и других протоколов.
Теперь я объясню, как установить программы, необходимые для ограничения и тестирования пропускной способности.
Как я уже отмечал ранее, Squid имеет функцию, которая называется "пулы задержки". Она позволяет контролировать скорость загрузки данных. К сожалению, в большинстве дистрибутивов, Squid поставляется без этой функции (Это несколько устаревшая информация. Основные современные дистрибутивы поставляют Squid с включенной функцией пулов задержки. -- Прим.пер.).
Потому если Squid у вас уже установлен, то я буду вынужден вас разочаровать: его необходимо удалить. Мы установим его еще раз, но уже с включенной функцией пулов задержки. Ниже я объясню, как ее включить.
Чтобы обеспечить максимальную производительность Squid, лучше выделить для кэша отдельный раздел дисковый раздел. Сам кэш будет размещаться в каталоге /cache/. Для этого необходимо около 300 МБайт, точный размер может меняться в зависимости от наших нужд.
Если вы не знаете, как создавать отдельный раздел, можно разместить каталог /cache/ на главном разделе, но производительность Squid немного снизится.
Создаем пользователя 'squid':
# useradd -d /cache/ -r -s /dev/null squid >/dev/null 2>&1
(Должен заметить, что на мой взгляд это очень плохая команда. Вы не сможете увидеть ни результат ее выполнения, ни сообщения об ошибках, если таковые случатся. Рекомендую использовать команду:
# useradd -d /cache/ -r -s /dev/null squid
-- Прим. пер.)
Никто, даже root, не может войти в систему под пользователем squid.
Загружаем исходные тексты Squid с сервера http://www.squid-cache.org
Когда я писал этот документ, последней версией был Squid 2.4 stable 1:
http://www.squid-cache.org/Versions/v2/2.4/squid-2.4.STABLE1-src.tar.gz
(на данный момент, последней версией является Squid 2.5.STABLE1 -- Прим.пер.)
Разархивируем все в каталог /var/tmp:
# tar xzpf squid-2.4.STABLE1-src.tar.gz
Компилируем (с поддержкой пулов задержки. -- Прим.пер.) и устанавливаем Squid:
<# ./configure --prefix=/opt/squid --exec-prefix=/opt/squid --enable-delay-pools --enable-cache-digests --enable-poll --disable-ident-lookups --enable-truncate --enable-removal-policies
# make all
# make install
Настраиваем наш файл squid.conf (расположенный в каталоге /opt/squid/etc/squid.conf):
#squid.conf |
После настройки нам нужно убедится, что владельцем каталогов /opt/squid и /cache вместе с их содержимым является пользователь squid.
# mkdir /var/log/squid/
# chown squid:squid /var/log/squid/
# chmod 770 /var/log/squid/
# chown -R squid:squid /opt/squid/
# chown -R squid:squid /cache/
Теперь все готово к запуску Squid. Перед первым запуском нам необходимо создать каталоги кэша:
# /opt/squid/bin/squid -z
Теперь запускаем Squid и проверяем, все ли работает. Хорошая утилита для проверки - IPTraf; ее можно найти по адресу http://freshmeat.net. Убедитесь, что Вы установили верные значения для прокси-сервера в Вашем браузере (в нашем примере - 192.168.1.1, порт 8080):
# /opt/squid/bin/squid
Если все работает, добавляем строку /opt/squid/bin/squid в конец наших стартовых скриптов. Обычно это файл /etc/rc.d/rc.local.
Другие полезные ключи Squid:
# /opt/squid/bin/squid -k reconfigure (переконфигурирует Squid если в его файл настроек были внесены изменения)
# /opt/squid/bin/squid -help :) очевидно
Можете также скопировать файл cachemgr.cgi в каталог cgi-bin Вашего WWW-сервера, чтобы иметь возможность работать с менеджером кэша (Cache Manager).
Мы установили Squid и настроили его с использованием пулов задержки. Держу пари: никто не хочет быть занесен в пул задержки, особенно наши мудрые локальные пользователи. Наверняка они будут пробовать избежать ограничений для того, чтобы загрузить любимые mp3 чуть быстрее (причиняя тем самым головную боль вам).
Я полагаю, что вы используете IP-маскарад локальной сети так, что пользователи могут пользоваться IRC, ICQ, e-mail и т.п. Все правильно, нам нужно лишь убедится, что пользователи при работе с web-страницами и ftp-серверами будут использовать пулы задержки.
Эти проблему решает использование программы ipchains (ядра Linux 2.2.x) или iptables (ядра Linux 2.4.x).
Кроме решений, приведенных автором в разделе 3, существует другой вариант -- создание "недоверяющего" брандмауера -- Прим.пер.
Мы должны убедится, что никто не будет пытаться использовать "чужой" прокси-сервер. Прокси-сервера обычно работают по портам 3128 и 8080:
/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 3128 -p TCP -j REJECT
/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 8080 -p TCP -j REJECT
Также мы должны убедиться, что никто не получит прямой доступ в Internet (IP-маскарад) :
/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 80 -p TCP -j REDIRECT 8080
Если все работает, то добавляем указанные строки в конец стартовых скриптов. Обычно это файл /etc/rc.d/rc.local.
Может появиться мысль заблокировать ftp-трафик (порты 20 и 21), чтобы пользователи работали через Squid, но это плохая идея (по крайней мере по двум причинам):
Squid -- это http-прокси с поддержкой ftp, а не настоящий ftp прокси-сервер. Он умеет загружать файлы по ftp, он также может загружать файлы на некоторые ftp-сервера, но он не может удалить/переименовать файлы на удаленном ftp-сервере.
Если мы блокируем порты 20 и 21, мы теряем возможность удаления/переименования файлов на ftp-серверах.
В IE5.5 есть ошибка -- он не использует proxy-сервер для получения каталога ftp. Вместо этого он подключается напрямую при помощи IP-маскарада.
Когда мы блокируем порты 20 и 21, мы теряем возможность просматривать ftp-сервера при помощи IE5.5.
Потому мы будем ограничивать загрузки с ftp-серверов другими методами. С ними мы познакомимся в главе 4.
Мы должны убедится, что никто не будет пытаться использовать "не наш" прокси-сервер. Прокси-сервера обычно работают по портам 3128 и 8080:
/sbin/iptables -A FORWARD -s 192.168.1.1/24 -d ! 192.168.1.1 --dport 3128 -p TCP -j DROP
/sbin/iptables -A FORWARD -s 192.168.1.1/24 -d ! 192.168.1.1 --dport 8080 -p TCP -j DROP
Также мы должны быть уверены, что никто не будет иметь прямой доступ в Internet (IP-маскарад):
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Если все работает, то добавляем указанные строки в конец стартовых скриптов. Обычно, это файл /etc/rc.d/rc.local.
Может появиться мысль заблокировать ftp-трафик (порты 20 и 21), чтобы пользователи работали через Squid, но это плохая идея (по крайней мере по двум причинам):
Squid -- это http-прокси с поддержкой ftp, а не настоящий ftp прокси-сервер. Он умеет загружать файлы с ftp, он также может загружать файлы на некоторые ftp-сервера, но он не может удалить/переименовать файлы на удаленном ftp-сервере.
Когда мы блокируем порты 20 и 21, мы теряем возможность удаления/переименования файлов на ftp-серверах.
В IE5.5 есть ошибка -- он не использует proxy-сервер для получения каталога ftp. Вместо этого он подключается напрямую при помощи IP-маскарада.
Когда мы блокируем порты 20 и 21, мы теряем возможность просматривать ftp-сервера при помощи IE5.5.
Потому мы будем ограничивать загрузки с ftp-серверов другими методами. С ними мы познакомимся в главе 4.
Не стоит забывать, что если наши локальные пользователи используют Napster, Kazaa или Realaudio, то они могут свести достижения главы 3 на нет. Кроме того, как Вы помните, в разделе 3.3 мы не блокировали ftp-трафик.
Мы решим эту проблему другим способом -- не прямым, а скорее непрямым ограничением скорости. Если наш Internet интерфейс это ppp0, а интерфейс локальной сети -- eth0, мы ограничим исходящий трафик на интерфейсе eth0, тем самым, ограничив входящий трафик на интерфейсе ppp0.
Чтобы сделать это, познакомимся с CBQ и скриптом cbq.init. Его можно получить по адресу ftp://ftp.equinox.gu.net/pub/linux/cbq/. Загрузите cbq.init-v0.6.2 и скопируйте его в каталог /etc/rc.d/.
Последней версией скрипта cbq.init является 0.7.1 - Прим.пер.
Теперь вам потребуется пакет iproute2. Он поставляется с каждым дистрибутивом Linux.
Посмотрите в каталог /etc/sysconfig/cbq/. Там должен находится файл с примером, предназначенным для работы с cbq.init. Если его там нет, то вероятно, что ваше ядро скомпилировано без поддержки CBQ. В любом случае создайте этот каталог, создайте там файл по приведенному ниже образцу и посмотрите, будет ли он работать.
В главе 3 мы не блокировали ftp-трафик по двум причинам -- мы не смогли бы выполнять загрузку файлов на ftp-сервера, а пользователи IE5.5 вообще не смогли бы просматривать ftp-каталоги. В общем, браузеры и ftp-клиенты должны выполнять загрузку через наш Squid сервер, а загрузку/переименование/удаление файлов на ftp должно выполнятся через IP-маскарад.
Создадим файл в каталоге /etc/sysconfig/cbq/cbq-10.ftp-network:
# touch /etc/sysconfig/cbq/cbq-10.ftp-network
Вставим в него такие строки:
DEVICE=eth0,10Mbit,1Mbit |
Описание смысла этих строк можно найти в файле cbq.init-v0.6.2.
При запуске скрипт /etc/rc.d/cbq.init-v0.6.2 читает конфигурацию, находящуюся в каталоге /etc/sysconfig/cbq/:
# /etc/rc.d/cbq.init-v0.6.2 start
Если все работает, добавим строку /etc/rc.d/cbq.init-v0.6.2 start в конец стартовых скриптов. Обычно, это файл /etc/rc.d/rc.local.
Благодаря этой команде Ваш сервер не будет пересылать ftp-данные через eth0 быстрее, чем 15 кбит/с, а потому и загружать ftp-данные из Internet быстрее, чем 15 кбит/с. Локальные пользователи убедятся, что использовать для закачек прокси-сервер эффективнее. В тоже время пользователи IE5.5 сохранят возможность просматривать ftp-каталоги.
В IE5.5 есть и другая ошибка -- когда Вы кликнете правой клавишей мышки на файле в ftp-каталоге, а потом выбираете 'Копировать в папку', то файл загружается не через прокси-сервер, а напрямую, и потому он не попадает в пулы задержки Squid.
Идея та же, что и для ftp: мы просто указываем другой порт и другую скорость.
Создаем в каталоге /etc/sysconfig/cbq/ файл cbq-50.napster-network:
# touch /etc/sysconfig/cbq/cbq-50.napsterandlive
Добавляем в него такие строки:
DEVICE=eth0,10Mbit,1Mbit |
Не забываем при помощи ipchains (ядра 2.2.x) или iptables (ядра 2.4.x) запретить оставшиеся порты Audiogalaxy (41031-41900).
Ядра 2.2.x.
/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 41031:41900 -p TCP -j REJECT
Ядра 2.4.x.
/sbin/iptables -A FORWARD -s 192.168.1.1/24 -d ! 192.168.1.1 --dport 41031:41900 -p TCP -j REJECT
Не забудьте добавить надлежащую строку в Ваши стартовые скрипты.
Да. Посмотрите описания в файле squid.conf. Кроме того, обратитесь к документации по Squid на сайте http://www.squid-cache.org
Просто. Создать файл .wgetrc и поместите его в Ваш домашний каталог. Вставьте в него следующие строки:
HTTP_PROXY=192.168.1.1:8080 |
Вот и все!
Если Вы хотите установить такие настройки глобально для всех пользователей, обратитесь к руководству программы (man wget).
Возможны две проблемы:
Первая: если Ваш SOCKS сервер общедоступен, т.е. то, что его может использовать кто угодно и с любой машины в мире. Это -- проблема безопасности и нужно проверить конфигурацию сервера. Обычно IRC-сервера не разрешают соединения от общедоступных SOCKS серверов.
Если Вы уверены, что Ваш SOCKS сервер не общедоступен, а некоторые IRC сервера продолжают отказывать в соединении, то это может быть вызвано тем, что они проверяют, запущен ли у клиента SOCKS сервер на порте 1080. В этом случае Вам придется перенастроить Ваш SOCKS сервер на другой порт. Кроме того, нужно будет перенастроить в ЛВС все программы, использовавшие SOCKS сервер.
Такое бывает неприятным, но этого легко избежать.
Создадим файл, например /etc/sysconfig/cbq/cbq-15.ppp.
Вставим в него следующие строки, и Kazaa с Audiogalaxy будут загружать файлы не быстрее 15 кбит/с. Я полагаю, что внешний интерфейс -- это ppp0.
DEVICE=ppp0,115Kbit,11Kbit |
Вы можете ограничить Ваш SMTP-сервер (Postfix, Sendmail или другой) путем, аналогичным приведенному выше. Просто добавьте правило:
RULE=,:25 |
Более того, если у Вас есть SMTP-сервер, то можно заставить локальных пользователей использовать его, даже если они указали другой внешний сервер. Это организовывается таким же "прозрачным" способом, что и принудительная работа через Squid.
В общем это возможно, однако обычно такие сервера имеют свои собственные функции ограничения скорости. Потому перед тем, как организовывать такое ограничение, стоит проконсультироваться с документацией.
Ядра 2.2.x
/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 25 -p TCP -j REDIRECT 25
Ядра 2.4.x
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 25
Не забудьте добавить в ваши стартовые скрипты надлежащую строку.
Да. Посмотрите в скрипте cbq.init; там приведены примеры.
Вероятно, модуль CBQ отсутствует в Вашей системе. Если он статически "вкомпилирован" в ядро, закомментируйте следующие строки в скрипте cbq.init-v0.6.2
### Если cbq, tbf и u32 непосредственно "вкомпилированны" в ядро, то |
Вообще говоря, такое происходить не должно. Иногда можно наблюдать большой трафик, хотя вы думаете, что заблокировали все порты, используемые Napster и Audiogalaxy. Однако для загрузки всегда найдется хоть один порт. Чтобы обнаружить его, используйте IPTraf. Поскольку таких портов может быть тысячи, это может оказаться сложной задачей. Для ее упрощения, Вы можете использовать свой SOCKS сервер -- Napster, Audiogalaxy и многие другие программы умеют работать с SOCKS прокси-серверами. А управлять одним портом намного проще, чем тысячами (стандартный SOCKS сервер использует порт 1080, но, если Вы установите свой SOCKS сервер, можно будет его изменить. Кроме того, можно запустить несколько экземпляров SOCKS, которые будут работать по разным портам). Не забудьте только закрыть все порты, оставив лишь те, которые действительно необходимы, такие как 25 и 110 (SMTP и POP3). Ссылку на Nylon socks сервер Вы найдете в конце этого HOWTO.
К сожалению, с этим ничего нельзя сделать.
Единственное, что вы можете сделать -- использовать демон cron для автоматической перенастройки, например в 1.00 отключать пулы задержки в Squid, а в 7.30 подключать их обратно.
Для того, чтобы организовать это, создайте в каталоге /opt/squid/etc/ два файла: squid.conf-day и squid.conf-night.
squid.conf-day -- это точная копия конфигурационного файла, который мы создали ранее.
squid.conf-night -- настройка, не содержащая пулов задержки.
Теперь отредактируем файл /etc/crontab и добавим в него такие строки:
#SQUID - изменение конфигурации -- день/ночь |
Этого можно избежать убрав из squid.conf соответствующий acl и строки "delay_access 2 allow day delay_access 2 deny !day".
После чего используйте методику из предыдущего пункта.
Конечно, чем больше у вас пользователей, тем больше -- иногда очень полезной -- информации протоколируется.
Лучшим способом борьбы с разрастанием файлов журналов является logrotate, но чтобы он заработал со Squid, вам придется сделать один трюк,: добавить соответствующие строки в конфигурацию cron и logrotate.
Строку в /etc/crontab:
#SQUID - logrotate |
Мы запускаем logrotate ежедневно в 04:01, поэтому уберите остальные строки запуска logrotate, например из /etc/cron.daily/.
Строки в /etc/logrotate.d/syslog:
#SQUID logrotate - храним логи 40 дней |
Это возможно!
Есть два способа.
Первый (простой) похож на решение, которое мы применили к Squid. Вставьте строку аналогичную приведенной в нужный файл конфигурации CBQ /etc/sysconfig/cbq/:
TIME=00:00-07:59;110Kbit/11Kbit |
В файле настройки CBQ можно задавать несколько параметров TIME.
Будьте осторожны, в скрипте cbq.init-v0.6.2 есть ошибка (в новой версии скрипта она уже исправлена - Прим. пер.) -- она не позволяет устанавливать некоторые временные промежутки, например 00:00-08:00! Что бы проверить все ли работает нормально, запустите cbq.init-v0.6.2, а после введите:
/etc/rc.d/cbq.init-v0.6.2 timecheck
Ниже показано, как должен выглядеть вывод команды:
>[root@mangoo rc.d]# ./cbq.init start; ./cbq.init timecheck
>**CBQ: 3:44: class 10 on eth0 changed rate (20Kbit -> 110Kbit)
**CBQ: 3:44: class 40 on ppp0 changed rate (15Kbit -> 110Kbit)
**CBQ: 3:44: class 50 on eth0 changed rate (35Kbit -> 110Kbit)
А вот пример настройки с ошибкой, вероятнее, всего во втором файле в каталоге /etc/sysconfig/cbq/; второй файл, если считать с наименьшего номера в имени:
[root@mangoo rc.d]# ./cbq.init start; ./cbq.init timecheck
**CBQ: 3:54: class 10 on eth0 changed rate (20Kbit -> 110Kbit)
./cbq.init: 08: value too great for base (error token is "08")
Другой способ заставить CBQ быть более умным сложнее, он не зависит от времени. Об этом можно прочесть в Linux 2.4 Advanced Routing HOWTO, и поиграть с командой tc.
Новая версия скрипта cbq.init имеет расширенные возможности по управлению трафиком. За детальным описанием обращайтесь к скрипту. -- Прим.пер.
Кэширующий прокси-сервер Squid
Руководство по настройке Squid 2.4 Stable 1
http://www.visolve.com/squidman/Configuration%20Guide.html
http://www.visolve.com/squidman/Delaypool%20parameters.htm
Часто задаваемые вопросы по Squid
http://www.squid-cache.org/Doc/FAQ/FAQ-19.html#ss19.8
Скрипт cbq-init
ftp://ftp.equinox.gu.net/pub/linux/cbq/
Linux 2.4 Advanced Routing HOWTO
(готовится к переводу. - Прим. пер.)
http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO.html
Управление трафиком (на польском)
Securing and Optimizing Linux Red Hat Edition - A Hands on Guide
http://www.linuxdoc.org/guides.html
IPTraf
http://cebu.mozcom.com/riker/iptraf/
IPCHAINS
http://www.linuxdoc.org/HOWTO/IPCHAINS-HOWTO.html
socks прокси-сервер Nylon
http://mesh.eecs.umich.edu/projects/nylon/
Индонезийский перевод этого HOWTO от Рахмата Рафюдина (Rahmat Rafiudin) mjl_id@yahoo.com
http://raf.unisba.ac.id/resources/BandwidthLimitingHOWTO/index.html
===========================
http://security.opennet.ru/docs/RUS/traf_limit/