FTP сервер сначала «для себя любимого», а уж потом – для всех…

FTP сервер я себе настроил. Давно уже. И описал настройку в заметке FTP – для всех и «для себя любимого». И до поры до времени было все нормально (если конечно не считать попыток авторизации под левыми паролями, с которыми я потом разобрался). Но через время гугл проиндексировал все содержимое моего сервера, и начал народ качать что ни попадя. Причем, со временем этот процесс стал гораздо интенсивнее, чем мне хотелось бы, да таким, что приходилось мне по нескольку минут ждать, пока браузер наконец-то страницу откроет. И возникло у меня страстное желание вернуть себе свой интернет, а говоря простыми словами — ограничить скорость раздачи с FTP-сервера. Тем более, что качали в основном с Китая и практически один единственный драйвер…

По быстрому нагуглил новость, что

…в ProFTPD 1.3.3 … появились такие новые модули, как … mod_shaper для разграничения скорости загрузки/скачивания по сессиям.

Появились, так появились.  Будем использовать. Проверка показала, что модуль mod_shaper для ProFTP в репозиториях Mandriva присутствует, но устанавливается отдельно от самого сервера, и в моем конкретном случае еще не установлен. Значит, нужно установить. Как показало дальнейшее, мне нужно было установить и еще один модуль, который возможно и вам окажется полезным.

Итак, в консоли от имени root-а вводим команду:

urpmi proftpd-mod_shaper proftpd-mod_ifsession

Будут установлены два модуля — собственно сам mod_shaper, а также mod_ifsession, о назначении которого  я скажу позже.

Чтобы задействовать шейпер, в начале файла конфигурации ProFTP /etc/proftpd.conf  (в той его части, где перечисляются настройки использованных модулей) я добавил следующие строки:

<IfModule mod_shaper.c>
    ShaperEngine on
    ShaperAll downrate 50 uprate 100
</IfModule>

Собственно, настроек использовано «аж две»:

  • Строка «ShaperEngine on» включает шейпер;
  • А строка «ShaperAll downrate 50 uprate 100» указывает (в килобайтах/сек.) лимит скорости с которой пользователи будут скачивать (downrate) файлы с сервера, и загружать (uprate) файлы на сервер.

Вот и все настройки, потребовавшиеся в моем случае. Перезапускаем сервер и радуемся. На самом деле, это далеко не полный список параметров, которые можно указать и использовать при настройке шейпера. Полный их список приведен на страницах документации на сайте разработчика и сайте сервера ProFTP (фактически, страницы абсолютно одинаковые).

Может возникнуть вопрос — а почему я не использовал директиву «TransferRate». Гугление по данному вопросу (еще на этапе поиска решения) показало, что эта директива ограничивает скорость для одной сессии. Таким образом, если лимит равен 10, то исходящий трафик будет равен столько раз по 10, сколько сессий загрузки выполняется в данный момент. И трафик будет меняться в зависимости от числа анонимов, качающих с моего сервера. А вот в случае использования шейпера все будет в точности да наоборот — если указал я лимит в 10, он будет поделен на текущее число сессий. Таким образом, именно шейпер позволил мне простым и понятным способом указать ту скорость, которую я готов «пожертвовать» анонимным посетителям моего сервера вне зависимости от их числа…

Но есть в этом способе еще один нюанс, который лично мне показался очень даже полезным. Речь идет о возможности менять настройку шейпера одной единственной командой:

ftpdctl shaper all downrate 40 uprate 100

А это в свою очередь позволяет прописать в cron пару таких команд (с разными значениями лимитов), и таким образом автоматически менять «дневной» и «ночной» лимиты трафика.

Ну и напоследок — а как же быть с собой «любимым»? Неужто тоже в очередь на свой сервер записываться? И качать «в час по чайной ложке»? Негоже это!  Модуль шейпера позволяет несколькими способами «поправить» свои привилегии, но мне лично понравился такой — указать пользователя (или пользователей), для которых модуль шейпера отключается совсем. Именно для такой возможности и нужно было установить тот второй модуль, о котором я упоминал в начале заметки (mod_ifsession).

Чтобы указать пользователей, которым шейпер — не указ, немного модифицируем  секцию настроек шейпера:

<IfModule mod_shaper.c>
    ShaperEngine on
    ShaperAll downrate 50 uprate 100
    <IfUser dmitry anna>
      ShaperEngine off
    </IfUser>
</IfModule>

И вот теперь для пользователей dmitry и anna шейпер отключается, и никаких ограничений на скорость как скачивания, так и загрузки нет.

PS. Проверить текущее состояние шейпера можно выполнив в консоли следующую команду:

ftpdctl shaper info

Ответ на нее выглядит следующим образом (три сессии с общими лимитами в 40 и 100 КБ/сек):

ftpdctl: Overall Rates: 40.00 KB/s down, 100.00 KB/s up
ftpdctl: Default Shares Per Session: 5 down, 5 up
ftpdctl: Default Priority: 10
ftpdctl: Number of Shaped Sessions: 3
ftpdctl: PID   Priority DShares        DRate (KB/s) UShares        URate (KB/s)
ftpdctl: ----- -------- -------------- ------------ -------------- ------------
ftpdctl:  2573       10       5/15 (0)        13.33       5/15 (0)       33.33
ftpdctl:  2713       10       5/15 (0)        13.33       5/15 (0)       33.33
ftpdctl:  2992       10       5/15 (0)        13.33       5/15 (0)       33.33

Итого — как видите, шейпер честно поделил выделенный лимит поровну между тремя  анонимами…

ЗЫ. и еще чуток. Чтобы видеть сколько анонимных пользователей подключено (точнее — на сколько сессий шейпер поделил отведенную полосу), я написал совсем маленький скрипт, всего одну строку:

ftpdctl shaper info | egrep -i "Shaped Sessions" | egrep -o [0-9]+

после запуска скрипта на экран выводится одна единственная цифра — число сессий. Лезть в консоль, да еще и с правами root-а каждый раз неохота, потому данный скрипт был добавлен в субмодуль custom модуля Webminstats программы Webmin. И вот теперь он «радостно» рисует мне вот такие графики: