内核级防护模块直接挂在TCP/IP协议栈的hook点上,能在数据包进入用户态服务之前就丢弃SYN扫描、ICMP探测和非法标志位组合,拦截速度比用户态防火墙更快,绕过难度也更高。
在实际部署中,只要把规则写进netfilter、nftables或eBPF,就能在北京机房防网络探测请求拦截方案里挡住相当一部分nmap默认扫描,下面按场景拆开说清楚怎么落地。
常见网络探测请求有哪些?内核模块为什么能拦住
探测请求不是只有一种,扫描器通常会混用多种方式判断主机存活、端口开放状态和操作系统类型,内核模块的优势在于它能看到每一个包,并且在协议栈早期就做出丢弃决定。
TCP SYN扫描与半开连接探测
- SYN扫描发送带SYN标志的TCP包,如果端口开放,目标会回SYN+ACK;如果关闭,回RST。
- 半开连接探测故意不完成三次握手,导致应用层根本无感知。
- 内核模块可以在PREROUTING或LOCAL_IN阶段识别“只有SYN、没有ACK”的包,直接丢弃。
ICMP与UDP探测的识别特征
- ICMP echo-request是最常见的存活探测。
- 端口不可达的ICMP回复会暴露主机在线状态。
- UDP探测发送短包到常见端口,关闭端口会回ICMP unreachable,开放端口则静默。
- 内核级规则可以限制ICMP速率、丢弃特定类型的ICMP消息。
为什么用户态防火墙经常拦不干净
- 用户态程序处理数据包要经过协议栈,扫描器可能利用时间差或者分片绕过。
- 高并发扫描下,用户态代理容易成为性能瓶颈。
- 内核模块在协议栈内部工作,多数情况下能更早丢弃异常包,减少资源消耗。
Linux内核级防护模块怎么拦截端口扫描请求
Linux下常用的内核级拦截手段有三类:netfilter/iptables、nftables、eBPF/XDP,它们都属于“内核级防护模块”的范畴,区别在于灵活性和性能。
基于netfilter的hook拦截点
netfilter提供五个挂载点:NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF_INET_POST_ROUTING。
内核模块注册到这些hook点后,每个经过的包都会被检查,返回NF_DROP就直接丢弃,不让包继续往上层走。
用nftables写内核态规则
nftables替代iptables后,规则更紧凑,以下命令可以拦截常见的TCP SYN扫描和ICMP探测:
nft add table inet filter
nft add chain inet filter input '{ type filter hook input priority 0; policy accept; }'
nft add rule inet filter input icmp type echo-request limit rate 1/second accept
nft add rule inet filter input icmp type echo-request drop
nft add rule inet filter input tcp flags & (syn|ack) == syn drop
第一条限制ICMP速率,第二条丢弃超出速率的ping,第三条直接把所有纯SYN包丢掉,对正常TCP连接影响很小,因为正常连接完成握手后会带ACK。
eBPF/XDP方案适合高防场景
XDP程序运行在网卡驱动层,性能更高。
- 可以用
xdpdump或bpftool加载编译好的XDP对象。 - 在XDP程序里解析以太网、IP、TCP头,发现可疑标志组合后返回
XDP_DROP。 - 适合机房入口或DDoS防护设备,部署成本比普通iptables稍高,但较大比例的高防场景会优先考虑。
服务器防探测用内核模块和iptables对比哪个好
很多人问“内核模块和iptables对比哪个好”,其实iptables本身就是内核模块的一种,真正的对比发生在“通用规则工具”和“自定义内核程序”之间。
| 对比项 | iptables/nftables | eBPF/XDP | 自研Linux内核模块 |
|---|---|---|---|
| 拦截位置 | 协议栈netfilter hook | 网卡驱动层 | 任意内核hook |
| 性能 | 中高 | 最高 | 高 |
| 灵活性 | 低 | 高 | 最高 |
| 开发成本 | 低 | 中 | 高 |
| 误伤风险 | 低 | 中 | 取决于代码质量 |
iptables/nftables属于内核模块的一种
不要把它们割裂。iptables规则最终由内核里的netfilter模块执行。
- 普通企业服务器用nftables写几条规则就能挡掉大部分扫描。
- 如果业务对延迟极敏感,再考虑XDP。
- 行业共识认为,对于大多数Web服务器和API服务,nftables的拦截能力已经足够。
自研内核模块与eBPF的取舍
- eBPF不需要重启内核,加载和更新方便。
- 自研LKM可能因为内核版本升级导致编译失败。
- 真正需要自研LKM的场景集中在定制化协议解析或隐藏服务指纹。
北京机房防网络探测请求拦截方案落地步骤
以北京地区机房托管服务器为例,部署内核级防护模块可以按下面步骤走。
机房服务器内核参数加固
先调整内核网络参数,减少探测信息泄露:
sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.conf.all.rp_filter=1
icmp_echo_ignore_all=1直接不回应ping。tcp_syncookies=1防止SYN flood消耗资源。rp_filter=1开启反向路径过滤,丢弃伪造源地址包。
内核模块部署与测试
- 确认内核版本并安装对应头文件。
- 编写或下载eBPF程序,编译为
.o对象。 - 用
ip link set dev eth0 xdpgeneric obj xdp_filter.o sec xdp加载。 - 在另一台机器用
nmap -sS -Pn 目标IP测试。 - 观察
nmap是否还能返回开放端口。 - 检查正常业务连接是否受影响。
内核模块防nmap扫描部署价格贵不贵
“内核模块防nmap扫描部署价格贵不贵”这个问题要分开源和商业两条线看。
开源方案几乎零授权成本
- nftables、iptables、eBPF都随Linux发行版提供。
- 自己写规则或加载社区维护的XDP程序,不需要额外软件费用。
- 成本主要在运维人员的学习和调试时间。
商业防护模块与硬件成本区间
- 一些云厂商把“防探测”作为安全组或DDoS防护的附加功能,按台数或带宽计费。
- 硬件防火墙设备价格差异大,不确定具体数字,但带XDP加速的高防设备通常比普通服务器贵一档。
- 中小企业如果预算有限,先用开源方案就能覆盖多数探测场景。
配置实操:用内核级规则拦截SYN扫描与ICMP探测
直接给一套可以在Ubuntu或CentOS上验证的配置。
第一步:清空现有规则并建立基础链
nft flush ruleset nft add table inet filter nft add chain inet filter input '{ type filter hook input priority 0; policy accept; }' nft add chain inet filter output '{ type filter hook output priority 0; policy accept; }'
第二步:放行已建立连接和回环接口
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
第三步:丢弃可疑探测包
nft add rule inet filter input icmp type echo-request limit rate 5/second accept
nft add rule inet filter input icmp type echo-request drop
nft add rule inet filter input tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn drop
nft add rule inet filter input tcp flags & (syn|ack) == syn ct state new drop
- 第一条和第二条把ping限制在每秒5次,超出丢弃。
- 第三条丢弃FIN+SYN等非法组合。
- 第四条丢弃纯SYN的新连接,nmap的
-sS扫描基本失效。
第四步:保存规则
nft list ruleset > /etc/nftables.conf
systemctl enable nftables
重启后规则自动加载。
内核级防护模块把拦截动作前移到协议栈内部,对常见的SYN扫描、ICMP探测和非法标志位组合能做到快速丢弃。
只要规则写得合理,正常业务流量不会受影响,nmap默认扫描在多数情况下也拿不到有效端口信息。
Q&A
内核级防护模块拦截端口扫描会误伤正常连接吗?
只要规则只针对“纯SYN且状态为new”的包,不会误伤已完成TCP三次握手的正常连接,正常客户端发起连接时,第一个包确实是SYN,但后续交互会有ACK,因此如果直接丢弃所有纯SYN,可能导致正常客户端首次连接超时。
更稳妥的做法是结合ct state new和速率限制,只丢弃高频SYN,或者放行可信源IP。
部署内核防探测模块后还需要用户态防火墙吗?
需要,内核模块擅长底层包过滤,但用户态防火墙可以处理更复杂的应用层规则,比如HTTP请求头检查、WAF规则匹配。
两者结合才能覆盖从网络层到应用层的完整防护链。
企业服务器防探测内核模块配置教程有推荐的吗?
从nftables入门即可,先掌握nft add rule和nft list ruleset两个命令,再逐步加入限制ICMP速率、丢弃纯SYN、丢弃非法标志位组合的规则。
熟悉后可以尝试加载现成的XDP程序,在网卡驱动层做更高性能的拦截。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/659487.html





