保护 DayZ 服务器免受 DDoS 攻击

发布于 阅读时间 31 分钟

一台 DayZ 服务器真正需要哪些端口,如何加固 Steam 查询端口、BattlEye RCon、登录队列以及重启之后的启动阶段,以及攻击规模到什么程度就只能靠服务器前面的网络过滤。

一台 DayZ 服务器如果在晚上游戏进行到一半时把所有玩家踢下线,接着又从服务器浏览器里消失好几分钟,问题很少出在硬件上。多数情况下是有人正在攻击,而且时间恰好选在玩家最多的时候,或者恰好赶上计划好的重启。所以想为 DayZ 服务器做好 DDoS 防护,两件事都需要:服务器上干净的端口放行,以及服务器前面网络里的过滤。本文先讲您不花额外费用就能自己加固的部分,然后讲这些措施在技术上到哪里为止,最后讲服务器前面必须发生什么。

本文所有内容针对使用 serverDZ.cfg 的自有 DayZ 独立服务器,无论它跑在 Windows Server 上,还是通过兼容层跑在 Debian 和 Ubuntu 上。Bohemia Interactive 并没有为 Stable 分支提供可用于生产环境的原生 Linux 服务器程序,实验性的 Linux 构建只接受实验性客户端。Linux 命令以 root 身份书写,普通用户请在前面加上 sudo。

如果攻击正在进行:现在不要改动 serverDZ.cfg,也不要重启服务器。DayZ 重启会重新加载 Mod 和中央经济系统,要花掉好几分钟,而这几分钟里服务器一定是离线的。请先保存测量数据(见“记录日志”一节),攻击结束后这些数据就没有了。

DayZ 服务器为什么经常成为 DDoS 攻击的目标

DayZ 身上集中了好几个特点,使一台服务器成为称手的目标。第一,社区服务器会自己公开地址:为了出现在游戏内置的服务器浏览器和 DZSA Launcher 里,它必须回答 Steam 查询,而这个回应里明文包含 IP 地址和端口。所以攻击者不需要查出任何东西,他只需要读一份列表。

第二,一台 DayZ 服务器的作息是公开的。几乎所有项目都每三到四小时自动重启一次,用聊天消息提前通知,并把时间表写进 Discord。正好落在这个时间窗口里的攻击有双重效果:服务器本来就刚好不可用,而卡在等待界面上的玩家会转去别处。

第三,玩家的投入很高。在 DayZ 里,一次时机不巧的宕机不只是让人窝火,而是丢掉的装备、中断的突袭,以及一座毫无防护地留在世界里的基地。正因如此,被封禁的玩家、结仇的团伙和竞争项目是最常见的幕后主使。通过常见的 booter 服务发动一次攻击,既不需要什么本事,也花不了多少钱。

第四,DayZ 的全部流量都走 UDP。UDP 没有可以强制要求的连接建立过程,源地址也可以伪造。因此攻击者既不必进入您的服务器,也不必正确地跟它对话,就能制造负载。连厂商自己都受影响,2025 年 2 月就是例子:Bohemia Interactive 为 DayZ 和 Arma Reforger 提供的在线服务被 DDoS 攻击打了一个多星期,2025 年 2 月 3 日得到确认,到 2025 年 2 月 6 日仍未结束,社区服务器也一同受到影响。DDoS 攻击具体是什么,请看文章 什么是 DDoS 攻击?。

DayZ 服务器的端口:事实表

DayZ 服务器只说 UDP,没有 TCP 游戏端口。在 DayZ 上真正固定下来的唯一数值是作为游戏端口的 2302/UDP,其余都可以配置,而且随主机商不同而不同。所以请查看您自己的启动命令行和您自己的 serverDZ.cfg,不要指望某个默认值。

