Зачем это нужно?
Если у вас есть 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 за работу по программированию, и оформлению статьи.
Иллюстрации:

