Comments 13
Правильно ли я понимаю, что если хостов в выводе iftop'а получится меньше четырёх, всё встанет колом?
Ничего особого не будет в случае ошибок. Как максимум 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}'
Как торренты загружают канал? P2P-сеть же.
Да бывает роутер подключен, и все домашние клиенты и весь интернет идут через VPN.
Wireguard-клиент по умолчанию тоже блокирует все соединения вне установленного туннеля, но это можно изменить в настройке туннеля. А можно поставить WireSock, и использовать VPN только для браузера, например. Тогда и игры работают без VPN с хорошим пингом, с открытыми портами. Иначе VPN-клиент оказывается за файерволом, и его порты недоступны, если не настроить проброс специально.
Довольно полезно. Тоже есть сервер для личных нужд. Довольно слабенький: 1 ядро, 1 Гб ОЗУ, 10 Гб ПЗУ и 32 Тб трафика. Но тариф по которому я его купил отличный — 0.025$ в день. Было 0.016$, но при переезде с русской части хостинга на иностранную пришлось менять тариф (не помню зачем вообще переезжал). Сейчас правда и такой тариф нельзя купить, ближайший 0.16$.
Так вот мне кажется я скоро уткнусь в железо для текущего количества пользователей. Есть опыт, сколько подобный сервер тянет? Думаю сделать использовать руководства из статьи, так как есть некоторые пользователи, которые видимо не сидят на раздельном туннелировании и грузят сервер сильно больше других
Шифрование Wireguard особо не напрягает систему, поддерживается ядром Linux. Если это OpenVPN, то может быть хуже и медленнее... Обычно 100 мбит такой сервер выдает... Можно проверять например, поставив speedtest, и запустив без шифрования до Москвы:speedtest -s 65511
А замеры шифрованного VPN наверно уже делали на конечной машине. На speedtest.net или fast.com
1 ТБ в день примерно, что хватает. На скорости 100 Мбит/с будет примерно 864-1036ГБ (1ТБ) в день, и редко весь день нужно прямо 100 Мбит.
Я вон замерял мощность процессора командой sysbench cpu run
: "Мощность ядра Intel E5-2697A v4 по оценке консольной sysbench: около 800 events per second. Для сравнения, на других арендуемых машинах у меня 566 и 653. Еще на одной, где процессор AMD Ryzen 9 5950X - 4496, что заметно больше. Но и 800 вполне хватает, главное чтобы они были стабильными и не уменьшались сильно от соседних VPS."
Канал тоже может быть загружен в час пик особенно. И если это дешевый VPS, то может быть общий канал до Москвы/России весь забит. Можно проверять скорость, и тогда понять, во что упирается система. На моих 1-ядерных 100 мбит обычно можно было получить, либо 70-80 хотя бы. Если все работает нормально и канал свободен. Но может упирается оно в загруженный общий канал.
Еще fast cli speed test можно использовать для проверки: https://www.tecmint.com/fast-test-internet-download-speed-in-linux/
В целом да, QoS помогает распределять ограниченные ресурсы, что относится и к процессору, когда скапливаются команды на выполнение, и загруженному каналу.
Скорости замерял. На AmneziaWG обычно получал не более 100 МБит. На XRay with Reality уже до 400-500 МБит. И то и другое вполне хорошие скорости для рядового использования. Меня больше интересовали моменты с личным опытом — сколько на том или ином оборудовании сидело пользователей без особых проблем.
Скорее всего 1 ядро процессора станет когда-то слабым звеном при увеличении количества соединений и клиентов. У меня их не более 50, но я бы увеличивал до 250 и более на двуядерном сервере. Надо пробовать. Можно использовать monitorix для сбора статистики. Там, как в top
, показана загрузка цифрой от 0 до 1. Если она приближается к 1, то предел достигнут, это как 100% загрузка CPU, и скапливается очередь на выполнение, и может быть лучше добавить 1 ядро. А если ядер уже 2, то цифра уже - от 0 до 2, хотя может и превышать эти значения, что значит очередь на выполнение.
Одно соединение на скорости 500 мбит вероятно обрабатывается легче, чем 500 маленьких на скорости 1 мбит. Процессору надо переключаться между задачами, шифровать все... очередь скапливается, один поток на всех. Лимит зависит от активности клиентов и количества их соединений. Торрент-пользователи нагружают, а некоторые вообще изредка подключаются. Если в пассивном состоянии нагрузка приближается к 30-50%, то вероятно уже не надо добавлять новых клиентов, и вместо этого добавить сервер или ядро CPU. Можно смотреть время пассивнее, время активное, часы пик... Если система загружена на 30%, то клиент может разогнаться и получить 100-250 мбит, например, когда надо что-то скачать. А если постоянная нагрузка уже 80%, то разгоняться некуда и максимальная скорость достигнута.
Спасибо за наводку по профилированию сервера. У меня в час пик сейчас 30%, а в обычном использовании где то 15-20%. В прошлом месяце были скачки до 70%, но я всем сказал использовать раздельное туннелирование, а не гнать весь трафик через VPN =)


