Bandwidth Limiting HOWTO

HOWTO по ограничению пропускной способности сети

Tomasz Chmielewski

[email protected]

Перевод на русский: (C) Иван Песин

Редакции документа:
Редакция 0.9 2001-11-20 Выполнена: tc

Этот документ описывает настройку Linux-сервера для ограничения пропускной способности (скорости) канала доступа в Internet. Кроме того, рассматриваются вопросы эффективного совместного использования доступа в Internet.


Содержание
1. Введение
1.1. Новые версии этого документа
1.2. Отказ от юридической ответственности
1.3. Авторское право и лицензия
1.4. Отзывы и исправления
1.5. Благодарности
2. Перед тем, как начать
2.1. Что нам нужно
2.2. Как это работает?
3. Установка и настройка необходимого программного обеспечения
3.1. Установка Squid с функцией пулов задержки
3.2. Настройка Squid с использованием пулов задержки
3.3. Решение оставшихся проблем
4. Применение CBQ для других протоколов
4.1. FTP
4.2. Napster, Realaudio, Windows Media и другие продукты
5. Часто задаваемые вопросы
5.1. Возможно ли с помощью пулов задержки ограничение скорости доступа на основании IP-адреса клиента?
5.2. Как заставить wget работать через Squid?
5.3. Я установил SOCKS-сервер на порту 1080 и теперь не могу подключаться к серверам IRC.
5.4. Мне не нравится, когда Kazaa и Audiogalaxy занимают весь мой канал.
5.5. При отправке почты мой почтовый сервер занимает весь канал.
5.6. Могу ли я способом, указанным в предыдущем примере, ограничить работу моих FTP и WWW серверов?
5.7. Возможно ли ограничить скорость доступа на основании IP-адреса клиента с помощью скрипта cbq.init?
5.8. При запуске cbq.init выдается сообщение об отсутствии sch_cbq.
5.9. Иногда CBQ не работает без видимой причины.
5.10. Пулы задержки меня не устраивают: почему я не могу загружать что-либо на полной скорости, если сеть использую только я сам?
5.11. Идущая загрузка файлов обрывается в 23:59 из-за строки "acl day time 09:00-23:59" в файле squid.conf. Можно ли что-то с этим сделать?
5.12. Протоколы (логи) Squid растут очень быстро, что делать?
5.13. CBQ меня не устраивает: почему я не могу загружать что-либо на полной скорости, если сеть использую только я сам??
6. Разное
6.1. Полезные ресурсы

1. Введение

Назначение этого руководства -- продемонстрировать способы ограничения входящего трафика, позволяющие более эффективно использовать разделяемый Internet-канал.

Это особенно полезно при медленном доступе к Internet или когда пользователи ЛВС загружают "тонны" mp3-файлов, образы новых дистрибутивов Linux и т.п.


1.1. Новые версии этого документа

Последнюю версию этого документа можно взять на сайте Linux Documentation Project (LDP) http://www.linuxdoc.org.


1.2. Отказ от юридической ответственности

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


1.3. Авторское право и лицензия

Авторское право на этот документ принадлежит Томашу Чмелевски (Tomasz Chmielewski), 2001. Публикуется в соответствии с лицензией GNU Free Documentation License, которая включена, как ссылка.


1.4. Отзывы и исправления

Если у Вас есть вопросы или комментарии к этому документу, присылайте их Томашу Чмелевски -- [email protected]. Я буду рад как советам, так и критике. Если Вы обнаружите в этом документе ошибку или опечатку (а Вы их найдете в большом количестве, так как английский -- не мой родной язык), дайте мне знать и я смогу исправить ее в следующей версии. Спасибо.


1.5. Благодарности

Я хотел бы поблагодарить Ами М. Эчеверри (Ami M. Echeverri) [email protected], помогшей мне преобразовать HOWTO в формат SGML и исправить некоторые ошибки. Так же хочу поблагодарить Ричарда Просовича (Ryszard Prosowicz) [email protected] за полезные советы.


2. Перед тем, как начать

Представим следующую ситуацию:

  • У нас есть модемный канал со скоростью 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


2.1. Что нам нужно

Верите или нет, но ограничение входящего трафика -- задача простая и Вам не нужно читать груду литературы по маршрутизации и алгоритмам очередей.

