内网穿透MC服务端获取玩家信息
本文最后更新于32 天前,其中的信息可能已经过时,如有错误请发送邮件到v1st233@gmail.com

  由于vps的小内存带不动server,只能考虑内网穿透。但是内网穿透有个问题:服务端的控制台上全是内网ip,没办法获取到玩家的真实ip。
  想要获取到玩家ip,目前经过测试有两种方案:

  • Proxy Protocol + mmproxy
  • velocity

  先介绍下安装配置方式,再说优缺点

Proxy Protocol + mmproxy

Proxy Protocol + mmproxy原理请看 NPS内网穿透获取真实IP

NPS配置

  新增一个TCP隧道,服务端端口25565,目标端口25566,代理协议选V2。

NPS配置

内网配置

  在运行 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 -ddocker-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),类似于BungeeCordWaterfall。它用于将多个 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
  • 添加modproxy-compatible-forge-1.1.7.jar并启动一次MC,下载链接
  • 配置服务端:config/pcf-common.toml中的forwardingSecret,写入和velocity的forwarding.secret相同的转发密钥,重启MC。

完成

  现在客户端可以通过VPS连接了,只是现在内网任何端口都无法连接,想要内网连接,运行MC的机器上也必须安装配置一个一模一样的Velocity。

缺点

  • 没办法直连内网的服务器,内网也必须配置一个相同配置的Velocity才能连接
  • 在客户端上显示的是原版服务端,无法提示mod兼容情况
文章地址:https://www.qingh.xyz/proxy-for-forge-server/

暂无评论 IP地址位置数据由 纯真CZ88 提供支持

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