端口 协议 用途 设置位置 是否对公网开放
2302 UDP 游戏端口,包含语音传输在内的全部游戏流量 启动命令行中的 -port=2302 是
2303 到 2305 UDP 游戏端口之上被引擎一并占用的端口段 由 -port 推导得出 通常是
2305 或 27016 UDP Steam 查询端口:在服务器浏览器和 DZSA Launcher 里的条目 serverDZ.cfg 中的 steamQueryPort 是,否则服务器不可见
可自由选择,常见 2305 或 2310 UDP BattlEye RCon,供 BEC 或 DaRT 这类管理工具使用 BEServer_x64.cfg 中的 RConPort 否
22 TCP 操作系统的 SSH 访问 sshd_config 仅限您自己的地址
3389 TCP Windows 服务器上的远程桌面 系统设置 否
8080 和 2022 TCP 游戏面板的网页界面和 SFTP,这里以 Pterodactyl 为例 面板配置 否

有两个数值经常引起混乱,所以这里说清楚。Steam 查询端口:Bohemia 随附的示例配置写的是 steamQueryPort = 2305;,而很大一部分主机商使用 27016/UDP。两个值都有效,唯一起决定作用的是您文件里的那个值。BattlEye RCon 端口:这里根本没有强制标准。流传很广的经验法则是游戏端口加三,也就是 2305,另一些主机商设成 2310。从 DayZ 1.13 起,BattlEye 会可靠地读取 BEServer_x64.cfg 中的 RConPort 参数,在那之前这个端口很难预测。

由此产生一个很多运营者都会踩的坑:绝对不要把 steamQueryPort 和 RConPort 设成同一个值。如果您的配置把 2305 用于 Steam 查询,RCon 就该放到另一个端口上,例如 2310。

为什么 Steam 查询端口是最脆弱的端口

Steam 查询端口回答三种查询:A2S_INFO、A2S_PLAYERS 和 A2S_RULES。A2S_INFO 返回服务器名称、地图、玩家数和版本,A2S_PLAYERS 返回已连接玩家的名字,A2S_RULES 返回设置好的服务器变量。这些回应中的每一个都明显大于触发它的请求,而这正是这个端口双重危险的原因。

对作为目标的您来说,这意味着:攻击者每个请求只用几个字节就能让您的查询端口忙起来,而您的服务器每次都要组装并发出一份完整的回应。对第三方来说,这意味着:攻击者可以用伪造的源地址查询您的服务器,把回应引向他真正的目标。这时您的服务器不只是受害者,还是放大器。正因如此,Valve 在 2020 年 12 月为 A2S_INFO 增加了一次挑战值查询:服务器先回一个随机数,提问方必须把它送回来。这削弱了放大效果,但没有终结它,因为远不是每一次查询都走这条路。

DayZ 在这里有一个别的游戏没有的特点:向您发起查询的是两份互相独立的服务器列表,一份是内置的社区服务器浏览器,另一份是流传很广的 DZSA Launcher。所以把查询端口直接关掉不是一个选项,因为那样您的项目会同时从两份列表里消失,尽管直连仍然能用。正确的答案是限速,而不是封禁。

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

这一节最长,而且是故意的。配置干净的 DayZ 服务器能靠自己扛住小型和中型攻击,无论它放在谁那里。

1. 清点:您的 DayZ 服务器到底开了哪些端口

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

ss -lnup
ss -lntup

在 Windows Server 上,命令提示符给出同样的画面:

netstat -ano -p UDP | findstr "2302 2303 2304 2305 27016"

要看的是本地地址那一列。0.0.0.0:2302 表示“整个互联网都能访问”,127.0.0.1:2310 表示“仅本机”,不需要放行。接着请直接从您的配置文件里读出真实数值,而不要依赖某篇教程:

grep -iE "steamQueryPort|maxPlayers|password|enableWhitelist|verifySignatures" serverDZ.cfg
grep -iE "RConPort|RestrictRCon" battleye/BEServer_x64.cfg

攻击者眼中的样子,由一次从外面、用另一台机器执行的 UDP 端口扫描给出:

nmap -Pn -sU -p 2302-2310,27015-27020 YOUR.SERVER.IP.ADDRESS

2. 只放行启动命令行和 serverDZ.cfg 真正需要的端口

DayZ 对外只需要两项放行:游戏端口段和查询端口。其余都限制到您自己的地址上,或者干脆不要对外公开。用 UFW 的写法如下,而且顺序必须完全照此执行,以免把自己关在门外:

ufw allow 22/tcp comment 'SSH'
ufw allow 2302:2305/udp comment 'DayZ 游戏端口'
ufw allow 27016/udp comment 'DayZ Steam 查询'
ufw allow from 203.0.113.10 to any port 2310 proto udp comment 'BattlEye RCon'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

请把 203.0.113.10 换成您自己的地址,把 27016 换成您 steamQueryPort 那一行里真正写着的值。包含自救办法的完整说明见 设置 UFW 防火墙而不把自己关在门外。在 Windows 服务器上原则相同:每个端口组一条入站规则,远程桌面限制到自己的地址,其余全部封掉。

3. 限制 Steam 查询端口,而不是把它关掉

按源地址设一个上限,就能把真正的服务器列表和查询洪水攻击区分开。服务器浏览器以秒为间隔查询您,攻击者以毫秒为间隔:

iptables -I INPUT -p udp --dport 27016 -m hashlimit --hashlimit-name dayz_query --hashlimit-mode srcip --hashlimit-above 10/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p udp --dport 2302 -m hashlimit --hashlimit-name dayz_game --hashlimit-mode srcip --hashlimit-above 600/sec --hashlimit-burst 900 -j DROP

第一条规则丢弃来自同一来源、持续每秒超过十次的 Steam 查询,第二条丢弃每秒超过 600 个的游戏数据包。这两个数字都是起始值,不是真理。一台有 60 名玩家的满员服务器产生的数据包比空服多得多,设得太严会把自己的玩家踢出去,或者让自己从服务器列表里掉下去。请先在正常运行状态下测一周。

纯 iptables 规则在重启后就没了。在 Debian 和 Ubuntu 下这样保存:

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

在 UFW 下,这类规则应写进 /etc/ufw/before.rules,否则下一次 ufw reload 时就会消失。此外 Steam 的服务器库自带一个针对无连接数据包的刹车:只要某个地址在 200 毫秒的窗口内发来的 A2S 包超过设定值,环境变量 STEAM_GAMESERVER_RATE_LIMIT_200MS 就会把这个地址的全部 A2S 包丢弃。

第三点完全不花钱:如果您的 Discord 机器人或项目网站显示在线人数,请不要让每位访客各自去查询服务器,而是按固定间隔把结果缓存下来。这样一个访问量很大的状态页面每个间隔只产生一次查询,而不是每位访客一次。

4. 把 BattlEye RCon 从公网上撤下来

BattlEye 是 DayZ 的反作弊组件,在 serverDZ.cfg 中用 BattlEye = 1; 开启。远程管理则放在一个单独的文件里,也就是 BattlEye 目录中与 BEServer_x64.dll 并列的 BEServer_x64.cfg,这个目录由启动命令行中的 -BEpath= 指定:

RConPassword ALongRandomPassword
RConPort 2310
RestrictRCon 0

为此有三条规则。第一,RCon 端口是 UDP,不是 TCP。一条不小心写成 proto tcp 的防火墙规则什么都过滤不到,同时还让管理工具跑空。第二,请把这个端口限制到管理员的地址上。没有固定地址的人,就把这个端口从外面完全封掉,直接在服务器上运行管理工具,通过 SSH 或远程桌面进去。第三,RestrictRCon 1 会限制可通过 RCon 执行的命令,一旦有不止一个人拥有访问权,这就是正确的设置。

一个开放的 RCon 端口同时是两样东西:一份逐个试密码的邀请,以及又一个可以被灌包的 UDP 端口。只要放行范围缩小到少数几个地址,这两样就都没了。

5. 登录队列、白名单和槽位耗尽

DayZ 不会同时处理所有连接,而是通过一个队列来处理。serverDZ.cfg 中有五个值控制它:

maxPlayers = 60;
loginQueueConcurrentPlayers = 5;
loginQueueMaxPlayers = 100;
guaranteedSlots = 10;
maxPing = 200;

loginQueueConcurrentPlayers 规定同时被放进来的玩家数(默认 5),loginQueueMaxPlayers 限制队列本身(常见值在 100 到 500 之间)。槽位耗尽正是从这里下手:攻击者不需要带宽,他只需要足够多的账号或连接尝试来占住队列。真正的玩家于是再也进不来,尽管服务器在技术上运行得完好无损。guaranteedSlots 为您的团队保留位置,让您在正是这种局面下还能自己上服。

