--tcp-flags是轻量高效的第一道防火墙防线,通过指定mask和comp精准匹配非法TCP标志组合(如SYN+FIN、Xmas、Null等),配合DROP静默丢包隐藏端口状态,须置于白名单后、异常规则前以确保逻辑正确。

直接用 `--tcp-flags` 匹配并拦截非法标志组合,是最轻量、最有效的第一道防线。它不依赖连接状态,响应快,能静默阻断扫描行为,让攻击者无法准确判断端口是否真实开放。
理解--tcp-flags的核心逻辑
这个参数必须同时指定两个部分:检查范围(mask)和期望值(comp),缺一不可。
比如 --tcp-flags SYN,ACK,FIN,RST SYN 表示:只看这4个标志位,其中仅SYN必须为1,其余三个必须全为0——这正是三次握手第一个包的唯一合法形态。任何偏离RFC规范的组合,如SYN+FIN、FIN+URG+PSH、全零、全一,都属于非标准报文,应被拦截。
针对常见扫描手法设置拦截规则
以下命令建议用 -I INPUT 插入INPUT链最前端,确保优先于服务放行规则生效:
- 拦截Xmas扫描(FIN+URG+PSH):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN,URG,PSH -j DROP - 拦截Null扫描(全零标志):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL NONE -j DROP - 拦截全一标志(非法组合):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL ALL -j DROP - 拦截SYN+FIN共置(违反TCP规范):
iptables -I INPUT -p tcp --dport 80 --tcp-flags SYN,FIN SYN,FIN -j DROP - 拦截仅含FIN的包(FIN扫描常用):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN -j DROP
用DROP代替REJECT隐藏端口存在性
REJECT 会返回RST包,等于告诉扫描器“端口开着但不欢迎你”;而 DROP 是静默丢弃,扫描器收不到任何响应,容易误判为“主机不可达”或“端口关闭”。
关键点在于规则顺序:这条DROP规则必须放在所有白名单ACCEPT规则之后、上述异常标志规则之前。否则会提前截断合法流量。部署后可用 iptables -L -v -n --line-numbers 检查顺序是否正确。
验证与注意事项
部署后可使用Nmap验证效果:
-
nmap -sF -p80 target_ip(FIN扫描) -
nmap -sX -p80 target_ip(Xmas扫描) -
nmap -sN -p80 target_ip(Null扫描)
若返回 filtered 或长时间无响应,说明规则已生效。实际环境中务必先在测试机上验证,避免误拒管理流量;如需保留特定IP访问权限,必须在DROP规则前添加对应白名单ACCEPT规则。










