保护 Project Zomboid 服务器免受 DDoS 攻击

发布于 阅读时间 27 分钟

一台独立的 Project Zomboid 服务器真正需要哪些端口,servertest.ini 里哪些指令要紧,为什么连接时的 Mod 比对会让服务器变得可攻击,以及攻击规模到什么程度就只能靠服务器前面的网络过滤。

想为 Project Zomboid 服务器做好 DDoS 防护,首先得知道攻击者到底往哪里打。一台独立服务器只占用两个 UDP 端口,16261 和 16262,而且两个都必须对公网开放,否则谁也进不来。本文按照真出事时才管用的顺序来讲:先是您在接下来十分钟里不花额外费用就能自己做的事,然后是这些措施在技术上到哪里为止,最后是服务器前面的网络里必须发生什么。

本文所有内容针对运行在 Debian 12、Debian 13、Ubuntu 22.04 LTS 或 Ubuntu 24.04 LTS 上的独立服务器(SteamCMD 应用编号 380870),Build 41 和 Build 42 都适用。配置文件名为 servertest.ini,位于 ~/Zomboid/Server/,世界数据位于 ~/Zomboid/Saves/Multiplayer/。命令以 root 身份书写,普通用户请在前面加上 sudo。

如果攻击正在进行:现在不要改动 servertest.ini,也不要重启服务器。请先保存测量数据(第 9 节),攻击结束后这些数据就没有了。重启还会额外搭上服务器加载世界所需的时间,而这正是攻击者想从您这里拿走的东西。

Project Zomboid 服务器为什么会成为 DDoS 攻击的目标

Project Zomboid 是一款角色永久死亡、世界会持续存在好几个月的游戏。在危险局面进行到一半时掉线,在这里的代价比几乎任何其他类型都大:角色没了,而世界会记住这件事。正因如此,一次宕机才成了武器。晚上 8 点的一次攻击打的不是随便哪些玩家,而是一个固定的社群,而且恰好打在他们最舍不得失去的地方。

再加上攻击本身既不花钱也不需要本事。按次购买的攻击服务,在圈内叫 booter 或 stresser,点几下就能针对一个 IP 地址和一个端口发动,而在 Project Zomboid 上目标永远是同一个:16261 UDP。谁要是跟一个被封禁的玩家有过节,或者在经营一个竞争的社群,手里就有了这样一件既不需要知识、也花不了多少钱的工具。

还有一点,游戏服务器必须公开自己的地址。servertest.ini 里写着 Public=true 时,服务器就会出现在游戏自带的浏览器里,而接入了 Steam 的服务器本来就能在 Steam 服务器浏览器里看到。所以问题从来不是攻击者能不能找到您的 IP 地址,而只是他往上打的时候会发生什么。

技术上最难受的一点留在最后:全部游戏流量都走 UDP。UDP 没有可以强制要求的连接建立过程,每个数据包都自成一体,而且源地址可以伪造。因此攻击者既不必进入您的服务器,也不必正确地跟它对话,就能制造负载。DDoS 攻击具体是什么,请看文章 什么是 DDoS 攻击?。

Project Zomboid 服务器真正需要哪些端口

一台独立的 Project Zomboid 服务器正好需要两个开放端口:16261 UDP 和 16262 UDP。游戏官方的端口清单里没有第三个。在 servertest.ini 中它们是两条分开的指令,第二个端口不会自动从第一个推导出来:

DefaultPort=16261
UDPPort=16262
SteamPort1=8766
SteamPort2=8767
RCONPort=27015
RCONPassword=

分工很明确。16261 UDP 承载游戏流量和连接建立,并回答服务器浏览器的查询。16262 UDP 是客户端直连用的端口。缺了第一个,谁也找不到服务器;缺了第二个,您的玩家看得见条目却仍然进不来。游戏里最有名的那条报错信息,说 16262 端口没有开放,正是由此而来。

端口 协议 用途 servertest.ini 中的指令 是否应对公网开放
16261 UDP 游戏流量、连接建立、回答服务器浏览器的查询 DefaultPort=16261 是,必须
16262 UDP 客户端直连 UDPPort=16262 是,必须
8766 和 8767 UDP 服务器的 Steam 接入 SteamPort1、SteamPort2 否,官方必需清单里只有 16261 和 16262
27015 TCP RCON 远程控制 RCONPort=27015 否,仅限您自己的地址
22 TCP 操作系统的 SSH 访问 不在 servertest.ini 中 受限开放

