Как защитить сервер от ботов

Подготовка и доступ к серверу

  1. Войдите в панель proxify.cloud и выберите нужный выделенный сервер.
  2. Откройте консоль (VNC/NoVNC) или подключитесь по SSH к Ubuntu:
    ssh root@<IP_ВАШЕГО_СЕРВЕРА>
    
  3. Обновите систему и установите базовые утилиты:
    apt update && apt upgrade -y
    apt install -y ufw fail2ban curl wget jq iptables-persistent
    
    При установке iptables-persistent согласитесь на сохранение текущих правил IPv4 и IPv6.

Настройка файрвола (UFW)

  1. Настройте политику по умолчанию и разрешите необходимые порты:
    ufw default deny incoming
    ufw default allow outgoing
    ufw allow 22/tcp comment 'SSH'
    ufw allow 25565/tcp comment 'Minecraft Java'
    ufw allow 19132/udp comment 'Minecraft Bedrock'
    # Если используете RCON или панель управления (например, Pterodactyl wings):
    ufw allow 8080/tcp comment 'Panel/Wings'
    ufw allow 25575/tcp comment 'RCON'
    
  2. Включите файрвол:
    ufw enable
    
  3. Проверьте статус:
    ufw status numbered
    

Защита SSH (вектор входа для ботов)

  1. Отредактируйте конфиг SSH:
    nano /etc/ssh/sshd_config
    
    Примените следующие параметры (раскомментируйте и измените):
    Port 2222                    # Смените стандартный порт
    PermitRootLogin prohibit-password  # Запрет входа по паролю для root
    PubkeyAuthentication yes
    PasswordAuthentication no    # Только ключи
    MaxAuthTries 3
    LoginGraceTime 30
    ClientAliveInterval 300
    ClientAliveCountMax 2
    AllowUsers minecraft admin   # Явно укажите разрешенных пользователей
    
  2. Создайте пользователя для управления сервером (если нет) и настройте SSH-ключи:
    adduser minecraft --disabled-password --gecos ""
    usermod -aG sudo minecraft
    # На локальной машине: ssh-copy-id -p 2222 minecraft@<IP_СЕРВЕРА>
    
  3. Перезапустите SSH и проверьте подключение в новом терминале перед закрытием текущего:
    systemctl restart sshd
    ufw allow 2222/tcp comment 'SSH Custom'
    ufw delete allow 22/tcp
    

Установка и настройка Fail2Ban

  1. Создайте локальную конфигурацию:

    cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    nano /etc/fail2ban/jail.local
    
  2. Настройте базовые параметры в секции [DEFAULT]:

    [DEFAULT]
    ignoreip = 127.0.0.1/8 ::1 <ВАШ_ДОМАШНИЙ_IP>/32
    bantime  = 1h
    findtime = 10m
    maxretry = 3
    backend = systemd
    action = %(action_mwl)s
    

    action_mwl отправляет письмо с логами (настройте destemail и sendername выше в файле) и банит через iptables.

  3. Включите джейлы для SSH и рецидивов:

    [sshd]
    enabled = true
    port    = 2222
    filter  = sshd
    logpath = %(sshd_log)s
    maxretry = 3
    
    [recidive]
    enabled  = true
    filter   = recidive
    logpath  = /var/log/fail2ban.log
    action   = %(action_mwl)s
    bantime  = 1w
    findtime = 1d
    maxretry = 5
    
  4. Создайте фильтр для защиты Minecraft от бот-атак (флуд соединений/логинами). Создайте файл:

    nano /etc/fail2ban/filter.d/minecraft-bot.conf
    

    Вставьте содержимое (под логи Paper/Spigot/Purpur):

    [Definition]
    # Паттерны атак: слишком частые соединения, невалидные пакеты, брутфорс логина
    failregex = ^.*Connection request from .* <HOST>.*$
                ^.*Failed to verify username.*<HOST>.*$
                ^.*Disconnecting .*: Protocol mismatch.*<HOST>.*$
                ^.*Kicking .*: You are sending packets too fast.*<HOST>.*$
                ^.*/.*: lost connection: Disconnected.*<HOST>.*$
    ignoreregex =
    
  5. Добавьте джейл в jail.local:

    [minecraft-bot]
    enabled  = true
    filter   = minecraft-bot
    logpath  = /home/minecraft/server/logs/latest.log
    # Если используете Docker/Pterodactyl, путь может быть: /var/lib/docker/containers/*/*-json.log
    port     = 25565,19132
    protocol = tcp
    maxretry = 10
    findtime = 60
    bantime  = 30m
    action   = iptables-allports[name=minecraft-bot]
    

    Убедитесь, что путь logpath верен для вашей установки. В панели proxify.cloud при использовании Pterodactyl логи обычно в /var/lib/pterodactyl/volumes/<UUID>/logs/latest.log.

  6. Перезапустите и проверьте:

    systemctl enable --now fail2ban
    fail2ban-client status
    fail2ban-client status minecraft-bot
    

