Прокси-ретранслятор для Minecraft-серверов, решающий две задачи:
- обход геоблокировок (внешний VPS принимает соединение, трафик шлётся к Velocity в РФ);
- сохранение реальных 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, что ващето оч неудобно, поэтому я решил:
нужно сделать прокси-ретранслятор для майнкрафт серверов, который будет решать эту проблему. Вот собственно и сам проект.