Зачем это нужно?

Если у вас есть VPN-сервер, рано или поздно возникнет проблема: некоторые пользователи потребляют слишком много трафика, замедляя интернет для всех остальных. Это особенно актуально для торрент-пользователей, которые создают сотни соединений и загружают канал.

Вручную отслеживать таких потребителей через iftop и менять настройки QoS – утомительно. Но можно автоматизировать процесс, чтобы FireQOS каждые 5 минут динамически обновлял правила для трафика, снижая приоритет для самых активных пользователей.

1. Что такое FireQOS?

FireQOS – это инструмент для управления приоритетами трафика. Он позволяет разделять трафик на классы (например, "важный" и "низкоприоритетный") и распределять доступную пропускную способность.

На VPN-сервере FireQOS особенно полезен, потому что:
✔️ Позволяет контролировать входящий и исходящий трафик.
✔️ Не требует сложных настроек tc вручную.
✔️ Работает в реальном времени, без разрывов соединений.

2. Как FireQOS обрабатывает трафик VPN?

На обычном сервере QoS работает предсказуемо:

  • Входящий трафик – это данные, получаемые сервером.

  • Исходящий трафик – это данные, отправляемые сервером.

Но на VPN-сервере всё сложнее:

  • Сервер скачивает данные не для себя, а для клиентов.

  • Входящий трафик примерно равен исходящему, но система считает их независимо, не видит связи между ними.

  • Обычные схемы QoS могут работать неправильно, если не учитывать эти нюансы.

Как это решается?

  • Мы одновременно занижаем приоритет входящего и исходящего трафика для самых активных пользователей.

  • Это не мешает нормальной работе, но предотвращает перегрузку канала.

  • https (порт 443 tcp и udp) и важные сервисы обрабатываются в приоритете.

  • Однако, если VPN-клиент потребляет слишком много трафика, его трафик остаётся быстрым на входе, но замедляется на выходе – так QoS естественным образом балансирует нагрузку.

Как это влияет на скорость?

  • Если канал не загружен – FireQOS не мешает, все соединения работают на максимальной скорости.

  • Если канал загружен, FireQOS даёт приоритет важным данным, а второстепенные соединения (например, торренты) замедляются.

  • Это позволяет гарантировать нормальную скорость для таких задач, как просмотр видео, назначением которого сейчас зачастую становится VPN. YouTube может работать нормально и на скорости 1-12 Мбит/с.

3. Установка FireQOS и iftop

В Debian и Ubuntu FireQOS входит в состав firehol:

apt-get install iftop firehol fireqos

Активируем FireQOS:

systemctl enable fireqos

Проверяем статус:

systemctl status fireqos

Или текущие классы трафика:

fireqos status world-in
fireqos status world-out

4. Как работает автоматизация?

Наш скрипт:

  • Запускает iftop каждые 5 минут.

  • Выбирает 4 хоста с наибольшим трафиком.

  • Обновляет конфигурацию FireQOS, добавляя их в низкий приоритет.

  • Применяет новый конфиг без разрыва соединений.

5. Bash-скрипт для автоматического обновления FireQOS

Создаём файл /root/update_fireqos.sh и делаем исполняемым (chmod +x /root/update_fireqos.sh):

#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Настройки сервера (можно менять)
DEVICE="eth0"               # Сетевой интерфейс
INPUT_SPEED="100000kbit"    # Входящая скорость
OUTPUT_SPEED="100000kbit"   # Исходящая скорость
IP_FILE="/root/low_priority_ips.txt"
FIREQOS_CONF="/etc/firehol/fireqos.conf"

# 1. Запускаем iftop на 30 секунд и извлекаем 4 IP с максимальным трафиком
iftop -t -s 30 -n -o 40s -i "$DEVICE" | awk 'NR == 5 || NR == 7 || NR == 9 || NR == 11 {print $1}' > "$IP_FILE"

# 2. Читаем IP-адреса
IP1=$(sed -n '1p' "$IP_FILE")
IP2=$(sed -n '2p' "$IP_FILE")
IP3=$(sed -n '3p' "$IP_FILE")
IP4=$(sed -n '4p' "$IP_FILE")

# 3. Формируем конфиг FireQOS
cat <<EOF > "$FIREQOS_CONF"
DEVICE=$DEVICE
INPUT_SPEED=$INPUT_SPEED
OUTPUT_SPEED=$OUTPUT_SPEED

interface \$DEVICE world-in input rate \$INPUT_SPEED \$LINKTYPE

   class surfing
      match udp port 53,853,123
      match tcp ports 22,53,853
      match icmp
      match tcp syn
      match tcp ack
      match ports 443

   class default

   class low
