Зачем это нужно?
Если у вас есть 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 за работу по программированию, и оформлению статьи.
Иллюстрации:
![Результат работы скрипта Результат работы скрипта](https://habrastorage.org/getpro/habr/upload_files/1a0/c3f/be5/1a0c3fbe5c2788a0786a572a5835fe86.png)
![Полученный конфиг FireQOS. Если топ-обмен происходит по https, то и такой хост отправляется в низкий приоритет за счет указания "prio 1" в строке правила. Совпадение находится раньше, даже если правило находится ниже по списку. Такая возможность указана в руководстве. Полученный конфиг FireQOS. Если топ-обмен происходит по https, то и такой хост отправляется в низкий приоритет за счет указания "prio 1" в строке правила. Совпадение находится раньше, даже если правило находится ниже по списку. Такая возможность указана в руководстве.](https://habrastorage.org/getpro/habr/upload_files/279/87d/e3f/27987de3f9ac1e2d247b312952e7115d.png)
Комментарии (4)
eledev
05.02.2025 05:37Как торренты загружают канал? P2P-сеть же.
evilnero Автор
05.02.2025 05:37Да бывает роутер подключен, и все домашние клиенты и весь интернет идут через VPN.
Wireguard-клиент по умолчанию тоже блокирует все соединения вне установленного туннеля, но это можно изменить в настройке туннеля. А можно поставить WireSock, и использовать VPN только для браузера, например. Тогда и игры работают без VPN с хорошим пингом, с открытыми портами. Иначе VPN-клиент оказывается за файерволом, и его порты недоступны, если не настроить проброс специально.
ky0
Правильно ли я понимаю, что если хостов в выводе iftop'а получится меньше четырёх, всё встанет колом?
evilnero Автор
Ничего особого не будет в случае ошибок. Как максимум 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}'