Зачем это нужно?
Если у вас есть VPN-сервер, рано или поздно возникнет проблема: некоторые пользователи потребляют слишком много трафика, замедляя интернет для всех остальных. Это особенно актуально для торрент-пользователей, которые создают сотни соединений и загружают канал.
Вручную отслеживать таких потребителей через iftop
и менять настройки QoS – утомительно. Но можно автоматизировать процесс, чтобы FireQoS каждые 5 минут динамически обновлял правила для трафика, снижая приоритет для самых активных пользователей.
1. Что такое FireQoS?
FireQoS – это инструмент для управления приоритетами трафика. Он позволяет разделять трафик на классы (например, "важный" и "низкоприоритетный") и распределять доступную пропускную способность.
На VPN-сервере FireQoS особенно полезен, потому что: Позволяет контролировать входящий и исходящий трафик.
Не требует сложных настроек
tc
вручную. Работает в реальном времени, без разрывов соединений.
2. Как FireQoS обрабатывает трафик VPN?
На обычном сервере QoS работает предсказуемо:
-
Входящий трафик – это данные, получаемые сервером.
-
Исходящий трафик – это данные, отправляемые сервером.
Но на VPN-сервере всё сложнее:
-
Сервер скачивает данные не для себя, а для клиентов.
-
Входящий трафик примерно равен исходящему, но система считает их независимо, не видит связи между ними.
-
Обычные схемы QoS могут работать неправильно, если не учитывать эти нюансы.
Как это решается?
-
Мы одновременно занижаем приоритет входящего и исходящего трафика для самых активных пользователей.
-
Это не мешает нормальной работе, но предотвращает перегрузку канала.
-
HTTPS (порт 443) и важные сервисы остаются в приоритете.
-
Однако, если 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
Создаём файл и делаем исполняемым ( update_fireqos.sh
chmod +x
): 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://www.pvsm.ru/images/2025/02/05/avtomatizirovannyi-QoS-na-VPN-servere-s-FireQoS-i-iftop.png)
![Полученный конфиг FireQoS Полученный конфиг FireQoS](https://www.pvsm.ru/images/2025/02/05/avtomatizirovannyi-QoS-na-VPN-servere-s-FireQoS-i-iftop-2.png)
Автор: evilnero