为什么未携带证书的Socket可连接配置了认证要求的Ignite服务端口?
问题原因
TCP连接与TLS认证是两个独立阶段
你编写的NIO代码仅完成了操作系统内核层面的TCP三次握手,此时还未触发Ignite应用层的TLS握手逻辑。证书校验是TLS握手阶段的步骤,需要在TCP连接建立成功后,由客户端先发送TLS握手报文才会触发,因此无证书的客户端可以先完成TCP连接,不会被立即断开。当前配置未启用通信端口的TLS强制校验
你虽然在全局配置中注入了SslContextFactory,但Ignite的TcpCommunicationSpi默认关闭SSL/TLS功能,你需要在buildTcpCommunicationSpi()的构造逻辑中显式添加.setSslEnabled(true),才会对该SPI绑定的23055端口强制启用TLS证书校验。
你遇到的DoS触发OOM的问题,本质是大量TCP连接建立后,Ignite的NIO工作线程会为每个新连接预分配直接内存缓冲区,还未等到应用层的认证、超时逻辑触发,直接内存就被耗尽,因此无证书的连接也能占用服务器资源。
修复方案
- 调整
TcpCommunicationSpi配置,显式开启SSL:
TcpCommunicationSpi commSpi = new TcpCommunicationSpi(); commSpi.setSslEnabled(true); // 强制启用TLS校验 // 其余原有配置
- 新增连接限制配置,缓解DoS影响:设置
TcpCommunicationSpi.setMaxConnectionsPerNode()限制单节点最大连接数,调整IgniteConfiguration.setFailureDetectionTimeout()缩短闲置连接超时时间,主动释放无效连接占用的资源。 - 配合操作系统层面的TCP参数优化(如开启syn cookies、限制单IP最大连接数),进一步降低攻击影响。
内容的提问来源于stack exchange,提问作者biandeqiang
相关产品推荐
相关产品推荐

