保护 Lineage 2 服务器免受 DDoS 攻击
一台 Lineage 2 私服真正需要哪些端口,为什么 2106 端口上的登录服务器才是真正的目标,为什么攻击会随开服季节性出现,以及攻击规模到什么程度就只有服务器前面的网络过滤才有用。
一台 Lineage 2 私服,如果到了晚上没人能越过登录界面,而已经在游戏世界里的玩家却毫无干扰地继续玩,那它没有硬件问题。这是针对登录服务器的 DDoS 攻击留下的指纹,而 Lineage 2 的 DDoS 防护正要从这里下手。本文先讲您不花额外费用就能自己加固的部分,然后讲这些措施在技术上到哪里为止,最后讲那之后服务器前面的网络里必须发生什么。
本文所有内容针对运行在 Debian 12、Debian 13、Ubuntu 22.04 LTS 或 Ubuntu 24.04 LTS 上的 L2J 及其分支(L2J-Mobius、aCis),以及带 AuthD、CacheD 和 L2Server 的 L2OFF 服务端包。命令以 root 身份书写,普通用户请在前面加上 sudo。
如果攻击正在进行:现在不要改动配置,也不要重启登录服务器或游戏服务器。请先保存测量数据(见“记录日志”一节),攻击结束后它们就没了。
为 Lineage 2 服务器做 DDoS 防护:私服为什么会被攻击
一台 Lineage 2 私服集中了好几个特点,使它成为称手的目标,而 Lineage 2 的 DDoS 防护必须正好针对这些特点下手。第一,您的地址是公开的,而且从一开始就是:玩家下载一个打过补丁的 System 文件夹,其中的 l2.ini 里写着 ServerAddr= 这一行,后面就是您登录服务器的 IP 地址。任何装过一次您项目的人都知道这个地址,与他是否创建过角色无关。
第二,玩家群体绑在固定的时间上。攻城战、史诗 Raid Boss 和活动都写在日程表里,正好在这个小时的一次宕机是最显眼的。第三,各个项目之间直接竞争:谁开一台服务器,争的就是同一个周末另外三个项目也在争的那几千名玩家。在这个圈子里,把竞争对手打下线是一种常用策略。攻击本身是作为服务买来的(圈内叫 booter 或 stresser),下单的人既不需要什么本事,也花不了多少钱。DDoS 攻击具体是什么,请看文章 什么是 DDoS 攻击?。
为什么 2106 端口上的登录服务器才是真正的目标
Lineage 2 被分成两个独立的进程:一个登录服务器,以及一个或多个游戏服务器。客户端先连到 2106 TCP 上的登录服务器,完成登录,从那里拿到带有游戏服务器外部地址和端口的服务器列表,然后再建立第二条连接,连到 7777 TCP 上的游戏服务器。两个进程各有自己的配置文件、自己的端口和自己的承载上限。
由此得出 L2 运营者反复描述的那个攻击模式:针对 2106 的洪水攻击只堵住新的登录。已经在游戏世界里的人会继续玩,直到他自己掉线。于是在线人数是慢慢往下掉,而不是一下子掉光,论坛里写的是“服务器在跑,可我进不去”。正是这个画面把针对登录服务器的攻击和针对游戏服务器的攻击区分开来,后者会让所有人同时掉线。
登录服务器还是更便宜的目标,因为双方的开销并不对等。L2J 的登录服务器在启动时会生成十个 1024 位的 RSA 密钥对和二十个 Blowfish 密钥作为储备。每一次登录尝试只让客户端付出发送一个数据包的代价,却让服务器付出一次用 RSA 私钥做的解密。而一个未完成的会话会占住一个位置,直到内置的计时器把它丢掉:LOGIN_TIMEOUT 在源码里是 60 秒。默认设置 MaxConnectionPerIP = 50 允许每个源地址有五十条并发连接。于是一千个源地址就足以造成 5 万条同时打开的会话,而每条都可能存在长达一分钟。
此外还有一个把它和多数游戏服务器区分开来的特点:Lineage 2 完全走 TCP。厂商为这款游戏列出的 TCP 端口是 80、2009、2106 和 7777,UDP 只有用于域名解析的 53 端口。也就是说,没有需要过滤的 UDP 游戏流量,但源地址伪造的经典 SYN 洪水攻击直接有效,而内核的连接跟踪会成为第一个瓶颈。
为什么针对 Lineage 2 服务器的攻击会随开服季节性出现
针对 Lineage 2 私服的攻击集中出现在开服前后,因为开服的日期和时间在几周前就已公开。Lineage 2 项目的开服日历按编年史(Interlude、High Five、Classic、Essence)列出即将到来的开服,还附上倍率和准确的开服时间,并且每天更新。攻击者不需要侦察什么:对他最有利的时间点写在运营者自己的公告里。
第二个原因是经济上的。一台 Lineage 2 私服的钱是在前面挣的:整个玩家基础是在头几天招来的,捐赠落在头几周,之后人口持续萎缩。一个在第一个小时进不来的玩家,会转去同一个周末开服的那个项目,而这样的项目总是有的。所以开服当天一小时的宕机,付出的代价不是一小时的营收,而是服务器整个生命周期里的一部分。
第三个原因是技术上的。在开服的那一刻,成千上万名玩家同时尝试登录。登录服务器在这一分钟本来就已经到极限,额外的一次洪水攻击几乎和峰值负载分不出来。一次在安静的周二不会有任何后果的攻击,放在开服这个小时就够用了。运行中已公告的时间点也一样:攻城战和史诗 Raid Boss 写在日程表里,出于同样的原因是受欢迎的攻击窗口。开服的涌入过去之后,动机又会下降,所以运营者体验到的攻击是一波一波的,而不是持续状态。
真正相关的那些端口
下面这张表列出一台 Lineage 2 私服的各个端口、对应的配置文件,以及设定这个值的指令。默认值来自 L2J 自带的配置文件,以及 L2OFF 服务端包的安装说明。
| 端口和协议 | 服务 | 文件和指令 | 是否放进开放网络? |
|---|---|---|---|
| 2106 TCP | 登录服务器,游戏客户端的登录(L2J) | login/config/LoginServer.properties:LoginserverPort = 2106、LoginserverHostname = * |
是 |
| 7777 TCP | 游戏服务器,游戏世界(L2J) | game/config/Server.properties:GameserverPort = 7777、GameserverHostname = * |
是 |
| 9014 TCP | 登录服务器接受各游戏服务器的注册 | LoginServer.properties:LoginPort = 9014、LoginHostname = 127.0.0.1;Server.properties 中的对应项:LoginHost = 127.0.0.1、LoginPort = 9014 |
否 |
| 3306 TCP | MariaDB 或 MySQL,每台 L2J 服务器的数据库 | Server.properties:URL = jdbc:mysql://localhost/lineage2、Login = root |
否 |
| 2106 TCP(L2OFF) | AuthD,官方服务端文件的登录服务 | AuthD 配置:serverExPort = 2106 |
是 |
| 7777 TCP(L2OFF) | L2Server,官方服务端文件的游戏世界 | l2server.ini:worldport = 7777 |
是 |
| 2104 和 2108 TCP(L2OFF) | AuthD 内部(serverPort 和 serverIntPort) |
AuthD 配置 | 否 |
| 2006 和 2008 TCP(L2OFF) | CacheD,L2Server 与数据库之间的桥 | CacheD 配置 | 否 |
| 2002 TCP(L2OFF) | L2NPC,把 NPC 加载进游戏世界 | l2npc.ini |
否 |
| 1433 TCP(L2OFF) | Microsoft SQL Server,官方服务端文件的数据库 | 数据库配置 | 否 |
| 80 和 443 TCP | 带注册、捐赠商店和投票页面的项目网站 | Web 服务器 | 是,但不要放在同一个 IP 地址上 |
| 22 TCP | SSH 访问 | /etc/ssh/sshd_config |
只限制到自己的地址 |
这张表同时回答了两个问题:Lineage 2 既没有查询端口,也没有 RCON 端口。没有一个单独的服务把玩家人数提供给服务器列表,也没有像 Source 系列那样的远程控制端口。服务器列表由登录服务器自己生成,并通过 2106 上的同一条连接发给已登录的客户端。远程控制在 L2J 里走游戏内命令和数据库。于是别的游戏有的两个攻击面在这里没有了,而剩下的就更多地压在 2106 端口上。
您应该知道的几个数量级
| 指标 | 数值 |
|---|---|
| 游戏的传输协议 | 只有 TCP,UDP 仅用于 53 端口上的域名解析 |
| 1 Gbit/s 接入 | 每秒 125 兆字节 |
| 1 Gbit/s 中 64 字节大小的数据包 | 约每秒 149 万个数据包 |
| 普通服务器内核能处理的量 | 每秒几十万个数据包,之后就开始丢弃 |
| 每个源地址的并发连接数,L2J 默认值 | MaxConnectionPerIP = 50 |
| L2J 中一个未完成登录会话的存活时间 | LOGIN_TIMEOUT,60 秒 |
| 触发封禁前的失败次数,L2J 默认值 | LoginTryBeforeBan = 5,随后 LoginBlockAfterBan = 900 秒 |
| 在 KernelHost 上过滤掉的一次针对游戏服务器的攻击 | 超过 112.2 Gbit/s,每秒超过 870 万个数据包 |
| 在 KernelHost 上过滤掉的一次针对语音服务器的攻击 | 超过 473.4 Gbit/s,每秒超过 4150 万个数据包 |
在花钱之前,您自己能做的事
这一节最长,而且是故意的。配置干净的 Lineage 2 服务器能靠自己扛住小型和中型攻击,无论它放在谁那里。
1. 清点:到底有什么在监听?
在写下第一条规则之前,先看清楚您的服务器对外提供了什么。不要猜,要查:
ss -lntp
要看的是本地地址那一列。0.0.0.0:2106 和 0.0.0.0:7777 应该在那里。0.0.0.0:9014 和 0.0.0.0:3306 则是错误:攻击者正是通过这两个端口把自己挂进您的服务器列表,或者去敲您的数据库。而 127.0.0.1:3306 表示“仅本机”,不需要防火墙规则。攻击者眼中的样子由一次从外面做的端口扫描给出:
nmap -Pn -p- --min-rate 1000 YOUR.SERVER.IP.ADDRESS
2. 把 9014 端口和数据库挡在开放网络之外
9014 端口是游戏服务器向登录服务器注册所用的通道,它在任何情况下都不属于开放网络。L2J 已经给出了正确的默认值:LoginHostname = 127.0.0.1 把这个端口绑定到回环接口,从外面根本访问不到。如果登录服务器和游戏服务器跑在两台不同的机器上,请把 * 换成具体的内网地址,并且只为对端放行这个端口。
同样的规则也适用于数据库。请在 /etc/mysql/mariadb.conf.d/50-server.cnf 里确认其中写着:
bind-address = 127.0.0.1
并且请换掉数据库用户。自带的 Server.properties 写的是 Login = root,而这个文件本身就用注释说明了这样正是不推荐的做法。如何建立一个权限最小的专用用户,见 加固 MariaDB 和 MySQL。之后请检查结果:
ss -lntp | grep -E ':9014|:3306'
上面这一层的防火墙很短。一台 Lineage 2 服务器对外只需要两条放行,而且要完全按这个顺序来,以免把自己关在门外:
ufw allow 22/tcp comment 'SSH'
ufw allow 2106/tcp comment 'L2 登录'
ufw allow 7777/tcp comment 'L2 游戏'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose
包含自救办法的完整说明见 设置 UFW 防火墙而不把自己关在门外。
3. 服务器一旦注册完成,就关掉 AcceptNewGameServer
LoginServer.properties 里出厂写着 AcceptNewGameServer = True,上面的注释正好说明了它的含义:任何游戏服务器都可以在您登录服务器的一个空位上注册自己。只要 9014 只落在回环接口上,这没有后果。一旦这个端口因为别的原因变得可以访问,它就是一道敞开的门。所以,您自己的游戏服务器注册过一次并拿到编号之后,请把这个值设为 False:
AcceptNewGameServer = False
游戏服务器一侧的对应项写着 AcceptAlternateID = True。这在搭建时很方便,因为想要的编号被占用时,登录服务器会另外分配一个。而在生产系统上您要的是相反的行为:一个固定的编号,以及在它被占用时报一个错。
4. 把登录服务器的洪水防护设对
L2J 在登录服务器里自带一道连接限制。它写在 LoginServer.properties 里,所有时间值的单位都是毫秒:
EnableFloodProtection = True
FastConnectionLimit = 15
NormalConnectionTime = 700
FastConnectionTime = 350
MaxConnectionPerIP = 50
这些值彼此相关。一条连接如果与来自同一源地址的上一条之间的间隔小于 FastConnectionTime,就算作快速连接。这样的连接达到 FastConnectionLimit 条之后,该地址就会被拒绝。NormalConnectionTime 是计数器重新回落所需的间隔。MaxConnectionPerIP 是每个地址同时打开连接数的上限。
对单个玩家来说,五十条并发连接非常宽松,降低这个值会有明显帮助。不过这里要小心:同一户里的多名玩家、一家网吧,尤其是运营商级 NAT 后面的接入(在 L2 圈子里,这涉及很多来自土耳其、巴西和东欧部分地区的玩家)都共用一个公网地址。谁把它设成 3,就会把真实玩家关在门外。请先在正常运行状态下测一周,然后分步下调。
还有一条您必须知道的限制:这道限制跑在登录服务器的 Java 进程里。凡是由它决定的数据包,都已经跑过您的线路,也已经花掉了计算时间。对付少数几个来源它有效,对付一个僵尸网络就没用了。
5. 限制失败次数,并用上 banned_ip.cfg
LoginServer.properties 里还有两条指令决定一个人可以猜多久:
LoginTryBeforeBan = 5
LoginBlockAfterBan = 900
LoginTryBeforeBan 是账号和密码组合无效多少次之后封禁该地址,LoginBlockAfterBan 是封禁时长,单位为秒(900 相当于 15 分钟)。之后计数从头开始。
长期封禁请写进登录服务器配置目录下的 banned_ip.cfg 文件。允许写单个地址、整个网段,以及一个可选的到期时间点,格式是以毫秒为单位的 Unix 时间戳,# 之后的都是注释:
198.51.100.7
203.0.113.0
198.51.100.44 1789689600000
另外请设置 AutoCreateAccounts = False。默认值 True 会在每次用一个未知账号名登录时自动建立一个账号。这在搭建时很实用,在运营中却是白送的礼物:攻击者可以据此生成任意多的账号,而每一个都可以去取那份带着您游戏服务器地址的服务器列表。请改成让账号通过您网站上的注册流程产生,这样谁能拿到一个标识就由您控制。
6. 在内核里限制 2106 和 7777 上的连接速率
Java 那道限制决定得太晚,内核决定得更早也更便宜。对付小型攻击和不讲究的机器人,按源地址设一个上限就有帮助:
iptables -I INPUT -p tcp --dport 2106 --syn -m connlimit --connlimit-above 8 --connlimit-mask 32 -j DROP
iptables -I INPUT -p tcp --dport 2106 --syn -m hashlimit --hashlimit-name l2login --hashlimit-mode srcip --hashlimit-above 6/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p tcp --dport 7777 --syn -m connlimit --connlimit-above 6 --connlimit-mask 32 -j DROP
第一条规则在一个地址同时打开超过八条连接时,丢弃它发往登录服务器的新连接。正规客户端只需要一条。第二条把每个地址的新建连接速率限制为每秒六条,并留二十条的缓冲,这样服务器重启后的重连风暴还能过去。第三条在游戏服务器上允许每个地址六条并发连接,因为在 Lineage 2 里多开(双开和三开)是常态,限制设得太紧会打到您付费的玩家。
这三个数字都是起始值,不是真理。一台有 2000 名同时在线玩家的服务器,和一台有 200 名的表现不一样。请先测量,再设定。纯 iptables 规则在重启后就没了,在 Debian 和 Ubuntu 下这样保存:
apt-get install -y iptables-persistent
netfilter-persistent save
在 UFW 下,这类规则应写进 /etc/ufw/before.rules,否则下一次 ufw reload 时就会消失。
7. 拦住 SYN 洪水攻击:SYN Cookie、积压队列和连接跟踪
因为 Lineage 2 完全走 TCP,所以 SYN 洪水攻击是最顺手的向量。SYN 洪水攻击是指用伪造的源地址发送连接请求,并且从不回答确认,于是服务器为每个请求预留一块永远用不上的内存。四项设置能缓解这一点:
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_synack_retries=2
其中 SYN Cookie 是最重要的一行:内核回答请求而不记住任何东西,只有在对端真正完成连接时才建立状态。伪造的发送方就这样落空了。要长期生效,请把这些值放进 /etc/sysctl.d/ 下的一个文件里,并用 sysctl --system 加载。
一个常被忽视的瓶颈是内核的连接跟踪。它一满,服务器连正常的数据包也会丢弃,日志里会出现“nf_conntrack: table full, dropping packet”。当前数量和上限用这条命令查看:
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
8. 网站、登录服务器和游戏服务器分到不同的 IP 地址上
带注册、捐赠商店和投票页面的项目网站,通过您的域名总是能找到。如果它和登录服务器落在同一个 IP 地址上,那么一次针对网站的攻击会同时瘫掉登录,反过来也一样。请把这三个角色分到不同的地址上。这样网站被攻击时游戏仍然可达,而 2106 被攻击时已经连上的玩家可以继续玩。
同时请把 DNS 记录保持干净。最常见的错误是一条指向早先地址、被遗忘的 A 记录:它让任何地址更换都失去意义,因为攻击者和您的玩家通过同一个名字就能找到新地址。
这里该讲的是实话,而不是愿望:您登录服务器的地址是保不住密的。它写在每个玩家都要下载的 System 文件夹里的 l2.ini 中。而游戏服务器的地址由登录服务器自己分发:在 L2J 里它作为外部地址写在 ipconfig.xml 中(在较老的分支里是 Server.properties 里的 ExternalHostname),并且会被告知每一个成功登录的客户端。躲藏不是策略,过滤才是。
9. 记录日志,让您在出事时手里有数据
最重要的一步是几乎没人事先做的那一步:在一切正常的时候先建立基线。没有正常值,事后您就说不清每秒 4 万个数据包是很多,还是就是个普通的周六晚上。用 apt-get install -y vnstat sysstat 让测量常驻运行。事件发生时四条命令就够了:
sar -n DEV 1 10
ss -tn state syn-recv | wc -l
ip -s link show eth0
tcpdump -ni eth0 'tcp port 2106' -c 200 -q
在 Lineage 2 上,第二行是最说明问题的:它统计半开连接。在只有几百名玩家的情况下出现一个五位数,那就是 SYN 洪水攻击,别无其他。用 tcpdump 时有一条铁律:一定要用 -c 限制数量,满载状态下抓包会让本来已经过载的服务器更吃力。这些数值怎么分析,见 识别 DDoS 攻击。
这些措施到哪里为止
现在说没有任何配置文件能解决的那一部分。前面所有措施都跑在您的服务器上,也就是线路的末端。一条防火墙规则决定的是一个已经跑过网线的数据包。您可以把它丢弃,但没法让它没被发出来。
算一下就清楚了。一台典型的游戏服务器挂在 1 Gbit/s 上,也就是每秒 125 兆字节,只要有人发得比这更多,线路就满了。而打一台 Lineage 2 服务器,连这么大的攻击都不需要,因为第二个量更早出事:数据包速率。在 64 字节的小包情况下,一条 1 Gbit/s 的线路里能装进每秒约 149 万个数据包。普通的服务器内核视 CPU 和网卡而定,处理其中几十万个之后就会开始丢弃。
对一款纯 TCP 的游戏,还要加上第三条界限。每一条半开连接都占用连接跟踪里和积压队列里的一个条目,而 L2J 的登录服务器把它的会话保留最多 60 秒。所以一次每秒几十万个数据包、连您线路三分之一都没填满的攻击,就能把登录完全堵住。运营者的体验是“负载根本不高,可是谁也进不来”。
为了有个数量级上的参照:在 KernelHost 的服务器上,过滤掉的攻击里包括一次针对游戏服务器、超过 112.2 Gbit/s 且每秒超过 870 万个数据包的攻击,以及一次针对语音服务器、超过 473.4 Gbit/s 且每秒超过 4150 万个数据包的多向量攻击。这种情况没有任何本地设置可用。流量型攻击必须在服务器前面的网络里就被终结。紧急情况下该做什么,见 遭遇严重 DDoS 攻击该怎么办?。
KernelHost 用什么来应对
每台服务器都标配的持续防护
KernelHost 的 DDoS 防护分两级,持续生效,您不需要开启、订购或配置任何东西:
- 第 1 级:全球清洗网络中 17 Tbps 的清洗能力。流量型攻击在靠近来源的地方就被清洗掉,不会到达数据中心。
- 第 2 级:法兰克福的 Arbor 实时过滤,容量 3.2 Tbps。就在服务器前面,逐个数据包地识别并丢弃与协议相关的攻击特征。
有两点是关键。防护持续运行,不需要先对攻击做出反应,所以开头不会有服务器失联的那几分钟。尤其在开服那一刻,这就是成功开服和失败开服之间的区别。而且不使用黑洞路由:您的 IP 地址留在网络里,被丢弃的只有恶意数据包。把 IP 地址从网络里撤下来的做法,对您而言和攻击者达到的结果一样。哪些游戏和协议在覆盖范围内,见 实时游戏服务器 DDoS 防护。
针对长期被攻击项目的 Advanced DDoS Protection
有些项目不是偶尔被打,而是被有针对性地连打几周,而在 Lineage 2 圈子里,任何挤进服务器列表前列的服务器都属于这种常态。为此有 Advanced DDoS Protection,每月 50.00 欧元起,PrePaid 预付费,没有最低合约期。区别不在于容量更大,而在于控制权:
- 专用防护 IP,来自法兰克福的核心网络,您的服务器会在我们自己的网络内切换到它。您这边不需要做任何改造。
- 按端口和协议自行管理的防护规则,就在客户中心里:您可以分别设置 2106 TCP 上允许什么、7777 TCP 上允许什么。这在 Lineage 2 上是决定性的一点,因为这两个端口的流量形态完全不同:一边是很多很短的连接,另一边是很少但非常长的连接。
- 改动实时生效,因此您可以在攻击进行时随时调整,也可以在开服那一刻之前把规则设得更严,之后再放松。
- 与具体应用匹配的防护策略,同样适用于任意 TCP 或 UDP 端口上经过修改的和自研的服务端文件。您运行的是 L2J、L2J-Mobius、aCis 还是一个 L2OFF 服务端包,对规则集没有影响,因为它建立在端口和协议之上。
两级防护对比
| 对比项 | 标配的 DDoS 持续防护 | Advanced DDoS Protection |
|---|---|---|
| 价格 | 包含在每个服务器套餐中,不额外收费 | 每月 50.00 欧元起,PrePaid 预付费 |
| 过滤能力 | 17 Tbps 全球清洗,加上法兰克福 3.2 Tbps 的 Arbor 实时过滤 | 同样的两级过滤 |
| IP 地址 | 您服务器本身的 IP 地址 | 额外的专用防护 IP |
| 规则集 | 自动防护策略,无需配置 | 在客户中心里按端口和协议设置自己的规则,2106 和 7777 分开 |
| 改动 | 自动跟进 | 实时生效,攻击进行时也可以 |
| 服务端文件 | 针对常见游戏的优化策略 | 按端口和协议的策略,因此 L2J、L2J-Mobius、aCis 和 L2OFF 都适用 |
| 黑洞路由 | 否 | 否 |
| 合约期 | 与服务器套餐绑定 | PrePaid 预付费,没有最低合约期,没有退订通知期,也没有开通费 |
对大多数 Lineage 2 项目来说,标配的持续防护配上干净的服务器配置就够了。Advanced DDoS Protection 针对的是有人把这件事当成私人恩怨的情况,而按经验,这发生在开服前的那一周。
常见错误及解决办法
“登录进不去,可游戏服务器运行正常”:这不是巧合,而是针对 Lineage 2 服务器的攻击的常见形态。登录服务器和游戏服务器是两个端口上的两个进程。请测量 ss -tn state syn-recv | wc -l 和 sar -n DEV 1 10。如果半开连接在涨,而带宽并不异常,那就是 2106 上的连接洪水攻击。
“我换了 IP 地址,第二天又离线了”:攻击者拿到新地址的路子和您的玩家一样,也就是通过带有改动过的 l2.ini 的新 System 文件夹、通过您的公告,或者通过一条被遗忘的 DNS 记录。换地址是争取时间,不是解决办法。
“我把 MaxConnectionPerIP 设成了 3,现在玩家开始抱怨”:在 Lineage 2 里多开是常事,而运营商级 NAT 后面的玩家要和好几百人共用一个公网地址。请退回到一个能覆盖您正常运行测量值的数值,改为在内核里限制新建连接速率。
“我的 iptables 规则不起作用”:常见原因有三个。规则排在 UFW 的链后面,永远轮不到它;规则在上次重启后就没了(这时用 netfilter-persistent save,或者写进 /etc/ufw/before.rules);或者攻击是流量型的,而规则在一条已经满了的线路上正常工作。用 iptables -L INPUT -n -v 检查命中计数器是否在增长。如果一直是零,说明规则没有被匹配到。
“所有玩家都有延迟尖峰,可线路很安静”:那就不是 DDoS 攻击。在一台 Java 服务器上,常见的嫌疑对象是垃圾回收的停顿、一个没有合适索引的数据库,以及一个陷在循环里的脚本或自定义活动。请先看 sar -n DEV 1 10:如果数据包速率保持正常,原因就在服务器里,不在网络里。
“我原来的主机商把我的 IP 地址封了”:那就是黑洞路由。主机商用它保护自己的网络,对您来说结果和一次成功的攻击完全一样,而且通常在那之后还要持续几个小时。有疑问时请直接问清楚:是过滤还是黑洞路由。这个答案对您可用性的影响,比任何硬件参数都大。
“我在 tcpdump 里看不到任何异常”:如果流量已经在前面的网络里被过滤掉了,服务器上当然就什么都收不到。这在过滤正常工作时是常态。反过来说:线路一旦被打满,您甚至可能连用来测量的那条 SSH 会话都进不来。这时请使用客户中心里的 VNC 控制台,它独立于客户机系统的网络运行。
“我的开服还有两周”:那就现在迁移,不要等到开服那一周。一次迁移要花掉给玩家的一个新 System 文件夹、一次 DNS 切换和一次测试运行。这些您都希望在宣布日期之前就做完,因为从公告发出那一刻起,每个竞争对手都知道了您最不利的时间点。
要点总结
- 一台 Lineage 2 私服在开放网络里正好需要两个端口:2106 TCP 给登录服务器,7777 TCP 给游戏服务器。9014 端口、数据库(L2J 上是 3306,L2OFF 上是 1433)以及 L2OFF 的内部端口 2002、2006、2008、2104 和 2108 都不属于这一类。
- Lineage 2 完全走 TCP,既没有查询端口,也没有 RCON 端口。因此典型的攻击是针对 2106 端口的 SYN 洪水攻击或连接洪水攻击,而不是 UDP 洪水攻击。
- 针对登录服务器的攻击只堵住新的登录。如果谁都进不来,而游戏世界里的玩家还在继续玩,那么原因要在 2106 端口上找,不在 7777 上。
- 请有意识地设定
EnableFloodProtection、MaxConnectionPerIP、LoginTryBeforeBan和AutoCreateAccounts,在注册完成后把AcceptNewGameServer设为False,并额外在内核里限制连接速率,因为 Java 那道限制只在线路之后才生效。 - 针对 Lineage 2 服务器的攻击在开服时集中出现,因为日期和时间在几周前就已公开,而开服当天的经济损失最大。防护必须在公告之前就位,而不是之后。
- 超过线路容量、超过每秒几十万个数据包之后,就只由服务器前面网络中的过滤决定结果。在 KernelHost,它分两级,持续生效,不额外收费,也不使用黑洞路由。
如果您的项目已经放在 KernelHost,过滤就已经在工作,您什么都不用做。若仍然发现异常,请开一个 支持工单,以便为您的 IP 地址调整过滤规则。攻击正在进行时,您还可以通过 WhatsApp 紧急聊天联系我们:+43 650 8209883。
常见问题
我的 Lineage 2 服务器刚刚离线了。怎么判断是不是 DDoS 攻击?
Lineage 2 服务器需要对外开放哪些端口?
为什么 Lineage 2 被攻击的是 2106 端口上的登录服务器,而不是游戏服务器?
L2J 的 9014 端口是做什么的,它需要从外面可以访问吗?
为什么 Lineage 2 服务器在开服时特别容易被攻击?
我能用 iptables 或者 L2J 的洪水防护来抵御 DDoS 攻击吗?
现在赶紧换掉我 L2 服务器的 IP 地址有用吗?
攻击到多大规模,我的 Lineage 2 服务器就撑不住了?
在 KernelHost,我的服务器会在攻击期间离线吗?
KernelHost 的 DDoS 防护要额外付费吗?
什么时候我的 Lineage 2 项目还需要 Advanced DDoS Protection?
2026 KernelHost GmbH。保留所有权利。本教程受著作权法保护,未经我们书面同意,不得在其他网站上转载,节选转载或改写后转载同样不被允许。欢迎在注明出处并附上链接的前提下引用。