有两点经常出问题。第一,每个服务器实例都需要两个空闲的 UDP 端口。在同一台机器上再跑第二个世界的人,要为它另分一对,例如 16274 和 16275,并把两个值都写进第二个实例的 servertest.ini。第二,SteamPort1 和 SteamPort2 在配置文件里写着 8766 和 8767,但它们属于 Steam 接入,不属于游戏流量。只有在您的服务器不开它们就不出现在 Steam 列表里时才开放,不要为了以防万一先开着。

在花钱之前,您自己能做的事

这一节最长,而且是故意的。配置干净的服务器能靠自己扛住小型和中型攻击,无论它放在谁那里。它替不了您挡下流量型攻击,但能让廉价的攻击打不出效果,也能让您在真出事时手里有数字,而不是猜测。

1. 清点:到底有什么在监听

在写下第一条规则之前,先看清楚您的服务器对外提供了什么。不要猜,要查:

ss -lntup

要看的是本地地址那一列。0.0.0.0:16261 和 [::]:16261 表示“整个互联网都能访问”,127.0.0.1:27015 表示“仅本机”,不需要放行。请把结果和您的配置对一遍,而不是指望默认值:

grep -E "^(DefaultPort|UDPPort|SteamPort1|SteamPort2|RCONPort|Public|Open|MaxPlayers|MaxAccountsPerUser)=" ~/Zomboid/Server/servertest.ini

从外面做一次端口扫描,就能看到攻击者眼中的样子。因为 Project Zomboid 只用 UDP,所以必须做 UDP 扫描,纯 TCP 扫描根本看不到游戏端口:

nmap -Pn -sU -p 16261,16262,8766,8767 YOUR.SERVER.IP.ADDRESS
nmap -Pn -p- --min-rate 1000 YOUR.SERVER.IP.ADDRESS

2. 只让 16261 和 16262 对外开放

对外两条放行就够了,其余的要么收紧,要么干脆不公开。用 UFW 的写法如下,而且顺序必须完全照此执行,以免把自己关在门外:

ufw allow 22/tcp comment "SSH"
ufw allow 16261/udp comment "Project Zomboid"
ufw allow 16262/udp comment "Project Zomboid 直连"
ufw allow from 203.0.113.10 to any port 27015 proto tcp comment "RCON"
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

请把 203.0.113.10 换成您自己的地址。启用防火墙时的顺序决定了您会不会把自己关在门外。包含自救办法的完整说明见文章 设置 UFW 防火墙而不把自己关在门外。万一真的发生了:KernelHost 的 KVM 根服务器和独立服务器可以通过客户中心里的 VNC 控制台进入系统,它独立于虚拟机自身的网络运行。

关于数据库和附加服务一句话:Project Zomboid 一个都不需要。除游戏之外还在 0.0.0.0 上监听的东西,要么来自早先的安装,要么来自某个管理面板,它们该绑定到 127.0.0.1 上,或者直接关掉。

3. 把 27015 端口上的 RCON 从公网上撤下来

RCON 是服务器的远程控制,在 Project Zomboid 上运行在 27015 TCP 上。出厂的 servertest.ini 里写着 RCONPassword=,没有值。要用 RCON 的人请设一个长的随机密码,因为这个协议是明文传输的,而一个能被访问到、密码又弱的 RCON 端口会把服务器整个交出去,连一个攻击数据包都不需要。

安全的做法是根本不对外开放这个端口,而是通过 SSH 端口转发访问它。之后您在本地跟 127.0.0.1:27015 通信:

ssh -N -L 27015:127.0.0.1:27015 root@YOUR.SERVER.IP.ADDRESS

不需要 RCON 的人,把密码字段留空,端口保持关闭。一个访问不到的服务,既没法被逐个试密码,也没法被灌包。

4. 按源地址限制数据包速率

对付小型攻击和不讲究的机器人,按源地址设上限就有效。因为两个游戏端口正好相邻,一条覆盖这一段的规则就够了:

iptables -I INPUT -p udp --dport 16261:16262 -m hashlimit --hashlimit-name pz_udp --hashlimit-mode srcip --hashlimit-above 400/sec --hashlimit-burst 600 -j DROP
iptables -L INPUT -n -v

这条规则在同一个源地址持续每秒发出超过 400 个数据包时就丢弃 UDP 包。这个值是起始值,不是真理:30 名玩家聚在同一座城市的服务器,产生的流量明显多于 4 名玩家分散在地图各个角落的服务器,而设得太严会把自己的玩家踢出去。请先在正常运行状态下测一周,再把上限设成峰值的若干倍。

还有两点提示。纯 iptables 规则在重启后就没了,在 Debian 和 Ubuntu 下这样保存:

apt-get install -y iptables-persistent
netfilter-persistent save

在 UFW 下,这类规则应写进 /etc/ufw/before.rules,否则下一次 ufw reload 时就会消失。请用 iptables -L INPUT -n -v 里的命中计数器检查规则到底有没有被匹配到。计数器一直是零,说明它放错了位置。

5. 给连接跟踪减压

一个常被忽视的瓶颈在内核里。连接跟踪连 UDP 也会按源地址和端口各建一条记录,而使用伪造源地址的洪水攻击几秒钟就能把这张表填满。表一满,服务器连正常的数据包也会丢弃,日志里会出现“nf_conntrack: table full”。当前数量和上限用这条命令查看:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

Project Zomboid 的游戏流量不需要状态跟踪,因为 UDP 本来就没有状态。所以您可以把两个游戏端口从这张表里排除出去:

iptables -t raw -I PREROUTING -p udp --dport 16261:16262 -j NOTRACK

这能明显给内核减压。要注意:只有在服务器直接收到这些数据包时这条规则才合适。如果前面还有一层地址转换,例如在带端口映射的容器环境里,就不能设它,否则返回方向的数据包就对不上了。

6. 加固加入流程和槽位

下面这些行不花一分钱,而且对所有走正规加入途径进来的东西都有效:

Password=A-LONG-RANDOM-PASSWORD
Open=false
MaxAccountsPerUser=1
MaxPlayers=32
DenyLoginOnOverloadedServer=true

Password 是共用的服务器密码,和单个玩家的账号是分开的。Open=false 表示只有管理员事先建好的账号才能加入,这就是游戏自带的白名单。MaxAccountsPerUser 限制单个 Steam 用户在您的服务器上能建多少个账号,默认值 0 表示不限。MaxPlayers 出厂值是 32,文档明确警告超过这个数会出现地图加载不良和失同步。

PingLimit 在这里是个陷阱。这条指令会把延迟超过给定毫秒数的玩家踢出去,出厂值是 0,即关闭。在攻击之下,最先升高的是您自己玩家的延迟,因此定得太紧恰好会踢掉您想留住的人。请把这个上限关掉,或者设得宽松些。

还有一点必须清楚:白名单保护的是您的游戏逻辑,不是您的线路。灌包的攻击者根本不想加入。他的数据包会被拒绝,但它们已经到了,而这才是关键。

7. 连接时的 Mod 比对是您服务器最贵的一秒

Project Zomboid 在连接时检查的不只是一个密码。服务器的 Mod 列表写在 servertest.ini 的两行里:WorkshopItems 里是数字形式的 Steam 创意工坊 ID,Mods 里是各个 Mod 的加载 ID,两者都用分号分隔。加入时客户端会比对这份列表,自动通过 Steam 补下缺少的创意工坊内容,然后才开始接收世界数据。此外,DoLuaChecksum=true 时服务器还会比对游戏文件的校验和,并把文件与自己不一致的客户端踢出去。

对攻击者来说恰恰是这一点有意思,因为这些活都发生在真正参与游戏之前。每一次连接尝试都要让服务器为版本、校验和、Mod 列表和地图数据花掉计算时间,最后被拒绝的那一次也一样。Mod 列表越长,每一次尝试就越贵。因此连接洪水攻击在重度改造的服务器上比在原版服务器上更有效,而它需要的带宽只是流量型攻击的一小部分。游戏本身自带两个刹车:

DenyLoginOnOverloadedServer=true
LoginQueueEnabled=true
LoginQueueConnectTimeout=60

DenyLoginOnOverloadedServer 在服务器过载时拒绝新的登录,而不是把正在进行的这一局也一起拖垮。LoginQueueEnabled 让加入者排队,而不是同时处理,LoginQueueConnectTimeout 规定一次加入最多允许多长时间,默认 60 秒,允许的范围是 20 到 1200。