Для того, чтобы заработали ограничения, нам, как минимум, нужен прокси-сервер Squid; если же мы захотим все настроить достаточно тонко, то нам придется ознакомиться еще и с программами ipchains или iptables, и алгоритмом CBQ (Class-Based Queue - Прим. пер.).

В целях тестирования настроек, установим программу IPTraf.


2.2. Как это работает?

Наверное, 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 и других протоколов.


3. Установка и настройка необходимого программного обеспечения

Теперь я объясню, как установить программы, необходимые для ограничения и тестирования пропускной способности.


3.1. Установка Squid с функцией пулов задержки

Как я уже отмечал ранее, Squid имеет функцию, которая называется "пулы задержки". Она позволяет контролировать скорость загрузки данных. К сожалению, в большинстве дистрибутивов, Squid поставляется без этой функции (Это несколько устаревшая информация. Основные современные дистрибутивы поставляют Squid с включенной функцией пулов задержки. -- Прим.пер.).

Потому если Squid у вас уже установлен, то я буду вынужден вас разочаровать: его необходимо удалить. Мы установим его еще раз, но уже с включенной функцией пулов задержки. Ниже я объясню, как ее включить.

  1. Чтобы обеспечить максимальную производительность Squid, лучше выделить для кэша отдельный раздел дисковый раздел. Сам кэш будет размещаться в каталоге /cache/. Для этого необходимо около 300 МБайт, точный размер может меняться в зависимости от наших нужд.

    Если вы не знаете, как создавать отдельный раздел, можно разместить каталог /cache/ на главном разделе, но производительность Squid немного снизится.

  2. Создаем пользователя 'squid':

    # useradd -d /cache/ -r -s /dev/null squid >/dev/null 2>&1

    (Должен заметить, что на мой взгляд это очень плохая команда. Вы не сможете увидеть ни результат ее выполнения, ни сообщения об ошибках, если таковые случатся. Рекомендую использовать команду:
    # useradd -d /cache/ -r -s /dev/null squid
    -- Прим. пер.)

    Никто, даже root, не может войти в систему под пользователем squid.

  3. Загружаем исходные тексты 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 -- Прим.пер.)

  4. Разархивируем все в каталог /var/tmp:

  5. # tar xzpf squid-2.4.STABLE1-src.tar.gz

  6. Компилируем (с поддержкой пулов задержки. -- Прим.пер.) и устанавливаем 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


