Как исправить ошибку «Connection reset»

1. Понимание ошибки и первичная диагностика

Ошибка Connection reset (или java.net.SocketException: Connection reset) означает, что TCP-соединение было внезапредельно разорвано одной из сторон без отправки пакета FIN/RST по протоколу. На сервере Minecraft это чаще всего указывает на:

  • Краш игрового процесса (OOM, ошибка плагина/мода, нехватка файловых дескрипторов).
  • Блокировку трафика фаерволом (UFW, iptables, облачный фаервол proxify.cloud).
  • Проблемы с MTU/фрагментацией пакетов при использовании VPN/прокси.
  • Некорректную настройку server.properties (неверный server-ip, порт).

Первое действие: откройте консоль сервера в панели proxify.cloud (вкладка «Console» контейнера/VM) и посмотрите, есть ли там стектрейсы или сообщение Killed (признак OOM Killer).

2. Проверка состояния сервиса и логов

2.1. Статус systemd-юнита (если сервер запущен как сервис)

systemctl status minecraft-server

Ищите Active: failed или Main PID: ... (code=killed, signal=KILL/SEGV).

2.2. Последние строки лога игрового сервера

tail -n 200 /opt/minecraft/logs/latest.log

Путь может отличаться: /home/minecraft/server/logs/latest.log или /var/lib/minecraft/logs/latest.log. Ищите:

  • OutOfMemoryError: Metaspace / Java heap space.
  • Exception in thread "Server Watchdog".
  • Ошибки плагинов: Could not load 'plugins/Essentials.jar'.

2.3. Системный журнал (OOM Killer)

journalctl -u minecraft-server -n 100 --no-pager
# или глобально
dmesg -T | grep -i -e kill -e oom -e minecraft

Если видите Out of memory: Killed process <PID> (java) — проблема в нехватке RAM.

3. Проверка сетевой доступности и фаерволов

3.1. Прослушиваемый порт внутри Ubuntu

ss -tlnp | grep :25565
# или
netstat -tlnp | grep :25565

Ожидаемый вывод: LISTEN 0 100 0.0.0.0:25565 (или конкретный IP). Если пусто — сервер не стартовал или забиндился на IPv6 (:::25565).

3.2. Локальный тест подключения

nc -zv 127.0.0.1 25565
# или
timeout 3 bash -c "</dev/tcp/127.0.0.1/25565" && echo "Port open"