对付这种情况,内置的白名单有用。它用 enableWhitelist = 1; 激活,随后读取文件 profiles/whitelist.txt,每行一个 Steam64 ID。任何没有列入的 ID 在连接时都会被拒绝。这个文件在服务器启动时读入,因此改动需要重启一次。serverDZ.cfg 里额外设一个 password 效果类似,但更弱,因为密码会被转手传开,而 Steam64 ID 不会。

有一点必须清楚:白名单保护的是您的玩家位置,不是您的线路。灌包攻击您服务器的人根本不想进服。他的数据包会被拒绝,但已经到达了,而这才是关键。

6. Mod、签名校验和重启之后的时间窗口

在 DayZ 上,Mod 不只是个舒适度话题,它们是攻击面的一部分。serverDZ.cfg 中有四个设置无论如何都该设上:

verifySignatures = 2;
forceSameBuild = 1;
allowFilePatching = 0;
BattlEye = 1;

verifySignatures = 2 会用对应的 .bisign 签名校验每一个 PBO 文件,为此需要 keys 目录中配套的 .bikey 文件。forceSameBuild = 1 要求客户端的游戏版本与服务器完全一致。allowFilePatching = 0 拒绝以改动过的游戏文件启动的客户端。这些设置没有一个能挡住流量型攻击,但这三条都堵住了经过改动的客户端把您服务器搞乱的那条路。

第二点更重要,而且几乎总被忽略:启动阶段。DayZ 服务器启动时先从启动命令行加载它的 Mod 列表,然后加载带全部战利品表的中央经济系统。在一台重度改装的服务器上,这轻易就是好几分钟,而这几分钟里服务器对任何一次 Steam 查询都不作回应:

./DayZServer -config=serverDZ.cfg -port=2302 -profiles=./profiles -BEpath=./battleye -mod=@CF;@YourMod;@AnotherMod -cpuCount=4 -dologs -adminlog -netlog -freezecheck

因为几乎每个项目都每三到四小时重启一次,还把这个计划公布出去,所以对攻击者来说这个时间窗口太容易踩准了。有三个对策有效,而且不花钱。把 Mod 列表尽量控制得短,每多一个 Mod 都会延长正好这个窗口。把重启时间放在不整的时刻,而不是整点。还有,实测一次您的启动到底要多久,不要估计:设上 timeStampFormat = "Full"; 和一个 logFile,之后日志里就有这个时长。

7. 连接跟踪、接收缓冲区和内核参数

一个常被忽视的瓶颈是内核的连接跟踪。UDP 虽然没有连接,内核仍然会为每一对源地址和目标地址建立一个条目。表一满,服务器连正常的数据包也会丢弃,日志里会出现“nf_conntrack: table full”。当前数量和上限用这条命令查看:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

对一台纯游戏服务器来说,干净的解决办法是干脆不去跟踪游戏流量,另外把网卡的接收缓冲区和队列加大:

iptables -t raw -A PREROUTING -p udp --dport 2302 -j NOTRACK
iptables -t raw -A OUTPUT -p udp --sport 2302 -j NOTRACK
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.rmem_default=1048576
sysctl -w net.core.netdev_max_backlog=5000
sysctl -w net.netfilter.nf_conntrack_max=524288

注意:NOTRACK 和带状态的规则互相排斥。把游戏端口从跟踪中排除的人,就不能再为这个端口使用带 -m conntrack --ctstate 的规则,否则放行就不再生效。要长期有效,sysctl 的值应放进 /etc/sysctl.d/,否则下次重启后就没了。

8. 您的 IP 地址就写在服务器浏览器里

这里值得诚实,而不是想当然:一台公开 DayZ 服务器的 IP 地址是保不住密的。每个连过一次的玩家都知道它,服务器浏览器把它公布出去,DZSA Launcher 还会把它缓存下来。换地址给您争取到的是几小时,很少有几天。

更有效的是两个习惯。不要在别处额外公布裸的 IP 地址,也就是不要写在置顶的 Discord 帖子里,也不要放在项目网站上。还要清理您的 DNS 记录:一条指向前一个地址、被遗忘的 A 记录会让任何更换都失去意义,而大多数更换正是败在这上面。谁要是在旧服务器上还留着一个状态服务,就等于把新地址也一起告诉了别人。