3.2. Настройка Squid для использования пулов задержки

  1. Настраиваем наш файл squid.conf (расположенный в каталоге /opt/squid/etc/squid.conf):

    #squid.conf
    #Каждый ключ в этом файле очень подробно описан в оригинальном
    #файле squid.conf
    #и по адресу http://www.visolve.com/squidman/Configuration%20Guide.html
    
    #
    #Порты, которые Squid будет "слушать".
    http_port 8080
    icp_port 3130
    #Файлы в каталогах cgi-bins кэшироваться не будут.
    acl QUERY urlpath_regex cgi-bin \?
    no_cache deny QUERY
    #Объем памяти, которую будет использовать Squid.
    #Хотя он будет использовать гораздо больше.
    # (Объем памяти, занимаемой Squid, рассчитывается по формуле:
    # cache_mem * 3 -- Прим. пер.).
    cache_mem 16 MB
    #250 означает, что Squid будет использовать
    #250 МБ дискового пространства.
    cache_dir ufs /cache 250 16 256
    
    #Место, где будут расположены файлы журналов.
    cache_log /var/log/squid/cache.log
    cache_access_log /var/log/squid/access.log
    cache_store_log /var/log/squid/store.log
    cache_swap_log /var/log/squid/swap.log
    #Сколько версий журналов оставлять до их удаления.
    #Обратитесь к ЧаВО за более подробной информацией.
    logfile_rotate 10
    
    redirect_rewrites_host_header off
    cache_replacement_policy GDSF
    acl localnet src 192.168.1.0/255.255.255.0
    acl localhost src 127.0.0.1/255.255.255.255
    acl Safe_ports port 80 443 210 119 70 20 21 1025-65535
    acl CONNECT method CONNECT
    acl all src 0.0.0.0/0.0.0.0
    http_access allow localnet
    http_access allow localhost
    http_access deny !Safe_ports
    http_access deny CONNECT
    http_access deny all
    maximum_object_size 3000 KB
    store_avg_object_size 50 KB
    
    #Эти установки нужны, если вы хотите работать в "прозрачном" режиме.
    #Прозрачный прокси-сервер означает, что Вам не придется его
    #настраивать в клиентских браузерах. В этом, однако, есть и свои минусы.
    #Если Вы просто оставите эти строки незакомментированными, то это ни 
    #на чем не отразится
    httpd_accel_host virtual
    httpd_accel_port 80
    httpd_accel_with_proxy on
    httpd_accel_uses_host_header on
     
    #Всем внешним серверам будет казаться, что наши локальные
    #пользователи используют браузер Mozilla, работающий на Linux. :)
    anonymize_headers deny User-Agent
    #Поместите все в одну строку:
    fake_user_agent Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6+) Gecko/20011122
     
    #Что бы сделать наше соединение еще быстрее, поместите сюда
    #две строки, аналогичные приведенной ниже. Они будут указывать
    #на родительский прокси-сервер для нашего Squid. Не забудьте изменить
    #адрес на тот, который ближе к Вам!
    #Для измерений используйте ping, traceroute и т.п.
    #Убедитесь, что порты http и icp указаны верно.
    
    #Раскомментируйте строки, начинающиеся с "cache_peer", если необходимо.
    #Это прокси-сервер, который Вы собираетесь использовать для всех запросов...
    #cache_peer w3cache.icm.edu.pl parent 8080 3130 no-digest default
    
    #...кроме запросов к адресам, начинающимся с "!".
    #Неплохая идея не использовать родительский прокси-сервер для:
    #cache_peer_domain w3cache.icm.edu.pl !.pl !7thguard.net !192.168.1.1
    
    #Это полезно, когда мы хотим использовать менеджер кэша.
    #Скопируйте cachemgr.cgi в каталог cgi-bin Вашего www-сервера.
    #Теперь к нему можно обратится через браузер, введя адрес
    #http://your-web-server/cgi-bin/cachemgr.cgi
    cache_mgr your@email
    cachemgr_passwd secret_password all
     
    #Это имя пользователя и группы, от которых работает Squid.
    cache_effective_user squid
    cache_effective_group squid
     
    log_icp_queries off
    buffered_logs on
     
     
    #####Пулы задержки
    #Эта часть, является самой важной для ограничения входящего
    #трафика при помощи Squid
    #Для более детального описания обратитесь к файлу squid.conf, или
    #к документации по адресу http://www.squid-cache.org
     
    #Мы не хотим ограничивать загрузки внутри нашей ЛВС.
    acl magic_words1 url_regex -i 192.168
     
    #Мы хотим ограничить загрузки файлов следующих типов
    #Поместите все в одну строку:
    acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .tar.gz .gz .rpm\
    .zip .rar .avi .mpeg .mpe .mpg .qt .ram .rm .iso .raw .wav .mov
    #Мы не блокируем .html, .gif, .jpg и аналогичные файлы, поскольку
    #обычно они не занимают значительной части полосы пропускания
    
    #Мы хотим ограничить скорость только днем и разрешить
    #полную скорость ночью
    #Внимание! acl приведенный ниже, скорее всего оборвет активные
    #загрузки в 23:59. Прочтите раздел FAQ этого документа, если
    #хотите этого избежать.
    acl day time 09:00-23:59
     
    #Определяем два пула задержки
    #Обратитесь к документации Squid по вопросам
    #с delay_pools и delay_class.
    delay_pools 2
     
    #Первый пул
    #Мы не хотим ограничивать локальный трафик.
    #Существует три класса пулов; мы же будем работать только со 
    #вторым. Первый пул (1) второго класса (2).
    delay_class 1 2
     
    #-1/-1 означает, что ограничений нет.
    delay_parameters 1 -1/-1 -1/-1
     
    #magic_words1: 192.168 мы определили раньше
    delay_access 1 allow magic_words1
     
    
    #Второй пул.
    #мы хотим ограничить скорость загрузки для файлов,
    #упомянутых в magic_words2.
    #Второй пул (2) второго класса (2).
    delay_class 2 2
     
    #Числа -- это значения в байтах;
    #нужно помнить, что Squid не предполагает наличия 
    #стартовых/стоповых битов
    #5000/150000 -- значения для всей сети
    #5000/120000 -- значения для одного IP-адреса
    #после загрузки 150 Кбайт,
    #(или даже в два или три раза большего количества)
    #скорость будет ограничена до 5000 байт в секунду.
     
    delay_parameters 2 5000/150000 5000/120000
    #Мы установили day в 09:00-23:59 выше.
    delay_access 2 allow day
    delay_access 2 deny !day
    delay_access 2 allow magic_words2
    
    #EOF
    

    После настройки нам нужно убедится, что владельцем каталогов /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).


