我正在为虚拟专用服务器开发防火墙,其中一项研究就是端口扫描器。TCP 标志用于保护。我有两个问题。
规则:
-p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
第一个参数表示检查带有标志 SYN 的数据包;第二个参数表示确保标志 ACK、FIN、RST SYN 已设置
;如果是这种情况(匹配),则丢弃 TCP 数据包
第一个问题:
我理解 RST 和 RST/ACK 的含义,但在第二个参数中使用了 RST SYN。RST
SYN 和 RST 以及 SYN RST 之间有什么区别?
三次握手中是否有“SYN RST”标志?
第二个问题是关于
-p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
和
-p tcp --tcp-flags ALL SYN,ACK,FIN,RST SYN -j DROP
什么时候应该使用 ALL?
当我使用 ALL 时,是否意味着如果带有 syn 标志的 tcp 数据包没有设置 ACK “和” FIN “和” RST SYN 标志,则不会匹配?
答案1
这:
-p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
意思是“查看 syn、ack、fin 和 rst 标志,并匹配设置了 SYN 标志的数据包,其他所有标志均未设置”
tcp-flags 的第一个参数是您正在考虑的标志,第二个参数是您想要匹配的掩码。如果您使用
--tcp-flags SYN,ACK SYN
那么它将匹配具有 [SYN=1 ACK=0] 的数据包,但不会匹配具有 [SYN=1,ACK=1] 或 [SYN=0,ACK=1] 或 [SYN=0,ACK=0] 的数据包
在上面的规则中,您仅匹配 SYN 数据包。
答案2
我觉得你对这个开关感到困惑。
该--tcp-flags
开关仅接受两个参数。第一个参数是要检查哪些标志。第二个参数是第一个参数中应该为匹配设置的标志。因此您的行:
-p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
意思是:“如果匹配仅有的SYN 标志由这四个设置。(空格将第一个参数和第二个参数分开。)
-p tcp --tcp-flags ALL SYN -j DROP
表示检查所有标志并将这些数据包与只不过SYN 集。第三个示例的语法不正确,因为它给出了三个参数。您的第一条规则将丢弃所有新传入的 TCP 连接,这可能不是您想要的。
交换机主要用于丢弃设置了无意义 TCP 标志的数据包。例如,您不会收到同时设置了 SYN 和 RST 或 SYN 和 FIN 的合法数据包。以下是我的一个*防火墙脚本中的代码片段:
${IPTABLES} -t filter -A INETIN -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
${IPTABLES} -t filter -A INETIN -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
${IPTABLES} -t filter -A INETIN -p tcp --tcp-flags SYN,URG SYN,URG -j DROP
这些检查将不会自然出现的特定 TCP 标志组合并丢弃数据包。
更多阅读请见手册页。
*(monmotha-2.3.8 的调整版本)