有一个细节必须一起讲,因为它经常被用错误的方式解决:Linux 服务器上有一个已被记录在案的缺陷,DoLuaChecksum 会误报,把玩家挡在外面。运营者因此把这项检查关掉。这可以理解,但也去掉了一道用来挡住游戏文件被改过的客户端的关卡。必须关掉它的人,服务器密码、白名单和账号数量上限就要设得更严。

8. 服务器列表、UPnP 和自己的地址

这里值得实话实说,而不是自我安慰:您的 IP 地址保不了密。Public=true 会让服务器出现在游戏自带的浏览器里,而按照文档,接入了 Steam 的服务器本来就能在 Steam 服务器浏览器里看到。所以 Public=false 只是让新玩家看不到您,并不能让您隐身。

Public=true
PublicName=我的 Zomboid 服务器
UPnP=false
server_browser_announced_ip=

UPnP 出厂值是 true,会让服务器尝试自己在互联网网关上开一个端口映射。在一台租用的服务器上并没有这样的网关,这个尝试注定落空,应该关掉。server_browser_announced_ip 保持为空,除非您的服务器有多个地址、并且要指定用其中一个对外出现。以后改用专用防护 IP 时,您又会用到这个字段。

两个习惯比任何设置都管用。不要自己在任何地方公布裸的 IP 地址,Discord 频道里不要,项目网站上也不要,而是给玩家一个主机名。换地址时最经典的坑是旧的 DNS 记录:一条指向旧地址、被遗忘的 A 记录会让任何更换都失去意义。

9. 在一切正常时先做测量

最重要的一步是几乎没人事先做的那一步:在一切都平静的时候先建立基线。没有正常值,事后您就说不清每秒 4 万个数据包是很多,还是就是个普通的周六晚上。用 apt-get install -y vnstat sysstat 让测量常驻运行。事件发生时四条命令就够了:

sar -n DEV 1 10
ip -s link show eth0
tcpdump -ni eth0 "udp port 16261 or udp port 16262" -c 200 -q
journalctl -u zomboid --since "-15 min" | tail -50

前两条显示接口的数据包速率和丢包计数器,第三条是流量的一小段抽样,第四条是服务器自己的消息,前提是它作为 systemd 服务运行(请把服务名改成您自己的)。用 tcpdump 时有一条铁律:一定要用 -c 限制数量,满载状态下抓包会让本来已经过载的服务器更吃力。如何解读这些数值,见 在服务器上识别 DDoS 攻击。

这些措施到哪里为止:带宽和数据包速率

现在说没有任何配置文件能解决的那一部分。前面所有措施都跑在您的服务器上,也就是线路的末端。防火墙规则处理的是已经跑过网线的数据包。您可以把它丢弃,但没法让它没被发出来。

算一下就清楚了。一台典型的游戏服务器挂在 1 Gbit/s 上,也就是每秒 125 兆字节,只要有人发得比这更多,线路就满了。第二个量是数据包速率,而它往往比带宽更早出事:在 64 字节的小包情况下,1 Gbit/s 里能装进每秒约 149 万个数据包,而普通的服务器内核视 CPU 和网卡而定,只处理其中几十万个就会开始丢包。所以一次连您线路三分之一都没占满的攻击,照样能让您的服务器瘫掉。运营者的体验是“负载根本不高,可是什么都没了”。

指标 数值
1 Gbit/s 换算成字节 每秒 125 兆字节
64 字节时 1 Gbit/s 里能装进的数据包 每秒约 149 万个
服务器内核能处理其中多少 每秒几十万个
针对社群游戏服务器的常见攻击规模 5 到 50 Gbit/s
KernelHost 过滤过的、打向一台游戏服务器的 UDP 洪水攻击 超过 112.2 Gbit/s
KernelHost 服务器上有记录的最大攻击 超过 473.4 Gbit/s,每秒超过 4150 万个数据包

针对游戏服务器社群的常见攻击在 5 到 50 Gbit/s 之间,也就是一条普通线路的五倍到五十倍。对此没有任何本地设置可用。流量型攻击必须在服务器前面的网络里就被终结。

KernelHost 用什么应对针对游戏服务器的 DDoS 攻击

每台服务器都标配的持续防护

