核心是“状态过滤+标志校验”双层防御:先用conntrack拦截invalid及非法new连接,再用--tcp-flags精准拒绝syn+fin、全零、xmas等违反rfc的畸形tcp标志组合,配合drop静默丢弃以隐藏端口状态。

配置 Iptables 状态防火墙防止非法 TCP 标志位数据包注入,核心是“状态过滤 + 标志校验”双层防御:先用 conntrack 拦住无连接上下文的包(如 INVALID、非法 NEW),再用 --tcp-flags 精准拦截违反 TCP 规范的畸形标志组合(如 SYN+FIN、全零、Xmas 包)。两者配合,才能有效阻断扫描探测和伪造注入。
一、基础状态规则:先守住连接合法性
所有后续防护都建立在连接状态可信的前提下。必须按严格顺序配置 INPUT 链:
- 开头立即丢弃 INVALID 包:iptables -I INPUT -m conntrack --ctstate INVALID -j DROP(避免异常包干扰状态判断)
- 放行已建立和关联连接:iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- 对 NEW 连接做最小化授权:仅开放必要端口,且建议加源 IP 限制或速率控制,例如 SSH:iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
- 链末设默认策略:iptables -P INPUT DROP
二、TCP 标志位过滤:专治扫描类非法注入
非法标志位包通常不属任何合法连接(即不匹配 ESTABLISHED/RELATED),也常被标记为 INVALID,但部分畸形包可能绕过 conntrack 初检。因此需在状态规则之后、服务放行规则之前,插入显式标志检查规则:
- 拒绝仅含 FIN 的包(FIN 扫描):iptables -I INPUT -p tcp --tcp-flags ALL FIN -j DROP
- 拒绝 FIN+URG+PSH 组合(Xmas Tree 扫描):iptables -I INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
- 拒绝全零标志(Null 扫描):iptables -I INPUT -p tcp --tcp-flags ALL NONE -j DROP
- 拒绝 SYN 和 FIN 同时置位(违反 RFC):iptables -I INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
- 拒绝非首片分片(防分片注入):iptables -I INPUT -f -j DROP
注意:这些规则要用 -I 插入链首或至少排在服务 ACCEPT 规则之前;若用 -A 追加到末尾,会被先匹配的 ACCEPT 规则跳过。
三、增强防护与运行保障
单靠规则还不够,需配合内核参数与监控机制提升鲁棒性:
- 启用反向路径过滤(防 IP 欺骗):echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter,并写入 /etc/sysctl.conf
- 确保 conntrack 模块已加载:modprobe nf_conntrack && modprobe nf_conntrack_ipv4
- 记录可疑 INVALID 包用于审计:iptables -I INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "INVALID_TCP: ",再接 DROP
- 定期清理无效连接:conntrack -D --ctstate INVALID(可加入 cron 每小时执行)
四、验证是否生效
部署后用 Nmap 主动测试关键场景:
- nmap -sF -p22 your_server_ip(FIN 扫描)→ 应无响应或超时
- nmap -sX -p80 your_server_ip(Xmas 扫描)→ 应返回 filtered
- nmap -sN -p443 your_server_ip(Null 扫描)→ 同样应无响应
- 检查日志:dmesg | grep INVALID_TCP 或 tail -f /var/log/messages | grep INVALID_TCP
规则生效后,非法标志位包会被静默丢弃,既不响应也不暴露端口状态,大幅增加攻击者探测成本。