9. 记录日志,让您在攻击中不必猜

最重要的一步是几乎没人事先做的那一步:在一切正常的时候先建立基线。没有正常值,事后您就说不清每秒 4 万个数据包是很多,还是就是个普通的周六晚上。在服务器一侧,为此请打开内置的日志:

timeStampFormat = "Short";
logAverageFps = 300;
logPlayers = 300;
logFile = "server_console.log";

其中 logAverageFps 是 DayZ 给出的最诚实的数值。如果服务器帧率下降而玩家数不变,那是 Mod 或经济系统的问题。如果帧率保持稳定而玩家不断掉线,那问题在网络上。在系统一侧,用 apt-get install -y vnstat sysstat 让测量常驻运行,事件发生时四条命令就够了:

sar -n DEV 1 10
ip -s link show eth0
dmesg -T | tail -50
tcpdump -ni eth0 udp port 2302 -c 200 -q

用 tcpdump 时有一条铁律:一定要用 -c 限制数量,满载状态下抓包会让本来已经过载的服务器更吃力。如何解读这些数值,见 在服务器上识别 DDoS 攻击。

自我防护到哪里为止:带宽和数据包速率

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

指标 数值 这对您的 DayZ 服务器意味着什么
典型游戏服务器的接入带宽 1 Gbit/s 每秒 125 兆字节,再多线路就满了
64 字节包大小时的数据包速率 1 Gbit/s 里约为每秒 149 万个数据包 普通的服务器内核只能处理其中的几十万个
针对游戏服务器项目的常见攻击规模 5 到 50 Gbit/s 是您接入带宽的五到五十倍
KernelHost 服务器上过滤过的峰值 超过 473.4 Gbit/s,每秒超过 4150 万个数据包 在这个量级上任何本地设置都不再起作用
KernelHost 上针对一台游戏服务器过滤过的 UDP 洪水攻击 超过 112.2 Gbit/s 必须在服务器前面的网络里就被终结
serverDZ.cfg 中 maxPlayers 的默认值 60 您自己每秒数据包的正常值必须自己测,它随项目而异

在 DayZ 上,数据包速率常常比带宽先出事,原因很简单:游戏流量由很多小的 UDP 包组成,而不是少数几个大包。所以一次连您线路的三分之一都填不满的攻击,仍然可能让您的服务器瘫掉,因为算力都花在丢包上了。运营者的体验是“负载根本不高,可是所有人都有延迟尖峰,一个接一个被踢下线”。

流量型攻击必须在服务器前面的网络里就被终结。这不是产品说法,而是物理。

DayZ 的 DDoS 防护:KernelHost 用什么来应对

每台服务器上都在运行的持续防护

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

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

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

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

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

  • 专用防护 IP,来自法兰克福的核心网络,您的服务器会在我们自己的网络内切换到它。您这边不需要做任何改造。
  • 按端口和协议自行管理的防护规则,就在客户中心里:您可以分别设置 2302/UDP 上允许什么、查询端口上允许什么、RCon 端口上允许什么。在 DayZ 上,正是这种区分才是抓手,因为游戏流量和查询流量看起来完全不同。
  • 改动实时生效,因此您可以在攻击进行时随时调整,而不用等一张工单。
  • 与具体游戏匹配的防护策略,同样适用于重度改装的服务器,以及任意 TCP 或 UDP 端口上的自研程序。

两级防护对比

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

对大多数 DayZ 项目来说,标配的持续防护配上干净的服务器配置就够了。Advanced DDoS Protection 针对的是有人把这件事当成私人恩怨的情况。目前把 DayZ 服务器放在别处的人无法后加这套防护:它是网络的一部分,只对放在 KernelHost 的服务器生效。通往它的路是迁移,而不是一个附加产品。

常见错误及解决办法

“我的服务器从 DZSA Launcher 和服务器浏览器里消失了,但直连还能进”:多数情况下这不是攻击,而是查询端口。要么 steamQueryPort 里的值和防火墙里的不一致,要么过严的速率限制把服务器列表的查询丢掉了。在怀疑有攻击之前,请先把这两个值对照一遍。

