Практика Руководство

Настройка SSL/TLS обратного прокси для веб-панелей игровых серверов

Настройка Nginx обратного прокси с SSL-сертификатами Let's Encrypt для игровых панелей: изоляция на localhost, проксирование WebSocket и rate limit.

Настройка SSL/TLS обратного прокси для веб-панелей игровых серверов

Современные игровые серверы часто оснащаются веб-интерфейсами и REST/WebSocket API для удалённого администрирования: карты Minecraft (Dynmap, BlueMap), веб-панели управления, REST API Palworld и WebRCON в Rust. По умолчанию эти службы запускаются без шифрования (HTTP и WS) на нестандартных портах. Открытие таких портов наружу подвергает сервер угрозе перехвата паролей администратора в незащищённых сетях и блокировке браузером из-за политик Mixed Content.

В этой статье подробно рассматривается настройка безопасного обратного прокси Nginx с бесплатными SSL-сертификатами Let's Encrypt, изоляция игровых веб-панелей на локальной петле (127.0.0.1) и проксирование WebSocket-соединений.

Почему опасно открывать веб-панели и WebSocket без шифрования#

Когда администратор авторизуется в панели управления или отправляет команды через незащищённый протокол HTTP или WebSocket (ws://):

  1. Перехват учётных данных (Sniffing): Логины, токены сессий и пароли RCON передаются в открытом виде через интернет и могут быть перехвачены на промежуточных узлах.
  2. Блокировка браузера (Mixed Content): Если админ-панель открыта по защищённому HTTPS, а сокет RCON пытается подключиться по ws://, современные браузеры принудительно разрывают соединение.
  3. Отсутствие единой точки аудита: Нестандартные порты (8123, 8212, 28016) увеличивают поверхность атаки и усложняют настройку брандмауэра.

Решение заключается в изоляции игровых портов внутри локального хоста и публикации единой защищённой точки входа на стандартном порту HTTPS (443).

Изоляция игровых веб-сервисов на localhost#

Перед настройкой Nginx настройте игровые серверы так, чтобы их веб-порты слушали только локальный адрес 127.0.0.1, а не 0.0.0.0.

Например, для карты Minecraft Dynmap в plugins/dynmap/configuration.txt: webserver-bindaddress: 127.0.0.1webserver-port: 8123

Для Palworld REST API в PalWorldSettings.ini: RESTAPIBindAddress="127.0.0.1"RESTAPIPort=8212

Убедитесь, что порты привязаны исключительно к петлевому интерфейсу:

bash
sudo ss -tlnp | grep -E "8123|8212|28016"

В выводе адрес должен быть строго 127.0.0.1:<порт>.

Установка и настройка Nginx с поддержкой WebSocket#

Установите веб-сервер Nginx и утилиту Certbot для автоматического выпуска SSL-сертификатов:

bash
sudo apt-get update
sudo apt-get install -y nginx certbot python3-certbot-nginx

Создайте конфигурационный файл виртуального хоста /etc/nginx/sites-available/game_panels.conf:

bash
sudo nano /etc/nginx/sites-available/game_panels.conf

Вставьте конфигурацию, включающую поддержку WebSocket и буферизацию:

nginx
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 80;
    server_name panel.example.com;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name panel.example.com;

    # SSL certificates managed via certbot
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # Minecraft Dynmap Web Map
    location /map/ {
        proxy_pass http://127.0.0.1:8123/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Rust WebRCON with WebSocket upgrade
    location /rcon/ {
        proxy_pass http://127.0.0.1:28016/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

Активируйте виртуальный хост:

bash
sudo ln -sf /etc/nginx/sites-available/game_panels.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

В специализированной панели управления серверами завершение TLS, выпуск сертификатов и безопасное проксирование веб-консолей серверов изолированы автоматически без необходимости вручную администрировать веб-сервер Nginx.

Выпуск и автоматическое продление SSL-сертификатов Let's Encrypt#

Выпустите доверенный сертификат Let's Encrypt с помощью Certbot:

bash
sudo certbot --nginx -d panel.example.com --non-interactive --agree-tos -m admin@example.com

Certbot автоматически настроит директивы ssl_certificate и ssl_certificate_key в вашем конфиге Nginx и включит таймер автопродления:

bash
sudo systemctl status certbot.timer --no-pager

Проверьте корректность тестового продления сертификатов:

bash
sudo certbot renew --dry-run

Защита административных эндпоинтов: авторизация и rate limiting#

Чтобы защитить API и панели управления от перебора паролей (brute force), добавьте ограничение частоты запросов и ограничение доступа по IP-адресу в Nginx:

nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

location /api/ {
    limit_req zone=api_limit burst=20 nodelay;
    
    # Authorized administrative IP:
    allow 198.51.100.50;
    deny all;

    proxy_pass http://127.0.0.1:8212/;
}

После применения настроек перезагрузите Nginx:

bash
sudo nginx -t && sudo systemctl reload nginx

Теперь все административные подключения к игровым сервисам защищены надёжным шифрованием TLSv1.3, а внутренние порты серверов надёжно укрыты от внешнего интернета.

Источники#