iptables之tcp flags

来源:互联网 发布:hadoop书籍推荐知乎 编辑:程序博客网 时间:2024/06/11 20:48

tcp flags 说明

F : FIN   结束标志; 结束会话    带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。S : SYN   同步标志; 表示开始会话请求    同步序列编号(Synchronize Sequence Numbers)栏有效。该标 志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,    该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。    通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。R : RST   复位标志;中断一个连接   复位标志有效。用于复位相应的TCP连接。 P : PSH  推标志; 数据包立即发送    该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的A : ACK   应答标志    确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头   内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。 E : ECE   显式拥塞提醒回应W : CWR   拥塞窗口减少

三次握手(Three-way Handshake)

一个虚拟连接的建立是通过三次握手来实现的

   1. (B) --> [SYN] --> (A)    假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.    注意: 一个SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources)。认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。   因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。    2. (B) <-- [SYN/ACK] <--(A)    接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.    注意: SYN/ACK包是仅SYN和ACK标记为1的包.    3. (B) --> [ACK] --> (A)    B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成    注意: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位 

这就是为何连接跟踪很重要的原因了. 没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接.一般的包过滤(Ipchains)收到ACK包时,会让它通过(这绝对不是个好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包

四次挥手(Four-way Handshake)

四次挥手用来关闭已建立的TCP连接

   1. (B) --> ACK/FIN --> (A)    2. (B) <-- ACK <-- (A)    3. (B) <-- ACK/FIN <-- (A)   4. (B) --> ACK --> (A) 

注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包。然而,由于连接还没有关闭,FIN包总是打上ACK标记。没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的

三次握手和四次挥手示意图

这里写图片描述

连接复位(Resetting a connection)

       四次挥手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送。       注意在,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记)。但在正常的TCP连接中RST包可以带ACK确认标记       注意:RST包是可以不要收到方确认的

无效的TCP标记(Invalid TCP Flags)

        到目前为止,你已经看到了 SYN, ACK, FIN, 和RST 标记. 另外,还有PSH (Push) 和URG (Urgent)标记        最常见的非法组合是SYN/FIN 包。注意:由于 SYN包是用来初始化连接的, 它不可能和FIN和RST标记一起出现。这也是一个恶意攻击        由于现在大多数防火墙已知 SYN/FIN 包, 别的一些组合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明显,当网络中出现这种包时,    你的网络肯定受到攻击了        别的已知的非法包有FIN (无ACK标记)和"NULL"包。如同早先讨论的,由于ACK/FIN包的出现是为了关闭一个TCP连接,那么正常的FIN包总是带有ACK标记。    "NULL"包就是没有任何TCP标记的包(URG,ACK,PSH,RST,SYN,FIN都为0)。        到目前为止,正常的网络活动下,TCP协议栈不可能产生带有上面提到的任何一种标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的    网络不怀好意。

iptables下的tcp flags

基本使用方法

-p tcp --tcp-flags LIST1 LIST2          匹配指定的TCP标记,有两个参数列表,列表内部用逗号为分隔符,两个列表之间用空格分开,      LIST1用作参数检查,LIST2用作参数匹配。可用标志有:           SYN( 同步; 表示开始会话请求 ), ACK(应答),           FIN(结束; 结束会话),RST(复位;中断一个连接) ,           PSH(推送; 数据包立即发送),URG(紧急 ),            ALL(指选定所有的标记),NONE(指未选定任何标记)

eg:

[root@localhost ~]# iptables -A INPUT -p tcp --dport 23 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT[root@localhost ~]# iptables -A INPUT -p tcp --dport 23 --tcp-flags ALL SYN -j REJECT[root@localhost ~]# iptables -A INPUT -p tcp --dport 23 --syn -j REJECT

上面3条规则其实是一样的,ALL表示“SYN,ACK,FIN,RST,URG,PSH”,表示匹配三次握手中的第一次,此外tcp扩展模块还提供了一个选项 - -syn 也表示第一次握手

利用tcp flags做系统安全防护

NMAP SCAN

[root@localhost ~]#  iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

XMAS TREE

[root@localhost ~]#  iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

Another XMAS TREE

[root@localhost ~]#  iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

Null Scan

[root@localhost ~]#  iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

INVALID COMBINATIONS

[root@localhost ~]#  iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP[root@localhost ~]#  iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP[root@localhost ~]#  iptables -A INPUT -p tcp --tcp-flags FIN,ACK FIN -j DROP

这里只列出一些常见的组合,此外还有一些非法的包组合,具体参考

http://www.stearns.org/modwall/archives/tcpchk.v0.1.1

原创粉丝点击