KernelHost 的 DDoS 防护分两级,持续生效,您不需要开启、订购或配置任何东西:

  • 第 1 级:全球清洗网络中 17 Tbps 的清洗能力。流量型攻击在靠近来源的地方就被清洗掉,不会到达数据中心。
  • 第 2 级:法兰克福的 Arbor 实时过滤,容量 3.2 Tbps。就在服务器前面,逐个数据包地识别并丢弃与协议相关的攻击特征。

有两点是关键。防护持续运行,不需要先对攻击做出反应,所以开头不会有服务器失联的那几分钟。而且不使用黑洞路由:您的 IP 地址留在网络里,被丢弃的只有恶意数据包。把 IP 地址从网络里撤下来的做法,对您而言和攻击者达到的结果一样。哪些游戏和协议在覆盖范围内,见 实时游戏服务器 DDoS 防护。

针对长期被攻击项目的 Advanced DDoS Protection

有些项目不是偶尔被打,而是被有针对性地连打几周。为此有 Advanced DDoS Protection,每月 50.00 欧元起,PrePaid 预付费,没有最低合约期,也没有开通费。区别不在于容量更大,而在于控制权:

  • 专用防护 IP,来自法兰克福的核心网络,您的服务器会在我们自己的网络内切换到它。您这边不需要做任何改造,只要把新地址写到您玩家找服务器的那个地方就行。
  • 按端口和协议自行管理的防护规则,就在客户中心里:您规定 16261 和 16262 UDP 上允许什么,其余一律保持关闭,而且不用为此写工单。
  • 改动实时生效,因此您可以在攻击进行时随时调整。
  • 与应用匹配的防护策略。常见游戏有现成的策略,经过修改的程序和自研程序则由您自己按端口和协议设置规则。Project Zomboid 在这里格外容易精确圈定,因为全部游戏流量都走两个相邻的 UDP 端口。

两级防护对比

对比项 标配的 DDoS 持续防护 Advanced DDoS Protection
价格 包含在每个服务器套餐中,不额外收费 每月 50.00 欧元起,PrePaid 预付费
过滤能力 17 Tbps 全球清洗,加上法兰克福 3.2 Tbps 的 Arbor 实时过滤 同样的两级过滤
IP 地址 您服务器本身的 IP 地址 额外的专用防护 IP
规则集 自动防护策略,无需配置 在客户中心里按端口和协议设置自己的规则
变更 自动跟进 实时生效,攻击进行时也可以
黑洞路由 否 否
合约期 与服务器套餐绑定 PrePaid 预付费,没有最低合约期,没有退订通知期,也没有开通费

对大多数 Project Zomboid 服务器来说,标配的持续防护配上干净的配置就够了。Advanced DDoS Protection 针对的是有人把这件事当成私人恩怨的情况。

常见错误及解决办法

“我的玩家收到提示,说 16262 端口没有开放”:这不是攻击,而是少了一条放行。服务器需要两个端口,16261 UDP 和 16262 UDP,而且必须是 UDP 规则。在同样的端口号上放行 TCP 没有任何作用。请用 ufw status verbose 以及从外面做一次 UDP 扫描,确认两个端口真的都开着。

“我换了 IP 地址,两个小时后又掉线了”:攻击者拿到新地址的渠道和拿到旧地址的一样,多半是列表条目、一个带状态显示的 Discord 机器人,或者一条旧的 DNS 记录。在 Project Zomboid 上换地址还有额外代价:客户端会把地图数据按地址和端口存在本地,目录名形如 123.45.0.12_16261_...,位于 Zomboid/Saves 下。换过之后,每个玩家都要重新从服务器下载已探索过的地图。所以换地址是有额外代价的拖延时间,不是解决办法。

“我的 iptables 规则不起作用”:常见原因有三个。规则排在 UFW 的链后面,永远轮不到它;规则在上次重启后就没了(这时用 netfilter-persistent save,或者写进 /etc/ufw/before.rules);或者攻击是流量型的,而规则在一条已经满了的线路上正常工作。请用 iptables -L INPUT -n -v 检查命中计数器是否在增长。

“玩家在加入时被踢出去,服务器本身却照常运行”:这几乎总是比对的问题,不是攻击。原因可能是客户端和服务器的版本不一致、缺少或过期的创意工坊条目,或者校验和不匹配。客户端通常会指出哪些 Mod 不一致。请把 WorkshopItems 和 Mods 一行一行对过去。