3.3. Решение оставшихся проблем

Мы установили Squid и настроили его с использованием пулов задержки. Держу пари: никто не хочет быть занесен в пул задержки, особенно наши мудрые локальные пользователи. Наверняка они будут пробовать избежать ограничений для того, чтобы загрузить любимые mp3 чуть быстрее (причиняя тем самым головную боль вам).

Я полагаю, что вы используете IP-маскарад локальной сети так, что пользователи могут пользоваться IRC, ICQ, e-mail и т.п. Все правильно, нам нужно лишь убедится, что пользователи при работе с web-страницами и ftp-серверами будут использовать пулы задержки.

Эти проблему решает использование программы ipchains (ядра Linux 2.2.x) или iptables (ядра Linux 2.4.x).

Кроме решений, приведенных автором в разделе 3, существует другой вариант -- создание "недоверяющего" брандмауера -- Прим.пер.


3.3.1. Ядра Linux 2.2.x (ipchains)

Мы должны убедится, что никто не будет пытаться использовать "чужой" прокси-сервер. Прокси-сервера обычно работают по портам 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.


3.3.2. Ядра Linux 2.4.x (iptables)

Мы должны убедится, что никто не будет пытаться использовать "не наш" прокси-сервер. Прокси-сервера обычно работают по портам 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.

4. Применение CBQ для других протоколов

Не стоит забывать, что если наши локальные пользователи используют 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. В любом случае создайте этот каталог, создайте там файл по приведенному ниже образцу и посмотрите, будет ли он работать.


4.1. FTP

В главе 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
RATE=15Kbit
WEIGHT=1Kbit
PRIO=5
RULE=:20,192.168.1.0/24
RULE=:21,192.168.1.0/24

Описание смысла этих строк можно найти в файле 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.


4.2. Napster, Realaudio, Windows Media и другие продукты

Идея та же, что и для ftp: мы просто указываем другой порт и другую скорость.

Создаем в каталоге /etc/sysconfig/cbq/ файл cbq-50.napster-network:

# touch /etc/sysconfig/cbq/cbq-50.napsterandlive

Добавляем в него такие строки:

DEVICE=eth0,10Mbit,1Mbit
RATE=35Kbit
WEIGHT=3Kbit
PRIO=5
#Windows Media Player.
RULE=:1755,192.168.1.0/24
#Real Player использует TCP порт 554, для UDP он использует разные порты,
#однако, UDP трафик не очень велик.
RULE=:554,192.168.1.0/24
RULE=:7070,192.169.1.0/24
#Napster использует порты 6699 и 6700, может быть еще какие-то?
RULE=:6699,192.168.1.0/24
RULE=:6700,192.168.1.0/24
#Audiogalaxy использует порты от 41000 до 41900,
#Так как их очень много, повторение 900 строк, естественно бессмысленно.
#Мы просто запретим порты 410031-41900 при помощи ipchains или iptables.
RULE=:41000,192.168.1.0/24
RULE=:41001,192.168.1.0/24
#продолжаем от 41001 до 41030
RULE=:41030,192.168.1.0/24
#Умные пользователи могут попробовать работать через SOCKS-сервер
#Потому стоит ограничить 1080-ый порт
RULE=:1080,192.168.1.0/24
#Далее добавляйте необходимые Вам порты
#RULE=:port,192.168.1.0/24

Не забываем при помощи 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

Не забудьте добавить надлежащую строку в Ваши стартовые скрипты.


5. Часто задаваемые вопросы

