场景: 我对A主机入站规则设置了默认deny,只开放80端口, 但是A在访问B的时候因为需要建立握手,在B向A发送syc,ack包的时候,因为A主机访问B时的端口是随机的,并且A主机入站规则默认是deny,所以syn,ack包到不了A,这个时候我对A设计的入站规则就不能使用了。
最开始设置的deny
iptables -A INPUT -p tcp -j REJECT
因为三次握手发送的包都是不一样的,所以我可以单独拦截握手的其中一个环节。因为别人访问我的第一次握手的包的syn。而如果我去访问别人,别人回给我的包是二次握手的syn,ack。所以我在设置入站规则默认deny的时候,可以只对syn进行阻断
最后设置的规则
iptables -A INPUT -p tcp --syn -j REJECT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
iptables -A INPUT -p tcp --tcp-flags ALL SYN -j REJECT
上面的三个规则是等价的,随意设置一个就可以
ALL 代表的SYN,ACK,FIN,RST,URG,PSH
-p tcp --tcp-flags LIST1 LIST2
匹配指定的TCP标记,有两个参数列表,列表内部用逗号为分隔符,两个列表之间用空格分开,
LIST1用作参数检查,LIST2用作参数匹配。可用标志有:
SYN( 同步; 表示开始会话请求 ),
ACK(应答),
FIN(结束; 结束会话),
RST(复位;中断一个连接) ,
PSH(推送; 数据包立即发送),
URG(紧急 ),
ALL(指选定所有的标记),NONE(指未选定任何标记)
网友评论