Skip to content

cryptexctl/mcproxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mcproxy

Прокси-ретранслятор для Minecraft-серверов, решающий две задачи:

  1. обход геоблокировок (внешний VPS принимает соединение, трафик шлётся к Velocity в РФ);
  2. сохранение реальных IP-адресов игроков на backend без iptables.

Поддерживаются:

  • TCP потоки (игровой протокол);
  • UDP пакеты (PlasmoVoice);
  • PROXY-protocol v1 (первый строковый пакет).

Архитектура

Client ----> mcproxy (VPS) --> Velocity --------> Purpur
    ^                             ^                            
    │ TCP+UDP                     │ ip_forward (modern)         
    │ PROXY v1                    │                            
    v                             v
  PlasmoVoice               LimboAuth / плагины
  • mcproxy добавляет строку PROXY TCP4 <real> <proxy> <port> 25565\r\n перед передачей данных.
  • Velocity читает заголовок при haproxy-protocol = true и пересылает IP дальше.

ВАЖНЫЙ НЮАНС

По причине двух инстансов велосити которые будут использоваться, будет нюанс, бд LimboAuth будет рассинхронизироваться, так как будет два разных инстанса Velocity. Кто найдет фикс - откройте issue.

Сборка

$ go build -o mcproxy

Требуется Go 1.21.4 Модуль зависимостей - go.mod.

Конфигурация

Файл config.toml:

[listen]
 tcp = ":25565"
 udp = ":25565"

[backend]
 tcp = "127.0.0.1:25565"
 udp = "127.0.0.1:25565"

idle_timeout_seconds = 300

Запуск

$ ./mcproxy             # в каталоге с config.toml

Сервис

Пример юнит-файла находится в каталоге systemd/. Скопируй его в /etc/systemd/system/,

sudo cp systemd/mcproxy.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now mcproxy

По-умолчанию бинарь ожидается в /usr/local/bin/mcproxy, а конфиг в /etc/mcproxy/config.toml.
При желании поменяй WorkingDirectory и ExecStart.

Две схемы подключения

Velocity не умеет одновременно принимать обычные соединения и требовать PROXY-protocol.
Решение - запустить два экземпляра:

# 25565 - прямые игроки, без PROXY
bind = "0.0.0.0:25565"
haproxy-protocol = false

# 25566 - трафик от mcproxy, PROXY обязателен
bind = "0.0.0.0:25566"
haproxy-protocol = true

В mcproxy укажите backend 127.0.0.1:25566, а игрокам дайте публичный 25565.
Так одновременно работают «местные» и «заграничные» пользователи.

Безопасность

mcproxy не выполняет аутентификацию. Предполагается, что UDP/TCP трафик ограничен фаерволом между VPS и backend.

Откуда появилась идея?

В свое время я сисадминил майнкрафт сервер, и появилась одна проблема, когда мой друг пытался зайти на сервер, но не мог, так как сервер был заблокирован в России. Долгое время я костылил подключение через 25565 на другом сервере, но это было неудобно + отваливался войсчат прям в 0, что ващето оч неудобно, поэтому я решил:

нужно сделать прокси-ретранслятор для майнкрафт серверов, который будет решать эту проблему. Вот собственно и сам проект.

About

Yet another Minecraft Proxy

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published