EOF

# 4. Добавляем хосты с низким приоритетом в class low
for IP in "$IP1" "$IP2" "$IP3" "$IP4"; do
    [[ -n "$IP" ]] && echo "      match host $IP prio 1" >> "$FIREQOS_CONF"
done

cat <<EOF >> "$FIREQOS_CONF"

interface \$DEVICE world-out output rate \$OUTPUT_SPEED \$LINKTYPE

   class default

   class low
EOF

# 5. Добавляем эти же хосты в правила исходящего трафика world-out
for IP in "$IP1" "$IP2" "$IP3" "$IP4"; do
    [[ -n "$IP" ]] && echo "      match host $IP prio 1" >> "$FIREQOS_CONF"
done

echo "FireQOS обновлён: $IP1, $IP2, $IP3, $IP4"

# 6. Применяем новый конфиг
fireqos start

6. Автозапуск каждые 5 минут

Открываем crontab:

crontab -e

Добавляем строку (а также пустую строку в конце – требование crontab):

*/5 * * * * /bin/bash /root/update_fireqos.sh > /root/fireqos.log 2>&1

Теперь скрипт будет автоматически запускаться каждые 5 минут.

7. Как проверить, что работает?

После запуска можно посмотреть, как изменилась классификация трафика:

fireqos status world-in
fireqos status world-out

Также можно проверить содержимое файла с IP-адресами или лог после выполнения в crontab:

cat /root/low_priority_ips.txt
cat /root/fireqos.log

И сам конфиг FireQoS:

cat /etc/firehol/fireqos.conf

Вывод

Этот метод позволяет оптимизировать VPN-сервер без разрывов соединений. Вам не нужно вручную следить за нагрузкой: FireQOS автоматически снижает приоритет у топ-потребителей, сохраняя нормальную работу сети.

(Изначально навеяно необходимостью настройки собственного VPN, информация о котором здесь).

Спасибо ChatGPT за работу по программированию, и оформлению статьи.

Иллюстрации:

Результат работы скрипта
Результат работы скрипта
Полученный конфиг FireQOS. Если топ-обмен происходит по https, то и такой хост отправляется в низкий приоритет за счет указания "prio 1" в строке правила. Совпадение находится раньше, даже если правило находится ниже по списку. Такая возможность указана в руководстве.
Полученный конфиг FireQOS. Если топ-обмен происходит по https, то и такой хост отправляется в низкий приоритет за счет указания "prio 1" в строке правила. Совпадение находится раньше, даже если правило находится ниже по списку. Такая возможность указана в руководстве.

Комментарии (4)


  1. ky0
    05.02.2025 05:37

    Правильно ли я понимаю, что если хостов в выводе iftop'а получится меньше четырёх, всё встанет колом?


    1. evilnero Автор
      05.02.2025 05:37

      Ничего особого не будет в случае ошибок. Как максимум FireQoS покажет что правила нечитаемые, и применить невозможно, отменит все. Без этого все продолжит работать. Видел подобное, если конфиг написан неправильно.

      Эти 4 IP добавляются только если найдены, в ту часть конфига, которая необязательная. Часть по программированию делал ChatGPT, я особо не знаю как работает awk и могут ли вызвать остановку скрипта в случае ошибки for, do, echo, done... Но в целом FireQOS не может остановить сеть, он управляет tc, qdisc... Если вызывается именно командами fireqos start / fireqos stop, то ничего не ломается. Причем надо использовать именно start, а не restart. Ну это указано в руководстве.

      У меня работает без перебоев на четырех активных серверах На Debian 12. В другой среде, если iftop работает иначе, может быть надо проверить его вывод и изменить номера строк с четырьмя IP. Проверить, что показывает iftop -t -s 30 -n -o 40s -i eth0. Оттуда для IP берутся строки № 5, 7, 9, 11. Может быть их номер будет другим: 'NR == 5 || NR == 7 || NR == 9 || NR == 11 {print $1}'


  1. eledev
    05.02.2025 05:37

    Как торренты загружают канал? P2P-сеть же.


    1. evilnero Автор
      05.02.2025 05:37

      Да бывает роутер подключен, и все домашние клиенты и весь интернет идут через VPN.

      Wireguard-клиент по умолчанию тоже блокирует все соединения вне установленного туннеля, но это можно изменить в настройке туннеля. А можно поставить WireSock, и использовать VPN только для браузера, например. Тогда и игры работают без VPN с хорошим пингом, с открытыми портами. Иначе VPN-клиент оказывается за файерволом, и его порты недоступны, если не настроить проброс специально.