Bash-скрипт для VPN-серверов на Xray (панель x-ui / 3x-ui) под Debian/Ubuntu.
Ограничивает число одновременных TCP-соединений с одного IP-адреса на порт 443 и включает TCP BBR. Решает проблему перегрузки оперативной памяти, когда отдельные клиенты открывают тысячи коннектов и «съедают» RSS процесса xray.
- Проверяет, что запущен от root, и печатает состояние ДО: память (
free -h), число established-соединений и RSS процессаxray. - Устанавливает
iptables-persistent(если ещё не установлен) в неинтерактивном режиме. - Применяет правило connlimit на указанный порт для IPv4 (маска
/32) и IPv6 (маска/64): новые SYN-пакеты сверх лимита отбиваются черезREJECT --reject-with tcp-reset. Предыдущее идентичное правило предварительно удаляется, чтобы не плодить дубликаты. - Сохраняет правила через
netfilter-persistent save— они переживут перезагрузку. - Включает BBR, записывая
/etc/sysctl.d/99-bbr.conf:net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr - Перезапускает сервис (по умолчанию
x-ui) и проверяет, что он активен. - Печатает состояние ПОСЛЕ и итоговые правила
iptables/ip6tables.
- ОС: Debian / Ubuntu (используются
apt-get,dpkg,debconf,netfilter-persistent). - Права root.
- Ядро с поддержкой модуля BBR (Linux 4.9+).
- Установленные Xray / x-ui на сервере.
Переопределяются через переменные окружения:
| Переменная | По умолчанию | Описание |
|---|---|---|
CONNLIMIT |
150 |
Макс. число одновременных соединений с одного IP |
PORT |
443 |
Порт, на который накладывается лимит |
RESTART_SVC |
x-ui |
Имя systemd-сервиса для перезапуска |
Залейте и выполните на сервере:
scp fix_xray_connlimit.sh root@SERVER:/tmp/
ssh root@SERVER bash /tmp/fix_xray_connlimit.shИли одной командой, не сохраняя файл на сервере:
cat fix_xray_connlimit.sh | ssh root@SERVER bash -sС нестандартными параметрами:
CONNLIMIT=200 PORT=8443 RESTART_SVC=x-ui bash fix_xray_connlimit.shУдалить правило connlimit (подставьте свои PORT/CONNLIMIT):
iptables -D INPUT -p tcp --dport 443 --syn -m connlimit --connlimit-above 150 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
ip6tables -D INPUT -p tcp --dport 443 --syn -m connlimit --connlimit-above 150 --connlimit-mask 64 -j REJECT --reject-with tcp-reset
netfilter-persistent saveОтключить BBR:
rm /etc/sysctl.d/99-bbr.conf- Слишком низкий
CONNLIMITможет рвать соединения у легитимных клиентов (мультиплексирование, несколько устройств за одним NAT). Начинайте со значения с запасом. - Скрипт вставляет правило в начало цепочки
INPUT(-I). Убедитесь, что это не конфликтует с уже настроенным фаерволом. - Перед массовым применением протестируйте на одном сервере.
MIT