就象前面说的,包的状态依据IP所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种 状态:NEW,ESTABLISHED,RELATED 和INVALID。它们主要是和状态匹配一起使用。下面就简要地介绍以下这几种状态:
一般书上说的常见的情况好理解,比如发起第一个包SYN,状态是NEW,有了SYN/ACK应答后,状态就变成了ESTABLISHED。 但是我想问的是一些其他的情况下状态应该是什么样的。
1 SYN发送过去,但是对方在指定端口没开或者根本没有进程打开这个端口。一般是发送RST或者ICMP不可达。(DROP直接没有回包了),那么返回来的数据包 在INPUT链,到底是属于RELATED还是INVALID呢?
2 UDP/ICMP 的会话 包是不是只有NEW / ESTABLISHED 两种状态么?
3 关闭状态,前三个握手都是属于ESTABLISHED, 最后一个ACK发出来,这个包属于什么呢?另外关闭握手如果不正常,比如下面两种情况,又属于什么状态?
(1) 如果一方已经关闭或异常终止,而另一方不知道,此时TCP连接为半打开。不传输数据,另一方就不会检测到,(此时可以设置TCP的KEEPALIVE选项,来定时检测),如果发送数据,另一方会返回RST分节。
(2) 第四个分节ACK丢失,服务器端(被动关闭)会重发FIN分节。(对照前文,第一个分节发送之后如果没有ack,应该也是超时重发,但此点不确定)
1
myliyifei OP 还有个补充
4 像一些构造的异常的TCP数据包,比如XMAS攻击之类的,这些都属于invalid状态吗?没有必要一个个在写了吗 -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP -A INPUT -p tcp -m tcp --tcp-flags ALL NONE -j DROP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP |
2
myliyifei OP 来个高手解答下吧
|