Ещё раз спасибо за полезную статью и опыт с подсказками в комментах :D
Еще линукс не всегда хорошо по умолчанию работает с соединениями. Можно увеличить пределы используемой памяти и очереди в /etc/sysctl.conf
Искал на этот счет "sysctl for 1 gbit, 10 gbit"... разные статьи есть. Я вон использую для 100-350 Мбит такие параметры, подобранные совместно с ChatGPT, для VPN (это еще отключает ipv6):
net.ipv4.ip_forward=1
net.core.default_qdisc = fq_codel
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_syncookies = 0
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.tcp_rmem = 4096 262144 8388608
net.ipv4.tcp_wmem = 4096 262144 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_no_metrics_save = 1
Для применения без перезагрузки можно использовать sysctl -p
Еще линукс не всегда хорошо по умолчанию работает с соединениями. Можно увеличить пределы используемой памяти и очереди в /etc/sysctl.conf
Искал на этот счет "sysctl for 1 gbit, 10 gbit"... разные статьи есть. Я вон использую такие параметры, подобранные совместно с ChatGPT, для VPN (это еще отключает ipv6):
net.ipv4.ip_forward=1
net.core.default_qdisc = fq_codel
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_syncookies = 0
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.tcp_rmem = 4096 262144 8388608
net.ipv4.tcp_wmem = 4096 262144 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_no_metrics_save = 1
Для применения без перезагрузки можно использовать sysctl -p
Можно изменить код, добавляя всю сеть /16 вместо одного IP. Так будет эффективнее против много поточных загрузок типа Steam.
# Функция для преобразования IP в сеть /16
get_network() {
echo "$1" | awk -F. '{printf "%s.%s.0.0/16\n", $1, $2}'
}
# 4. Добавляем сети с низким приоритетом
for IP in "$IP1" "$IP2" "$IP3" "$IP4"; do
if [[ -n "$IP" ]]; then
NET=$(get_network "$IP")
echo " match net $NET prio 1" >> "$FIREQOS_CONF"
fi
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
if [[ -n "$IP" ]]; then
NET=$(get_network "$IP")
echo " match net $NET prio 1" >> "$FIREQOS_CONF"
fi
done
echo "FireQOS обновлён: $(get_network "$IP1"), $(get_network "$IP2"), $(get_network "$IP3"), $(get_network "$IP4")"
fireqos start
Выяснилось, что чувствительно, и может пострадать от такого применения. Это UDP-соединения, в особенности игры. При выполнении fireqos start
, все нынешние дисциплины tc qdisc удаляются, и создаются заново, и там могут сброситься некоторые пакеты в очереди. Игры, которые работают по UDP, в это время могут испытать фриз, и потом постепенно догонят сервер повторной отправкой, потому что на UDP не проверяется доставка пакета (зато он обеспечивает повышенную скорость). Соединения не обрываются, но часть пакетов может пропасть. Хотя с помощью программ наподобие WireSock или Amnezia VPN можно исключить игру из VPN, некоторым людям надо именно играть через подключенный VPN, потому что без него это невозможно.
Так что интервал можно увеличить до 10 минут, либо вообще убрать динамически обновляемую часть, и использовать fireqos для других целей. С его помощью можно, например, ограничить скорость по одному порту подключения, классифицировав его как низкоприоритетный... и там можно поставить на класс max 50mbit в конце строки, например...
Так, можно ограничить скорость соединения vless/xray или wireguard/amneziawg... Сами программы-серверы не дают такой возможности, но сервер ведь держит открытый порт tcp/udp, и вот по нему можно ограничить входящую и исходящую скорость (два разных правила).
В этом примере такое сделано для сервера с IP 11.22.33.44, и еще сети Steam/Valve (возможно, не все) добавлены в class low (потому что Steam часто часто загружает в много потоков — 10-20 https, так что может забить весь канал):
DEVICE=ens3
INPUT_SPEED=100000kbit
OUTPUT_SPEED=100000kbit
interface $DEVICE world-in input rate $INPUT_SPEED $LINKTYPE
class defaultclass low
match net 155.133.0.0/16 prio 2
match net 155.132.0.0/16 prio 2
match net 155.131.0.0/16 prio 2
match net 185.25.182.0/24 prio 2
class limited max 50mbit
match dports 443 dst 11.22.33.44 prio 1
match udp dports 51820,32500 dst 11.22.33.44 prio 1
interface $DEVICE world-out output rate $OUTPUT_SPEED $LINKTYPE
class default
class low
match net 155.133.0.0/16 prio 2
match net 155.132.0.0/16 prio 2
match net 155.131.0.0/16 prio 2
match net 185.25.182.0/24 prio 2
class limited max 50mbit
match sports 443 src 11.22.33.44 prio 1
match udp sports 51820,32500 src 11.22.33.44 prio 1
Автоматизированный QoS на VPN-сервере с FireQOS и iftop