“每隔几分钟就有延迟尖峰,然后又好了”:这是短时攻击的常见样子,它只打到玩家被烦得不玩为止。请先看网络计数器,不要看 CPU 负载。如果 sar -n DEV 1 10 和丢包计数器都没有异常,那就不是攻击,而是负载:同一个地图单元格里玩家太多、某个开销很大的 Mod,或者留给 Java 实例的内存太少。

“我原来的主机商把我的 IP 地址封了”:那就是黑洞路由。主机商用它保护自己的网络,对您来说结果和一次成功的攻击完全一样,而且通常在攻击结束后还要持续几个小时。有疑问时请直接问清楚:是过滤还是黑洞路由。这个答案对您可用性的影响,比任何硬件参数都大。

“我在 tcpdump 里看不到任何异常”:如果流量已经在前面的网络里被过滤掉了,服务器上当然就什么都收不到。这在过滤正常工作时是常态。反过来说:线路一旦被打满,您甚至可能连用来测量的那条 SSH 会话都进不来。这时请使用客户中心里的 VNC 控制台。

要点总结

  • 一台独立的 Project Zomboid 服务器正好需要两个开放端口:16261 UDP(DefaultPort)和 16262 UDP(UDPPort)。两者在 servertest.ini 中是分开的指令。
  • RCON 运行在 27015 TCP 上,出厂配置里登记的密码是空的。这个端口不该暴露在公网上,而应限制到您自己的地址,或者干脆关闭。
  • 连接时的 Mod 比对是最贵的一环:版本、校验和、创意工坊列表和地图数据都要花计算时间,每一次被拒绝的尝试也一样。DenyLoginOnOverloadedServer 和登录队列就是针对它的内置刹车。
  • 服务器密码、Open=false 和 MaxAccountsPerUser=1 保护的是游戏逻辑。面对一条被打满的线路,这些设置一个都不起作用。
  • 物理上限是定死的:1 Gbit/s 等于每秒 125 兆字节,在 64 字节包大小时约为每秒 149 万个数据包。针对游戏服务器的常见攻击在 5 到 50 Gbit/s。
  • 流量型攻击必须在服务器前面的网络里就被终结。在 KernelHost,这是全球清洗网络中 17 Tbps 的清洗能力,加上法兰克福 3.2 Tbps 的 Arbor 实时过滤,不额外收费,也不使用黑洞路由。
  • 长期被攻击的人可以用 Advanced DDoS Protection 自己掌控过滤:专用防护 IP、按端口和协议的规则、改动实时生效,每月 50.00 欧元起。

如果您的服务器已经放在 KernelHost,过滤就已经在工作,您什么都不用做。若仍然发现异常,请开一个 支持工单,以便为您的 IP 地址调整过滤规则。攻击正在进行时,您还可以通过 WhatsApp 紧急聊天联系我们:+43 650 8209883。

常见问题