“自从我过滤了端口,RCon 就连不上了”:BattlEye RCon 走 UDP。在同一个端口上用 proto tcp 放行什么用也没有。另外请检查 RConPort 和 steamQueryPort 是不是不小心设成了同一个值。

“我换了 IP 地址,两小时后又离线了”:攻击者拿到新地址的来源和旧地址一样,多半是服务器浏览器、某个 Discord 状态机器人,或者一条旧的 DNS 记录。换地址是争取时间,不是解决办法。

“攻击每天都恰好在重启时到来”:这不是巧合。重启计划写在 Discord 里,还在游戏内通知,而在 Mod 和经济系统加载的时候服务器本来就不作回应。更短的 Mod 列表、不整的重启时间,以及一套持续运行而不是等攻击来了才反应的过滤,能让这个套路失效。

“所有玩家都有延迟尖峰,可网络很平静”:那就不是 DDoS 攻击。请先看 logAverageFps,确认服务器帧率是否下降,然后再看中央经济系统和 Mod 列表。如果 sar -n DEV 1 10 没有异常,问题就不在网络上。

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

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

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

要点总结

  • DayZ 服务器对外只需要两样东西:从 2302/UDP 起的游戏端口段,以及您 steamQueryPort 那一行里的 Steam 查询端口。其余都该受限或关闭。
  • BattlEye RCon 端口没有强制标准,走 UDP,并在 BEServer_x64.cfg 中用 RConPort 设置。它绝不该进公网,也绝不该和查询端口设成同一个值。
  • 查询端口要限速,不要关闭:把它关掉的人会从服务器浏览器和 DZSA Launcher 里消失,尽管直连仍然能用。
  • 白名单、guaranteedSlots 和登录队列保护的是您的玩家位置,挡得住槽位耗尽,但挡不住冲向您线路的带宽。
  • DayZ 服务器最危险的时间窗口是每三到四小时一次的计划重启,因为 Mod 和中央经济系统要加载好几分钟,而这个时刻是公开的。
  • 攻击量约达 1 Gbit/s,或者每秒几十万个数据包以上时,起决定作用的只有服务器前面的网络,而不再是您的防火墙。
  • 在 KernelHost,两级持续防护包含在每个服务器套餐中,不额外收费,也不使用黑洞路由。当您想自己掌控按端口设置的规则时,再加上每月 50.00 欧元起的 Advanced DDoS Protection。

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

常见问题

