--tcp-flags模块
--tcp-flags
选项指的是tcp头部的标识位,可以通过此扩展匹配条件,去匹配tcp报文的头部的标识位,然后根据标识位的实际情况实现访问控制的功能。
在TCP协议建立连接的过程中,需要先进行三次握手,而三次握手就要依靠TCP头中的标识位进行。
如果想要匹配“第一次握手”的报文,可以使用如下命令:
--tcp-flags用于匹配报文tcp头部的标志位;第一部分为“SYN,ACK,FIN,RST,URG,PSH”,第二部分为“SYN”。
第一部分表示:需要匹配报文tcp头部中的哪些标志位,也就是要匹配的标志位列表;
第二部分表示:第一部分的标志位列表中,哪些标志位必须为1。
匹配TCP头中第二次握手:
TCP扩展模块中的
--syn
选项可以匹配“第一次握手”,也就是说可以替代“--tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN”。
UDP和ICMP扩展模块
1.UDP扩展
--sport:匹配报文中的源端口
--dport:匹配报文中的目的端口
例如,放行Samba服务的UDP 137,138这两个端口
表示137:138两个udp端口对外开放,连续的端口范围使用冒号隔开;
和TCP同样支持使用“multiport”模块指定多个离散的、不连续的端口,每个端口之间用逗号隔开。
2.ICMP扩展
ICMP协议的全称为Internet Control Message Protocol互联网控制报文协议,主要用于探测网络上的主机是否可用,目标是否可达等。
经常使用的ping命令,如果主机可达,对应主机会向我们的ping请求做出回应,也就是说,我们发出ping请求,对方回应ping请求,虽然ping请求报文与ping回应报文都属于ICMP类型的报文,但在概念上细分的话,它们所属的类型是不同的,我们发出的ping请求属于类型8的ICMP报文,而对方的ping回应报文则属于类型0的ICMP报文。
如果想要禁止所有的icmp类型的报文进入本机,可以这样设置:
iptables -t filter -I INPUT -p icmp -j REJECT
上述只是使用了“-p icmp”匹配了所有icmp协议类型的报文;所以我们既无法ping通别人,别人也无法ping通我们。
假设,此时我们需要ping通别人,但是不想让别人ping通我们,可以进行如下设置:
使用“--icmp-type 8/0”选项表示ICMP报文的type为8,code为0时才会被匹配到,也就是只有ping请求类型的报文才能被匹配到,所以,别人对我们发起的ping请求将会被拒绝通过防火墙,而我们之所以能够ping通别人,是因为别人回应我们的报文ICMP的TYPE为0,code也为0.
除了能够使用对应TYPECode匹配到具体类型的ICMP报文外,还能用ICMP报文的描述名去匹配对应类型的报文。
state模块
从字面上理解,state译为状态,state模块可以让iptables实现“连接追踪”机制。
对于state模块而言,只要两台机器在相互的通信,就算建立起了连接
state模块的连接分为5种状态:
1.NEW:连接中的第一个包
2.ESTABLISHED:表示连接已建立
3.RELATED:关系;数据连接中的报文与命令连接是有关系的
4.INVALID:如果一个包没有办法被识别,或者这个包没有任何状态
5.UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为untracked时通常表示无法找到相关的连接。
问题是:怎样判断报文是否是为了回应我们之前发出的报文,还是主动向我们发送的报文呢?
可以放行状态为ESTABLISHED的报文即可,因为如果报文的状态为ESTABLISHED,那么报文肯定是之前发出的报文的回应,还可以将状态为INVALID或ESTABLISHED的报文都放行,这样,就表示只有回应我们的报文能够通过防火墙,而别人主动发来的新报文,则无法通过防火墙。
示例:
当前主机的IP地址为10.10.10.15,当放行RELATED和ESTABLISHED状态的包后,并不影响本地远程ssh到16主机,但是无法从16主机使用ssh连接到本机。