Успех: Connection to 127.0.0.1 25565 port [tcp/*] succeeded!.

3.3. Фаервол Ubuntu (UFW)

ufw status verbose

Добавьте правило, если отсутствует:

ufw allow 25565/tcp comment 'Minecraft Java'
ufw reload

3.4. Фаервол proxify.cloud (панель управления)

  1. Зайдите в proxify.cloud → выберите ваш выделенный сервер / VM.
  2. Откройте раздел NetworkFirewall (или «Фаервол»).
  3. Убедитесь, что есть правило Allow для TCP 25565 (и 25575 для RCON, 19132/udp для Bedrock).
  4. Если используете Cloud Firewall (внешний L3/L4 балансер) — проверьте правила там. Частая ошибка: порт открыт в UFW, но заблокирован на уровне дата-центра.

3.5. Проверка с внешнего хоста

nmap -Pn -p 25565 <ВАШ_ПУБЛИЧНЫЙ_IP>
# или с ПК игрока
telnet <ВАШ_ПУБЛИЧНЫЙ_IP> 25565

Статус filtered — блокирует фаервол proxify.cloud или вышестоящий провайдер. closed — сервер не слушает порт. open — сеть в порядке, проблема в приложении.

4. Настройка server.properties

Файл: /opt/minecraft/server.properties (путь к вашей инсталляции).

Критические параметры:

server-ip=0.0.0.0
server-port=25565
enable-rcon=false
rcon.port=25575
rcon.password=strongpass
network-compression-threshold=256
max-tick-time=60000
  • server-ip=0.0.0.0 слушает на всех интерфейсах. Не ставьте публичный IP или 127.0.0.1.
  • max-tick-time=60000 предотвращает краш Watchdog при лагах (60 сек вместо дефолтных 60 сек, но можно поставить -1 для отключения, осторожно).
  • network-compression-threshold=256 снижает нагрузку на CPU/пропускную способность.

После изменений: полный рестарт (не /reload):

systemctl restart minecraft-server

5. Решение проблем с памятью (OOM / Heap)

5.1. Проверка выделенной кучи

Посмотрите скрипт запуска: /opt/minecraft/start.sh или параметры systemd ExecStart. Пример корректных флагов для 8 ГБ RAM (резерв 1-2 ГБ под ОС/Metaspace/CodeCache):

-Xms6G -Xmx6G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \
-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M \
-XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 \
-XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 \
-XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 \
-XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 \
-Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true

Важно: -Xms и -Xmx должны быть одинаковыми. Не выделяйте 100% физической RAM.

5.2. Настройка swap (защита от OOM Killer)

free -h
swapon --show

Если swap нет — создайте 2-4 ГБ:

fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

Настройте swappiness (менее агрессивный своп):

echo 'vm.swappiness=10' >> /etc/sysctl.d/99-minecraft.conf
sysctl --system

5.3. Лимиты файловых дескрипторов

Добавьте в /etc/security/limits.conf:

minecraft soft nofile 100000
minecraft hard nofile 100000

И в systemd юнит (/etc/systemd/system/minecraft-server.service):

[Service]
LimitNOFILE=100000
LimitNPROC=100000

Примените:

systemctl daemon-reload
systemctl restart minecraft-server

6. Диагностика плагинов и модов

6.1. Режим «ванильный» тест

Остановите сервер. Переименуйте папки:

mv /opt/minecraft/plugins /opt/minecraft/plugins_disabled
mv /opt/minecraft/mods /opt/minecraft/mods_disabled

Запустите сервер. Если ошибка исчезла — проблема в аддонах.

6.2. Бинарный поиск виновника

Возвращайте половину плагинов/модов, тестируйте. Повторяйте до выявления конкретного файла.

6.3. Проверка версий ядра (Paper/Spigot/Fabric/Forge)

Убедитесь, что версия сервера совпадает с версией клиентов игроков и версиями плагинов.

java -jar paper-1.20.4.jar --version

Обновите до последнего билда стабильной ветки (например, Paper build #XXX).

6.4. Timings / Spark профилирование

Если сервер запускается, но кикает под нагрузкой:

  1. Скачайте spark.jar в plugins/.
  2. В консоли: /spark profiler start --timeout 60
  3. Подождите лаги/кик.
  4. /spark profiler stop
  5. Загрузите отчет на https://spark.lucko.me и анализируйте «Heavy» потоки.

7. MTU, VPN и прокси (BungeeCord / Velocity / TCPShield)

Если игроки подключаются через прокси (Velocity, BungeeCord) или защиту (TCPShield, Cloudflare Spectrum):

  1. MTU: На сервере Ubuntu проверьте MTU интерфейса (ip link show eth0). Стандарт 1500. В туннелях (WireGuard, GRE) часто нужно 1420-1460.
    ip link set dev eth0 mtu 1450
    
    Добавьте в /etc/network/interfaces или netplan для постоянства.
  2. Proxy Protocol: Если используете Velocity/BungeeCord за TCPShield/HAProxy — включите proxy-protocol: true в velocity.toml / config.yml и настройте server-ip=0.0.0.0 на бэкенде. Без этого бэкенд видит IP прокси и резает соединения при несовпадении.
  3. BungeeCord connection_throttle: В config.yml бекенда (Paper/Spigot) выставьте:
    settings:
      bungeecord: true
      connection-throttle: 4000
      timeout-time: 60
    

8. Java версия и флаги

8.1. Соответствие версии

Minecraft Java
1.17 - 1.20.4 Java 17 (LTS)
1.20.5+ Java 21 (LTS)
1.16.5 и ниже Java 8 / 11

Проверка:

java -version

Установка нужной версии (Ubuntu 22.04/24.04):

apt update && apt install -y openjdk-1