我的 Project Zomboid 服务器刚刚离线了。这是 DDoS 攻击吗?
请先看接口的数据包速率,而不是 CPU 负载。用 sar -n DEV 1 10 可以看到每秒的数据包数和字节数,用 ip -s link show eth0 可以看到丢包计数器。如果入站数据包远远超过您的正常值,而服务器本身几乎没在干活,那就是攻击。如果网络计数器没有异常,游戏却依然卡顿,原因就在游戏内的负载上:同一个地图单元格里玩家太多、某个开销很大的 Mod,或者留给 Java 实例的内存太少。
运行一台 Project Zomboid 服务器需要开放哪些端口?
正好两个:16261 UDP 和 16262 UDP。在 servertest.ini 中它们写作 DefaultPort=16261 和 UDPPort=16262,这是两项分开的设置,第二个端口不会自动从第一个推导出来。两者都必须按 UDP 放行,在同样的端口号上放行 TCP 没有任何作用。同一台机器上的每一个额外实例都需要自己的一对空闲 UDP 端口。RCON 端口 27015 TCP 不该暴露在公网上。
16262 端口是做什么的,为什么我的客户端报告它没有开放?
16262 UDP 是客户端直连用的端口,16261 UDP 承载游戏流量并回答服务器浏览器的查询。如果只开了 16261,您的玩家能在列表里找到条目,却仍然进不来,客户端就会报告 16262 端口没有开放。原因几乎总是防火墙或路由器上少了一条 UDP 放行,而不是攻击。请从外面用 UDP 端口扫描检查两个端口。
我需要 8766 和 8767 端口吗?
它们在 servertest.ini 中写作 SteamPort1=8766 和 SteamPort2=8767,属于服务器的 Steam 接入。官方的必需端口清单只列出 16261 UDP 和 16262 UDP。所以只有在您的服务器不开它们就不出现在 Steam 服务器列表里时,才放行 8766 和 8767,不要为了以防万一先开着。每一个额外开放的端口都是一块可以被打的面,每一条放行都应该有一个您说得出来的理由。
Project Zomboid 的 RCON 端口 27015 有风险吗?
只要它开在公网上就有。RCON 是服务器的完整远程控制,在 Project Zomboid 上运行在 27015 TCP 上,而且是明文传输。出厂的 servertest.ini 里 RCONPassword 没有值。要用 RCON 就设一个长的随机密码,并且只为您自己的地址放行这个端口,或者通过 SSH 端口转发访问它。不需要 RCON 的人,把这个端口保持关闭。
为什么连接时的 Mod 比对会让服务器变得可攻击?
因为这些活都发生在有人真正开始玩之前。加入时服务器会比对游戏版本、游戏文件的校验和,以及来自 WorkshopItems 和 Mods 的 Mod 列表,客户端自动补下缺少的创意工坊内容,然后才开始接收地图数据。每一次尝试都要花计算时间,服务器最后拒绝掉的那一次也一样,而 Mod 列表越长,每一次尝试就越贵。针对它起作用的是 DenyLoginOnOverloadedServer、通过 LoginQueueEnabled 启用的登录队列,以及一个服务器密码。
现在赶紧换 IP 地址有用吗?
只在短时间内有用,而且在 Project Zomboid 上还有额外代价。攻击者通常在几分钟到几小时内又会找到新地址,因为它写在服务器列表的条目里、被带状态显示的 Discord 机器人公布出去,或者还有一条旧的 DNS 记录指着它。此外游戏还有一个特点:客户端会把已探索的地图存在本地一个由 IP 地址和端口命名的目录里。换过之后,每个玩家都要重新从服务器下载这些数据。
我能用 UFW 或 iptables 抵挡 DDoS 攻击吗?
对付小型攻击和不讲究的机器人可以,对付流量型攻击不行。服务器上的防火墙规则处理的是已经跑过您线路的数据包。线路一旦被打满,您玩家的数据包在更早的地方就已经过不来了,跟您的规则集写得多好完全无关。有意义的仍然是在 16261 和 16262 上按源地址设速率上限,以及给内核里的连接跟踪减压。流量型攻击必须在服务器前面的网络里就被终结。
攻击到多大规模,我的服务器就撑不住了?
一台典型的游戏服务器挂在 1 Gbit/s 上,也就是每秒 125 兆字节。针对游戏服务器社群的攻击通常在 5 到 50 Gbit/s 之间。同样重要的是数据包速率:在 64 字节包大小时,1 Gbit/s 里能装进每秒约 149 万个数据包,而普通的服务器内核只能处理其中的几十万个。所以一次攻击即使没有把带宽用满,也照样能让您的服务器瘫掉。
在 KernelHost,我的服务器会在攻击期间离线吗?
不会。我们不使用黑洞路由。您的 IP 地址留在网络里,被丢弃的只有恶意数据包。防护分两级:全球清洗网络中 17 Tbps 的清洗能力,以及法兰克福 3.2 Tbps 的 Arbor 实时过滤。它持续运行,不需要先对攻击做出反应,因此开头不会有您的玩家被挡在外面的那几分钟。
KernelHost 的 DDoS 防护要额外付费吗?什么时候需要 Advanced DDoS Protection?
两级持续防护包含在每个服务器套餐中,不额外收费,自服务器开通起即生效,您既不用订购也不用开启。只有当您的项目不是偶尔被打,而是被有针对性地连打几周,并且您想自己掌控过滤时,才需要 Advanced DDoS Protection。您会获得一个专用防护 IP,并在客户中心里自行按端口和协议管理防护规则,改动实时生效。价格每月 50.00 欧元起,PrePaid 预付费,没有最低合约期,也没有开通费。

Project Zomboid Project Zomboid DDoS 防护 游戏服务器防护 16261 端口 16262 端口 servertest.ini RCON Advanced DDoS Protection