Minecraft PaperMC 服务器部署指南 / 10 - 网络配置
10 - 网络配置
10.1 网络基础
10.1.1 Minecraft 网络架构
玩家客户端 ──────── 互联网 ──────── 路由器 ──── 服务端
| |
└── TCP 端口 25565 ────────────────────────────┘
局域网模式:
玩家客户端 ──── 局域网 ──── 服务端
10.1.2 默认端口
| 服务 | 端口 | 协议 | 说明 |
|---|
| Minecraft 服务端 | 25565 | TCP | 游戏连接 |
| RCON | 25575 | TCP | 远程控制台 |
| Query | 25565 | UDP | 服务器查询 |
| Spark Web | 4567 | TCP | 性能监控面板 |
10.2 端口配置
10.2.1 修改监听端口
# server.properties
# 游戏端口
server-port=25565
# 监听地址(留空监听所有接口)
server-ip=
# RCON 远程控制
enable-rcon=false
rcon.port=25575
rcon.password=your_strong_password
# Query 协议
enable-query=false
query.port=25565
10.2.2 多服务端端口分配
服务端 1 (Survival): 25565
服务端 2 (Creative): 25566
服务端 3 (MiniGame): 25567
Velocity 代理: 25577 (前端) → 25565/25566/25567 (后端)
10.3 防火墙配置
10.3.1 UFW(Ubuntu/Debian)
# 查看防火墙状态
sudo ufw status
# 启用防火墙
sudo ufw enable
# 允许 Minecraft 端口
sudo ufw allow 25565/tcp comment "Minecraft Server"
# 允许 SSH(重要!不要把自己锁在外面)
sudo ufw allow 22/tcp comment "SSH"
# 允许 RCON(仅限特定 IP)
sudo ufw allow from 你的IP to any port 25575 proto tcp comment "RCON"
# 允许 HTTP(如果使用 Dynmap)
sudo ufw allow 80/tcp comment "Dynmap Web"
# 拒绝所有其他入站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 查看规则列表
sudo ufw status verbose
# 删除规则
sudo ufw delete allow 25575/tcp
10.3.2 firewalld(CentOS/RHEL/Fedora)
# 查看防火墙状态
sudo firewall-cmd --state
# 允许 Minecraft 端口
sudo firewall-cmd --permanent --add-port=25565/tcp
sudo firewall-cmd --permanent --add-service=ssh
# 允许 RCON(仅限特定 IP)
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="你的IP"
port protocol="tcp" port="25575"
accept'
# 重新加载规则
sudo firewall-cmd --reload
# 查看当前规则
sudo firewall-cmd --list-all
10.3.3 iptables
# 允许 Minecraft 端口
sudo iptables -A INPUT -p tcp --dport 25565 -j ACCEPT
# 允许 SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许回环
sudo iptables -A INPUT -i lo -j ACCEPT
# 拒绝其他入站
sudo iptables -A INPUT -j DROP
# 保存规则(Debian/Ubuntu)
sudo iptables-save > /etc/iptables/rules.v4
# 保存规则(CentOS/RHEL)
sudo service iptables save
10.3.4 防火墙规则最佳实践
| 规则 | 端口 | 限制 | 说明 |
|---|
| SSH | 22 | 特定 IP 或密钥 | 远程管理 |
| Minecraft | 25565 | 全局 | 游戏连接 |
| RCON | 25575 | 特定 IP | 远程控制台 |
| Query | 25565/UDP | 可选 | 服务器查询 |
| HTTP | 80/443 | 按需 | Web 地图等 |
警告:永远不要开放 RCON 给所有 IP。RCON 使用明文密码,容易被暴力破解。
10.4 路由器端口转发
10.4.1 端口转发步骤
1. 登录路由器管理页面(通常为 192.168.1.1 或 192.168.0.1)
2. 找到端口转发/虚拟服务器设置
3. 添加规则:
- 外部端口: 25565
- 内部端口: 25565
- 内部 IP: 192.168.x.x(服务器局域网 IP)
- 协议: TCP
4. 保存并重启路由器
10.4.2 常见路由器品牌
| 品牌 | 设置路径 |
|---|
| TP-Link | 高级设置 → NAT 转发 → 虚拟服务器 |
| 华为 | 更多功能 → 网络设置 → 端口映射 |
| 小米 | 高级设置 → 端口转发 |
| ASUS | 高级设置 → WAN → 虚拟服务器/端口转发 |
| Netgear | 高级 → 高级设置 → 端口转发 |
10.4.3 验证端口是否开放
# 从外部测试端口
# 使用在线工具:https://www.yougetsignal.com/tools/open-ports/
# 或使用命令行
nc -zv your_public_ip 25565
# 使用 nmap
nmap -p 25565 your_public_ip
# 使用 curl
curl -s https://api.mcsrvstat.us/2/your_public_ip:25565
10.5 DDNS 动态域名
家用宽带通常没有固定公网 IP,需要 DDNS 来自动更新域名解析。
10.5.1 常用 DDNS 服务
| 服务 | 免费额度 | 域名格式 | 说明 |
|---|
| No-IP | 3 个主机名 | xxx.ddns.net | 老牌服务 |
| Dynu | 无限 | xxx.dynu.net | 免费额度大 |
| Cloudflare | 无限 | 你的域名 | 需自有域名 |
| 阿里云 DDNS | 需域名 | 你的域名 | 国内首选 |
| 花生壳 | 1 个 | xxx.oray.com | 国内老牌 |
10.5.2 Cloudflare DDNS 脚本
#!/bin/bash
# cloudflare-ddns.sh - Cloudflare 动态 DNS 更新脚本
# ============ 配置 ============
CF_API_TOKEN="your_cloudflare_api_token"
CF_ZONE_ID="your_zone_id"
CF_RECORD_NAME="mc.yourdomain.com"
CF_RECORD_ID="" # 首次留空,运行后自动获取
# ============ 获取当前公网 IP ============
CURRENT_IP=$(curl -s https://api.ipify.org)
echo "当前公网 IP: ${CURRENT_IP}"
# ============ 获取记录 ID ============
if [ -z "$CF_RECORD_ID" ]; then
CF_RECORD_ID=$(curl -s -X GET \
"https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records?type=A&name=${CF_RECORD_NAME}" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
| python3 -c "import json,sys; print(json.load(sys.stdin)['result'][0]['id'])")
echo "记录 ID: ${CF_RECORD_ID}"
fi
# ============ 更新 DNS 记录 ============
curl -s -X PUT \
"https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_RECORD_ID}" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data "{
\"type\": \"A\",
\"name\": \"${CF_RECORD_NAME}\",
\"content\": \"${CURRENT_IP}\",
\"ttl\": 60,
\"proxied\": false
}" | python3 -m json.tool
echo "DNS 更新完成: ${CF_RECORD_NAME} → ${CURRENT_IP}"
# 每 5 分钟更新一次
crontab -e
*/5 * * * * /opt/minecraft/scripts/cloudflare-ddns.sh >> /var/log/ddns.log 2>&1
10.6 DDoS 防护
10.6.1 DDoS 攻击类型
| 攻击类型 | 说明 | 影响 |
|---|
| SYN Flood | 大量 TCP SYN 包 | 耗尽连接表 |
| UDP Flood | 大量 UDP 包 | 耗尽带宽 |
| 连接 Flood | 大量合法连接 | 耗尽服务端资源 |
| 协议攻击 | 利用 Minecraft 协议 | 崩服或卡顿 |
| 放大攻击 | 利用 Query 协议 | 反射放大 |
10.6.2 基础防护措施
# 1. 启用 TCP SYN Cookie
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_syncookies
# 2. 调整 TCP 连接队列
echo 65535 | sudo tee /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 65535 | sudo tee /proc/sys/net/core/somaxconn
# 3. 启用 fail2ban
sudo apt install fail2ban
10.6.3 fail2ban 配置
# /etc/fail2ban/jail.d/minecraft.conf
[minecraft]
enabled = true
filter = minecraft
action = iptables-allports[name=minecraft]
logpath = /opt/minecraft/paper/logs/latest.log
maxretry = 5
findtime = 300
bantime = 3600
# /etc/fail2ban/filter.d/minecraft.conf
[Definition]
failregex = ^.*Connection reset by.*<HOST>.*$
^.*<HOST>.*lost connection.*$
ignoreregex =
sudo systemctl restart fail2ban
sudo fail2ban-client status minecraft
10.6.4 云 DDoS 防护服务
| 服务 | 价格 | 防护能力 | 说明 |
|---|
| Cloudflare Spectrum | 免费起 | 高 | 推荐,支持 TCP 代理 |
| TCPShield | 免费起 | 高 | Minecraft 专用 |
| CosmicGuard | 付费 | 高 | 游戏专用 |
| AWS Shield | 按量 | 高 | 云服务商防护 |
| OVH DDoS | 内置 | 中 | 服务器自带 |
10.6.5 Cloudflare Spectrum 配置
# Spectrum 可以代理 Minecraft 的 TCP 流量
# 1. 登录 Cloudflare 控制台
# 2. 进入 Spectrum 页面
# 3. 添加应用:
# - 应用类型: Minecraft
# - 源 IP: 你的服务器 IP
# - 源端口: 25565
# - 边缘端口: 25565
# 4. 更新 DNS 记录指向 Spectrum
10.7 网络性能优化
10.7.1 TCP 优化
# /etc/sysctl.conf
# 增大 TCP 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 启用 TCP BBR 拥塞控制
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 启用 TCP Fast Open
net.ipv4.tcp_fastopen = 3
# 应用设置
sudo sysctl -p
10.7.2 验证 BBR
# 检查 BBR 是否启用
sysctl net.ipv4.tcp_congestion_control
# 输出应为:net.ipv4.tcp_congestion_control = bbr
# 检查 BBR 模块
lsmod | grep bbr
10.8 SSL/TLS 与加密
10.8.1 Minecraft 协议加密
Minecraft 协议本身已内置加密(正版登录时),但以下场景需要额外加密:
- RCON 连接(明文传输)
- Web 面板(HTTP → HTTPS)
- 代理与后端通信
10.8.2 Velocity 代理加密
# velocity.toml
[advanced]
# 启用现代密钥交换
modern-key-encryption = true
# 启用玩家信息转发
player-info-forwarding = "modern"
# 密钥文件
forwarding-secret-file = "forwarding.secret"
10.9 IPv6 配置
10.9.1 启用 IPv6
# server.properties
server-ip=::
# 或指定 IPv4/IPv6 双栈
# server-ip=0.0.0.0 (仅 IPv4)
# 检查 IPv6 连通性
ping6 your_server_ipv6
# 防火墙允许 IPv6
sudo ufw allow from ::/0 to any port 25565 proto tcp
10.10 网络诊断
10.10.1 诊断命令
# 检查端口监听
ss -tlnp | grep 25565
netstat -tlnp | grep 25565
# 检查网络连接数
ss -s
# 检查带宽使用
iftop -i eth0
# 测试到服务器的延迟
ping your_server_ip
mtr your_server_ip
# 测试 Minecraft 连接
# 使用 mcsrvstat
curl -s https://api.mcsrvstat.us/2/your_server_ip:25565 | python3 -m json.tool
10.10.2 常见网络问题
| 问题 | 可能原因 | 解决方案 |
|---|
| 连接超时 | 防火墙/端口未转发 | 检查防火墙和路由器设置 |
| 连接被重置 | 服务器过载或崩溃 | 检查服务器状态和日志 |
| 高延迟 | 网络拥塞或路由问题 | 使用 MTR 追踪路由 |
| 间歇性断开 | 网络不稳定 | 检查服务器网卡和交换机 |
| 连接数限制 | Too many connections | 调整 max-players 和连接限流 |
10.11 本章小结
| 要点 | 说明 |
|---|
| 防火墙是最基本的保护 | UFW/firewalld 必须配置 |
| 端口转发用于家庭网络 | 路由器需要配置转发规则 |
| DDNS 解决动态 IP | Cloudflare 或 No-IP |
| DDoS 防护根据需求选择 | Cloudflare Spectrum 是免费首选 |
| TCP BBR 优化网络性能 | Linux 内核参数优化 |
| RCON 必须限制 IP | 明文协议,安全风险高 |
扩展阅读