我的 DayZ 服务器刚刚离线了。怎么判断是不是 DDoS 攻击?
请看网卡的数据包速率,而不是 CPU 负载。用 sar -n DEV 1 10 可以看到每秒的数据包数和字节数,用 ip -s link show eth0 可以看到丢包计数器。如果入站数据包远远高于正常值,而服务器本身几乎没在干活,那就是攻击。如果网络计数器没有异常,一切却仍然卡顿,请看 logAverageFps:玩家数不变而服务器帧率下降,问题就出在某个 Mod 或中央经济系统上,而不在网络上。
DayZ 服务器真正需要哪些端口?
对外正好两样东西:游戏端口 2302/UDP 连同 2303 到 2305 这一段,以及 serverDZ.cfg 中写在 steamQueryPort 下的 Steam 查询端口。DayZ 只说 UDP,没有 TCP 游戏端口。而 BEServer_x64.cfg 里的 BattlEye RCon 端口、22/TCP 上的 SSH、3389/TCP 上的远程桌面,以及游戏面板的端口都不该进公网,而要限制到管理员的地址上。
DayZ 的 Steam 查询端口是 2305 还是 27016?
两种都出现过,所以您必须去查,而不是猜。Bohemia Interactive 随附的示例配置写的是 steamQueryPort = 2305,而很大一部分主机商使用 27016/UDP。唯一有效的是您自己 serverDZ.cfg 里的那个值,也正是这个端口必须在防火墙里放行。它一旦被封,您的服务器就会从游戏的服务器浏览器和 DZSA Launcher 里消失,而直连仍然能用。这种情况经常被当成攻击,其实并不是。
BattlEye RCon 端口在哪里设置,它该进公网吗?
BattlEye RCon 端口用 BattlEye 目录中 BEServer_x64.cfg 文件里的 RConPort 一行设置,同一个文件里还有 RConPassword 和 RestrictRCon。它没有强制的默认值:流传很广的经验法则是游戏端口加三,也就是 2305,另一些主机商设成 2310。从 DayZ 1.13 起,BattlEye 会可靠地读取这个参数。这个端口走 UDP,不走 TCP,而且只该开给管理员的地址。请注意别让它和 steamQueryPort 用同一个值。
DayZ 里的白名单对 DDoS 攻击有用吗?
对槽位耗尽有用,对流量型攻击没用。白名单在 serverDZ.cfg 中用 enableWhitelist = 1 激活,随后读取文件 profiles/whitelist.txt,每行一个 Steam64 ID,改动要重启一次才生效。它和 guaranteedSlots 一起,能防止外人占住登录队列、让真正的玩家再也进不来。但灌满您线路的攻击者根本不想进服:他的数据包会被拒绝,却已经到达了。对此只有服务器前面网络中的过滤才有用。
为什么针对 DayZ 服务器的攻击常常恰好在重启时到来?
因为重启计划是公开的,而这个时间窗口在技术上也正合适。几乎每个 DayZ 项目都每三到四小时自动重启一次,在游戏内通知,并写进 Discord。启动时服务器先从启动命令行加载 Mod 列表,然后加载中央经济系统,这段时间里它对任何一次 Steam 查询都不作回应。恰好这时开始的攻击,只是延长一段本来就在进行的停机。更短的 Mod 列表、不整的重启时间,以及一套持续运行的过滤,能让这个套路失效。
用 iptables 或 UFW 能挡住 DDoS 攻击吗?
对付小型攻击和不讲究的机器人可以,对付流量型攻击不行。服务器上的防火墙规则处理的是已经跑过您线路的数据包。线路一旦被打满,您玩家的数据包在更早的地方就已经过不来了,跟您的规则集写得多好完全无关。尽管如此,在查询端口上按源地址限速、给游戏端口加 NOTRACK、把接收缓冲区调大,都是有意义的。流量型攻击必须在服务器前面的网络里就被终结。
攻击到多大规模,我的 DayZ 服务器就撑不住了?
典型的游戏服务器挂在 1 Gbit/s 上,也就是每秒 125 兆字节。针对游戏服务器项目的攻击通常在 5 到 50 Gbit/s 之间。同样重要的是数据包速率:在 64 字节包大小时,1 Gbit/s 里约能装进每秒 149 万个数据包,而普通的服务器内核只能处理其中的几十万个。因为 DayZ 发的是很多小的 UDP 包,数据包速率多半比带宽先出事:线路连三分之一都没填满,服务器就已经停住了。
在 KernelHost,我的 DayZ 服务器会在攻击期间离线吗?
不会。我们不使用黑洞路由。您的 IP 地址留在网络里,被丢弃的只有恶意数据包。防护分两级:全球清洗网络中 17 Tbps 的清洗能力,以及法兰克福 3.2 Tbps 的 Arbor 实时过滤。它持续运行,不需要先对攻击做出反应,因此开头不会有服务器消失的那几分钟。作为参照:KernelHost 的服务器上已经过滤过超过 473.4 Gbit/s、每秒超过 4150 万个数据包的攻击。
KernelHost 的 DDoS 防护要额外付费吗?什么时候需要 Advanced DDoS Protection?
两级持续防护包含在每个服务器套餐中,不额外收费,自服务器开通起即生效,您既不用订购也不用开启。只有当您的项目被有针对性地连打几周,而且您想自己掌控过滤时,才需要 Advanced DDoS Protection。您会获得一个专用防护 IP,并在客户中心里自行按端口和协议管理防护规则,也就是把 2302/UDP、查询端口和 RCon 端口分开设置。改动实时生效。价格每月 50.00 欧元起,PrePaid 预付费,没有最低合约期,也没有开通费。

DayZ DayZ DDoS 防护 游戏服务器防护 2302 端口 Steam 查询端口 BattlEye serverDZ.cfg Advanced DDoS Protection