tcp-flags模块的作用是判断TCP协议数据报文标志位的返回值的,在TCP的三次握手中,第一次握手客户端向服务器发送syn=1的数据报文,第二次握手服务端向客户端发送sync和ack=1的报文,第三次握手客户端向服务端发送ack=1的报文。
tcp-flags模块就是来判断发送报文中指定的标志位是否等于1,并且该条报文中只包含指定的标志位,否则就拒绝通行,例如我们指定的标志位是SYN,那么该条报文中就只能包含SYNC,如果再包含ACK,那么就不放行,并且标志位的值要为1。
只允许其他客户端发送TCP请求报文到本机,本机响应可以,但是本机不可向其他主机发送TCP请求报文。
tcp-flags模块使用的命令格式:--tcp-flags {标志位集合} {要判断哪个标志位等于1}
1.添加允许客户端向本机发起TCP请求的规则 #syn=1的标志位规则 [root@jxl-1 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT #ack=1的标志位规则 [root@jxl-1 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST ACK -j ACCEPT #其余的报文都拒绝 [root@jxl-1 ~]# iptables -t filter -A INPUT -j DROP 2.添加本机响应客户端TCP连接请求以及拒绝发起TCP请求的规则 #syn和ack都等于1 [root@jxl-1 ~]# iptables -t filter -I OUTPUT -p tcp --sport 22 -m tcp --tcp-flags SYN,ACK,FIN,RST SYN,ACK -j ACCEPT #ack-1 [root@jxl-1 ~]# iptables -t filter -I OUTPUT -p tcp --sport 22 -m tcp --tcp-flags SYN,ACK,FIN,RST ACK -j ACCEPT #其余的报文全部拒绝 [root@jxl-1 ~]# iptables -t filter -A OUTPUT -j DROP
[root@jxl-1 ~]# iptables -L -n -v --line-number Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 82 6416 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x10 2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02 3 5169 1958K DROP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 41 4348 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:22 tcp flags:0x17/0x10 2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:22 tcp flags:0x17/0x12 3 293 65316 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
本机无法发起TCP连接请求。
其他主机可以向本机发起TCP连接。