由于vps的小内存带不动server,只能考虑内网穿透。但是内网穿透有个问题:服务端的控制台上全是内网ip,没办法获取到玩家的真实ip。
想要获取到玩家ip,目前经过测试有两种方案:
Proxy Protocol + mmproxy
velocity
先介绍下安装配置方式,再说优缺点
Proxy Protocol + mmproxy
Proxy Protocol + mmproxy
原理请看 NPS内网穿透获取真实IP
NPS配置
新增一个TCP隧道,服务端端口25565
,目标端口25566
,代理协议选V2。
内网配置
在运行 npc 的设备上mkdir mmproxy && cd mmproxy
,创建一个名为 Dockerfile 的文件,粘贴如下内容:
FROM golang:1.21-alpine AS builder
RUN apk add --no-cache git
WORKDIR /app
RUN git clone https://github.com/path-network/go-mmproxy .
RUN go build -o mmproxy .
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/mmproxy .
RUN echo '#!/bin/sh' > /app/start.sh && \
echo '' >> /app/start.sh && \
echo '# 设置路由规则' >> /app/start.sh && \
echo 'ip rule add from 127.0.0.1/8 iif lo table 123 2>/dev/null || true' >> /app/start.sh && \
echo 'ip route add local 0.0.0.0/0 dev lo table 123 2>/dev/null || true' >> /app/start.sh && \
echo '' >> /app/start.sh && \
echo '# 如果没有提供端口映射,使用默认的' >> /app/start.sh && \
echo 'if [ -z "$PORT_MAPPINGS" ]; then' >> /app/start.sh && \
echo ' PORT_MAPPINGS="222:22"' >> /app/start.sh && \
echo 'fi' >> /app/start.sh && \
echo '' >> /app/start.sh && \
echo '# 解析并启动所有端口映射' >> /app/start.sh && \
echo 'for mapping in $(echo $PORT_MAPPINGS | tr "," " "); do' >> /app/start.sh && \
echo ' listen_port=$(echo $mapping | cut -d: -f1)' >> /app/start.sh && \
echo ' target_port=$(echo $mapping | cut -d: -f2)' >> /app/start.sh && \
echo ' echo "启动端口映射: $listen_port -> 127.0.0.1:$target_port"' >> /app/start.sh && \
echo ' /app/mmproxy -l "0.0.0.0:$listen_port" -4 "127.0.0.1:$target_port" -6 "[::1]:$target_port" &' >> /app/start.sh && \
echo 'done' >> /app/start.sh && \
echo '' >> /app/start.sh && \
echo '# 保持容器运行' >> /app/start.sh && \
echo 'wait' >> /app/start.sh && \
chmod +x /app/start.sh
ENTRYPOINT ["/app/start.sh"]
然后使用这个命令编译:
docker build -t mmproxy:latest .
然后新增一个docker-compose.yml
:
version: '3'
services:
mmproxy:
image: mmproxy:latest
container_name: mmproxy
restart: always
network_mode: host
cap_add:
- NET_ADMIN
environment:
- PORT_MAPPINGS=25566:25565
最后docker compose up -d
或docker-compose up -d
运行。
连接
内网的25565
和VPS的25565
都可可以客户端连接了,server的控制台也可以看到客户端的真实ip。
缺点
最大也是最致命的(for me):
mmproxy不支持IPv6客户端->IPv6&IPv4 VPS->内网IPv4
。
跑MC的机器上也跑着不少不能对外开放的东西,只能用其它IPv6的设备中转下。
也就是说,客户端、VPS、MC服务端都必须同时使用IPv6或同时使用IPv4
Velocity转发
在 Minecraft服务器领域,Velocity是一个专为高性能设计代理服务器(proxy server),类似于BungeeCord或Waterfall。它用于将多个 Minecraft 后端服务器连接在一起,使玩家在它们之间无缝切换(比如从大厅服跳转到小游戏服)。 —by chatgpt
仅用到Velocity中player-info-forwarding-mode
的现代转发功能。
由于我用的是Forge,本身不支持Velocity的转发,可以通过Proxy-Compatible-Forge
实现Velocity的转发。
NPS设置
新增一个TCP隧道,服务端端口25566
,目标端口25566
,代理协议选关闭。
Velocity配置
- 到下载地址下载velocity
- VPS上
mkdir velocity && cd velocity && vim docker-compose.yml
,添加以下内容:
services:
velocity:
image: eclipse-temurin:17-jre-alpine
container_name: velocity
working_dir: /app
network_mode: "host"
restart: always
volumes:
- ./velocity:/app
command: ["java", "-jar", "velocity.jar"]
mkdir velocity
,复制velocity.jar到velocity/velocity
中vim velocity/velocity.toml
添加以下内容:
# ──────────────────────────────────────────────────
# Velocity Proxy 主配置
config-version = "2.7" # 配置版本,不要修改
bind = "[::]:25565" # 代理监听地址和端口
motd = "1.19.2 | 一个普通的IC2" # 服务器列表显示内容(支持 MiniMessage)
show-max-players = 20 # 列表上显示的最大在线人数
online-mode = false # 关闭 Velocity 正版验证,由后端完成
force-key-authentication = false # 启用密钥验证,防止假冒连接
prevent-client-proxy-connections = true # 是否阻止客户端直连(可根据需求调整)
# 玩家信息转发配置(现代转发)
player-info-forwarding-mode = "modern" # 使用 Velocity modern forwarding
forwarding-secret-file = "forwarding.secret" # 转发秘钥文件,与服务器端保持一致
announce-forge = true # Forge/Fabric 探针显示
ping-passthrough = "all" # 保留 Mod 列表于服务器列表中显示
# 后端服务器列表
[servers]
ic2 = "127.0.0.1:25566"
try = ["ic2"]
# 强制主机名映射(如需)
[forced-hosts]
"mc.qingh.xyz" = ["ic2"]
# 高级设置
[advanced]
compression-threshold = 256
compression-level = -1
login-ratelimit = 3000 # 连接频率限制,单位毫秒
connection-timeout = 5000 # 连接超时时长
accepts-transfers = false # 是否接受转移连接请求(MC 1.20+)
failover-on-unexpected-server-disconnect = true
announce-proxy-commands = true
log-player-connections = true
# 查询相关配置(无需启用则关闭)
[query]
enabled = true
port = 25565
show-plugins = false
map = "一个普通的IC2"
- 添加
velocity/forwarding.secret
并写入自定义一个复杂点的转发密钥
最终目录结构如下:
root@vps# tree .
.
├── docker-compose.yml
└── velocity
├── forwarding.secret
├── velocity.jar
└── velocity.toml
docker compose up -d
启动。
MC配置
- 修改服务器端口为25566
- 添加mod
proxy-compatible-forge-1.1.7.jar
并启动一次MC,下载链接 - 配置服务端:
config/pcf-common.toml
中的forwardingSecret,写入和velocity的forwarding.secret相同的转发密钥,重启MC。
完成
现在客户端可以通过VPS连接了,只是现在内网任何端口都无法连接,想要内网连接,运行MC的机器上也必须安装配置一个一模一样的Velocity。
缺点
- 没办法直连内网的服务器,内网也必须配置一个相同配置的Velocity才能连接
- 在客户端上显示的是原版服务端,无法提示mod兼容情况
暂无评论 IP地址位置数据由 纯真CZ88 提供支持