Защита на уровне ядра и сети (sysctl / iptables)

  1. Жестко настройте стек TCP/IP против SYN-флуда и сканирования:

    cat << 'EOF' > /etc/sysctl.d/99-minecraft-hardening.conf
    # SYN Flood Protection
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_max_syn_backlog = 8192
    net.ipv4.tcp_synack_retries = 2
    net.ipv4.tcp_syn_retries = 3
    
    # ICMP / Ping ограничения
    net.ipv4.icmp_echo_ignore_broadcasts = 1
    net.ipv4.icmp_ignore_bogus_error_responses = 1
    net.ipv4.icmp_ratelimit = 100
    net.ipv4.icmp_ratemask = 88089
    
    # Маршрутизация и безопасность
    net.ipv4.conf.all.rp_filter = 1
    net.ipv4.conf.default.rp_filter = 1
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.all.accept_source_route = 0
    net.ipv4.conf.default.accept_source_route = 0
    net.ipv4.conf.all.log_martians = 1
    net.ipv4.conf.default.log_martians = 1
    
    # IPv6 (если не используется — отключите или настройте аналогично)
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    net.ipv6.conf.lo.disable_ipv6 = 1
    EOF
    sysctl --system
    
  2. Добавьте правила iptables для ограничения скорости новых соединений на порт Minecraft (защита от ботнетов, забивающих слот листьями):

    # Ограничение: макс 20 новых коннектов в секунду с одного IP на порт 25565
    iptables -A INPUT -p tcp --dport 25565 -m conntrack --ctstate NEW -m recent --name MC_CONN --set
    iptables -A INPUT -p tcp --dport 25565 -m conntrack --ctstate NEW -m recent --name MC_CONN --update --seconds 1 --hitcount 20 -j DROP
    
    # Ограничение RCON (если открыт миру — лучше закрыть в UFW и юзать VPN)
    iptables -A INPUT -p tcp --dport 25575 -m recent --name RCON_ATT --set
    iptables -A INPUT -p tcp --dport 25575 -m recent --name RCON_ATT --update --seconds 60 --hitcount 5 -j DROP
    
    # Защита от невалидных пакетов
    iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
    
    # Сохранение правил
    netfilter-persistent save
    

    Правила применяются сразу. Проверьте: iptables -L -n -v | head -30.

Настройка самого сервера Minecraft (Paper/Purpur)

  1. Остановите сервер и отредактируйте server.properties:

    nano /home/minecraft/server/server.properties
    

    Ключевые параметры:

    online-mode=true                 # ОБЯЗАТЕЛЬНО: проверка скинов/аккаунтов Mojang/Microsoft
    enforce-whitelist=true           # Кикает не в вайтлисте при перезагрузке списка
    white-list=false                 # Включите true, если сервер приватный
    max-players=100                  # Реалистичный лимит
    view-distance=6                  # Меньше = меньше нагрузка от ботов-летчиков
    simulation-distance=4
    network-compression-threshold=256
    # Скрытие версии (не панацея, но мешает сканерам)
    server-name=MyServer
    motd=§aWelcome§r
    
  2. Настройте paper-global.yml (или purpur.yml) для анти-чита/бот защиты:

    nano /home/minecraft/server/paper-global.yml
    

    Найдите или добавьте секции:

    # Анти-бот: ограничение действий новых игроков
    player-auto-save-rate: -1
    use-faster-eigencraft-redstone: true
    
    # Запрет спавна сущностей ботами
    spawn-limits:
      ambient: 1
      axolotls: 2
      creature: 10
      monster: 20
      underground_water_creature: 2
      water_ambient: 2
      water_creature: 2
      misc: 1
    
    # Анти-чит настройки (базовые)
    anti-xray:
      enabled: true
      engine-mode: 2
      hide-blocks:
        - diamond_ore
        - deepslate_diamond_ore
        - ancient_debris
      replace-blocks:
        - stone
        - deepslate
    
    # Логирование подозрительной активности
    log-player-ip-addresses: true
    verbose-gc-logging: false
    
  3. Установите плагины для защиты (через