5.1. Возможно ли с помощью пулов задержки ограничение скорости на основании адреса клиента?

Да. Посмотрите описания в файле squid.conf. Кроме того, обратитесь к документации по Squid на сайте http://www.squid-cache.org


5.2. Как заставить wget работать через Squid?

Просто. Создать файл .wgetrc и поместите его в Ваш домашний каталог. Вставьте в него следующие строки:

HTTP_PROXY=192.168.1.1:8080
FTP_PROXY=192.168.1.1:8080

Вот и все!

Если Вы хотите установить такие настройки глобально для всех пользователей, обратитесь к руководству программы (man wget).


5.3.Я установил SOCKS сервер на порту 1080 и теперь не могу подключиться к серверам IRC

Возможны две проблемы:

Первая: если Ваш SOCKS сервер общедоступен, т.е. то, что его может использовать кто угодно и с любой машины в мире. Это -- проблема безопасности и нужно проверить конфигурацию сервера. Обычно IRC-сервера не разрешают соединения от общедоступных SOCKS серверов.

Если Вы уверены, что Ваш SOCKS сервер не общедоступен, а некоторые IRC сервера продолжают отказывать в соединении, то это может быть вызвано тем, что они проверяют, запущен ли у клиента SOCKS сервер на порте 1080. В этом случае Вам придется перенастроить Ваш SOCKS сервер на другой порт. Кроме того, нужно будет перенастроить в ЛВС все программы, использовавшие SOCKS сервер.


5.4. Мне не нравится, когда Kazaa или Audiogalaxy занимают весь мой канал

Такое бывает неприятным, но этого легко избежать.

Создадим файл, например /etc/sysconfig/cbq/cbq-15.ppp.

Вставим в него следующие строки, и Kazaa с Audiogalaxy будут загружать файлы не быстрее 15 кбит/с. Я полагаю, что внешний интерфейс -- это ppp0.

DEVICE=ppp0,115Kbit,11Kbit
RATE=15Kbit
WEIGHT=2Kbit
PRIO=5
TIME=01:00-07:59;110Kbit/11Kbit
RULE=,:21
RULE=,213.25.25.101
RULE=,:1214
RULE=,:41000
RULE=,:41001
#И так до 41030
RULE=,:41030

5.5. При отправке почты мой почтовый сервер занимает весь канал.

Вы можете ограничить Ваш SMTP-сервер (Postfix, Sendmail или другой) путем, аналогичным приведенному выше. Просто добавьте правило:

RULE=,:25

Более того, если у Вас есть SMTP-сервер, то можно заставить локальных пользователей использовать его, даже если они указали другой внешний сервер. Это организовывается таким же "прозрачным" способом, что и принудительная работа через Squid.


5.6. Могу ли я способом, указанным в предыдущем примере, ограничить работу моих FTP и WWW серверов?

В общем это возможно, однако обычно такие сервера имеют свои собственные функции ограничения скорости. Потому перед тем, как организовывать такое ограничение, стоит проконсультироваться с документацией.

Ядра 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

Не забудьте добавить в ваши стартовые скрипты надлежащую строку.


5.7. Возможно ли с помощью скрипта cbq.init ограничить скорость доступа на основании IP-≈адреса клиента?

Да. Посмотрите в скрипте cbq.init; там приведены примеры.


5.8. При запуске cbq.init выдается сообщение об отсутствии sch_cbq.

Вероятно, модуль CBQ отсутствует в Вашей системе. Если он статически "вкомпилирован" в ядро, закомментируйте следующие строки в скрипте cbq.init-v0.6.2

### Если cbq, tbf и u32 непосредственно "вкомпилированны" в ядро, то
### следующие строки надо закоментировать
#for module in sch_cbq sch_tbf sch_sfq sch_prio cls_u32; do
#        if ! modprobe $module; then
#               echo "**CBQ: could not load module $module"
#               exit
#        fi
#done

5.9. Иногда CBQ не работает без видимой причины.

