Iptables可通过匹配TCP的特定标志而设定更加严谨的防火墙规则,tcp-flags参数使用如下:
-p tcp --tcp-flags
#匹配指定的TCP标记,有两个参数列表,列表内部用逗号为分隔符,两个列表之间用空格分开。
#第一个列表为要检查的标志,第二个列表为要匹配的标志
#匹配数据包时第二个列表的值为1且第一个列表中的其它值要为0
#可用以下标志:
SYN、ACK、FIN、RST、URG、PSH、ALL、NONE
#ALL是指选定所有的标记,NONE是指未选定任何标记。
--syn
#SYN标志设置为1,其它标志未设置,相当于SYN为1且RST,ACK,FIN都为0
-p tcp --tcp-flags SYN,RST,ACK,FIN SYN.
很多人在使用tcp-flags匹配时遇到以下错误:
iptables v1.4.6: --tcp-flags requires two args.
原因是只定义了参数检查,未设置参数匹配,ROS下使用一组参数就可以了,正确使用tcp-flags应用示例:
防止Xmas扫描:
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
防止TCP Null扫描:
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
拒绝TCP标记为SYN/ACK但连接状态为NEW的数据包,防止ACK欺骗。
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP