教程和书籍中经常建议使用 iptables 过滤无效的 TCP 标志。我想知道内核本身或 iptables 状态模块是否已经过滤了这些标志。有人对此有进一步的信息吗?
答案1
我猜 TCP 规范并没有禁止某些无效的标志配置。有些系统可能选择发送(或曾经发送)奇怪的标志组合,但现在只有“坏人”才会发送它们(用于 FIN 扫描等),因此建议将它们过滤掉。
顺便说一下,下面是我用来过滤掉这些的 iptables 规则(可能从 frostytux iptables 教程中得到)
#new not syn
-A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
-A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP
-A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP
-A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
-A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
-A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
答案2
过滤奇怪的 TCP 标志通常是一个好主意,原因有二:
- 它可以防止多种类型的网络扫描
- 一些(较旧的)系统在发送奇怪的 TCP 标志时可能会出现问题
在 iptables 中,您必须手动过滤此类数据包(据我所知),其他防火墙(如 PF)具有“清理”模块。清理是一组标准规则,旨在从流中删除无效数据包,确保所有数据包具有相同的 TTL 等。
答案3
新版本的内核不会响应带有无效 TCP 标志的消息。您可以使用工具 Hping3 发送带有无效标志的数据包进行测试。如果您需要使用 iptables ,我留下了我的脚本:
#!/bin/bash
# -- UTF 8 --
iptables="/sbin/iptables"
CADENA="put INPUT, FORWARD or OUTPUT"
IPWS="put destination IP"
IFACE_Nro1="put input interface (example: wlan0 or eth0)"
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,FIN,PSH SYN,FIN,PSH -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,FIN,URG SYN,FIN,URG -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,FIN,RST SYN,FIN,RST -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,PSH -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL ALL -j DROP
$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL NONE -j DROP