Вообще говоря, такое происходить не должно. Иногда можно наблюдать большой трафик, хотя вы думаете, что заблокировали все порты, используемые Napster и Audiogalaxy. Однако для загрузки всегда найдется хоть один порт. Чтобы обнаружить его, используйте IPTraf. Поскольку таких портов может быть тысячи, это может оказаться сложной задачей. Для ее упрощения, Вы можете использовать свой SOCKS сервер -- Napster, Audiogalaxy и многие другие программы умеют работать с SOCKS прокси-серверами. А управлять одним портом намного проще, чем тысячами (стандартный SOCKS сервер использует порт 1080, но, если Вы установите свой SOCKS сервер, можно будет его изменить. Кроме того, можно запустить несколько экземпляров SOCKS, которые будут работать по разным портам). Не забудьте только закрыть все порты, оставив лишь те, которые действительно необходимы, такие как 25 и 110 (SMTP и POP3). Ссылку на Nylon socks сервер Вы найдете в конце этого HOWTO.


5.10.Пулы задержки меня не устраивают: почему я не могу загружать что-либо на полной скорости, если сеть использую только я сам?

К сожалению, с этим ничего нельзя сделать.

Единственное, что вы можете сделать -- использовать демон cron для автоматической перенастройки, например в 1.00 отключать пулы задержки в Squid, а в 7.30 подключать их обратно.

Для того, чтобы организовать это, создайте в каталоге /opt/squid/etc/ два файла: squid.conf-day и squid.conf-night.

squid.conf-day -- это точная копия конфигурационного файла, который мы создали ранее.

squid.conf-night -- настройка, не содержащая пулов задержки.

Теперь отредактируем файл /etc/crontab и добавим в него такие строки:

#SQUID - изменение конфигурации -- день/ночь
#Следующие строки пришлось разбить из-за их длины.
#В реальной конфигурации это должна быть одна строка
#Прим. ред.
01 9 * * * root /bin/cp -f /opt/squid/etc/squid.conf-day\
/opt/squid/etc/squid.conf; /opt/squid/bin/squid -k reconfigure

59 23 * * * root /bin/cp -f /opt/squid/etc/squid.conf-night\
/opt/squid/etc/squid.conf; /opt/squid/bin/squid -k reconfigure

5.11. Идущая загрузка файлов обрывается в 23:59 из-за строки "acl day time 09:00-23:59" в файле squid.conf. Можно ли что-то с этим сделать?

Этого можно избежать убрав из squid.conf соответствующий acl и строки "delay_access 2 allow day delay_access 2 deny !day".

После чего используйте методику из предыдущего пункта.


5.12. Протоколы (логи) Squid растут очень быстро, что делать?

Конечно, чем больше у вас пользователей, тем больше -- иногда очень полезной -- информации протоколируется.

Лучшим способом борьбы с разрастанием файлов журналов является logrotate, но чтобы он заработал со Squid, вам придется сделать один трюк,: добавить соответствующие строки в конфигурацию cron и logrotate.

Строку в /etc/crontab:

#SQUID - logrotate
#Следующую строку пришлось разбить из-за её длины.
#В реальной конфигурации это должна быть одна строка
#Прим. ред.
01 4 * * * root /opt/squid/bin/squid -k rotate; /usr/sbin/logrotate\
/etc/logrotate.conf; /bin/rm -f /var/log/squid/*.log.0

Мы запускаем logrotate ежедневно в 04:01, поэтому уберите остальные строки запуска logrotate, например из /etc/cron.daily/.

Строки в /etc/logrotate.d/syslog:

#SQUID logrotate - храним логи 40 дней
/var/log/squid/*.log.0 {
rotate 40
compress
daily
postrotate
/usr/bin/killall -HUP syslogd
endscript
}

5.13. CBQ меня не устраивает: почему я не могу загружать что-либо на полной скорости, если сеть использую только я сам?

Это возможно!

Есть два способа.

Первый (простой) похож на решение, которое мы применили к 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 имеет расширенные возможности по управлению трафиком. За детальным описанием обращайтесь к скрипту. -- Прим.пер.


6. Разное

6.1. Полезные ресурсы

Кэширующий прокси-сервер Squid

http://www.squid-cache.org

Руководство по настройке 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

Управление трафиком (на польском)

http://ceti.pl/~kravietz/cbq/

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) [email protected]

http://raf.unisba.ac.id/resources/BandwidthLimitingHOWTO/index.html


Вернуться на главную страницу