Loading...
墨滴

jasonj333

2021/06/08  阅读:23  主题:红绯

iptables-扩展匹配条件2

很久没有学习iptables的内容了,最近又在医院做了个手术,大家多注意身体,今天我们继续学习iptables的扩展匹配条件

--tcp-flags

iptables不仅可以把tcp中的源端口号和目的端口号作为匹配条件,还可以把tcp中的标志位当作匹配条件,这就是--tcp-flags

tcp标志位,顾名思义,就是tcp首部中的标志位,用来表示tcp报文的特殊含义的标识位

用法

iptables -t filter -I INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT

其中

  • --tcp-flags

扩展匹配条件

  • SYN,ACK,FIN,RST,URG,PSH

表示规则要匹配的标志位,它们之间用逗号隔开,注意不能有空格

  • SYN

表示SYN置为1,相应地,其余的标志位置为0,如果有多个标志位需要设置为1,用逗号隔开

这里注意:规则要匹配的标志位和标志位要设置的值之间,用空格表示

SYN为1,其余标志位为0,如果你了解tcp协议,就知道这是tcp三次握手中的第一次握手时发的SYN包

那如果我想在防火墙中把tcp三次握手中第二次握手的报文丢弃呢,该如何设置?

第二次握手的报文标志位是SYN和ACK设置为1,所以我们可以这样设置

iptables -t filter -I OUTPUT -p tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT

如此即使你的主机收到连接请求,也不会有响应,因为在出口被防火墙丢弃了

聪明的你肯定发现,上面规则匹配所有标志位时,也太烦了,要把所有的标志位都写一遍,那有没有更简单的写法呢,当然是有的

我们可以用ALL表示SYN,ACK,FIN,RST,URG,PSH,则上面的两条规则可以写成

iptables -t filter -I INPUT -p tcp --tcp-flags ALL SYN -j REJECT

iptables -t filter -I OUTPUT -p tcp --tcp-flags ALL SYN,ACK -j REJECT

tcp扩展模块还专门为第一次握手提供了一个选项:--syn

iptables -t filter -I INPUT -p tcp -m tcp --syn -j REJECT

udp module

前面既然学习过tcp扩展模块,也必定会有udp扩展模块,udp模块中可用的匹配条件不多,只有两个

--sport

匹配udp的源端口号

用法

iptables -t filter -I INPUT -p udp -m udp --sport 20 -j REJECT

这条规则表示收到的udp报文的源端口号如果是20则丢弃

和tcp模块一样,当使用扩展匹配条件时,如果未指定扩展模块,则iptables会默认调用与-p后面的协议名相同的扩展模块,所以,使用-p udp时,可以省略-m udp

--dport

匹配udp的目的端口号

用法

iptables -t filter -I INPUT -p udp -m udp --dport 20 -j REJECT

这条规则表示收到的udp报文的目的端口号如果是20则丢弃

udp模块的其他用法也和tcp模块一样,比如可以用--dport 20:30表示连续的端口,同样不支持多个不连续的端口,如果想表示多个不连续的端口,可以用multiport扩展模块

icmp module

既然有tcp和udp扩展模块,有没有icmp扩展模块呢?也是有的

icmp协议主要通过icmp首部的type和code字段,实现探测网络是否通畅、数据不可达的原因等功能

比如想探测网络是否通畅,我们一般会发送一条icmp echo request报文,它的type/code为8/0

如果网络通畅,对端主机就会回复icmp echo response,它的type/code为0/0

所以,如果我们想在iptables中设置关于不同icmp报文的规则,就可以用type/code来设置

用法

现在假设我们的主机允许ping别人,但是别人的主机不允许ping我们,怎么添加规则?

iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT

这里用到了扩展模块和扩展条件

  • -m icmp

icmp扩展模块

  • --icmp-type

icmp扩展模块里的扩展匹配条件,后面需要跟上type/code的值

同样的,如果使用了-p icmp,-m icmp可以省略

除了能够使用type/code值,还可以使用icmp报文的描述名称去匹配对应类型的icmp报文

比如type/code为8/0的icmp报文的描述名称是echo request

iptables -t filter -I INPUT -p icmp -m icmp --icmp-type "echo-request" -j REJECT

如果我想拒绝所有的icmp报文呢?

iptables -t filter -I INPUT -p icmp -j REJECT

这种情况下我们并不需要使用icmp扩展模块

state module

我们设想一种场景:我想主动发起和某一台主机的tcp或udp通信,端口号为80,那么我就需要在我主机的防火墙内放行80端口,但是我又害怕受到别有用心之人通过80端口对我主机进行攻击

怎么办?

我可以在INPUT上添加一条reject 80端口的规则吗?

当然是不行的,这样当我发起80端口通信时,就收不到别人的响应了

我要是能判断出发到80端口的报文是为了响应我的报文,还是主动发给我的报文,不就可以过滤掉主动攻击的报文吗?

state扩展模块就可以解决这个问题

state直译为状态,表示一条报文相对防火墙所在的主机来说,它是NEW的,还是ESTABLISHED的,或者其他

state有五种状态

NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED

  • NEW

NEW 状态告诉我们该数据包是我们看到的第一个数据包

  • ESTABLISHED

ESTABLISHED 状态已经看到两个方向的流量,然后将不断匹配这些数据包。ESTABLISHED 连接相当容易理解,进入 ESTABLISHED 状态的唯一要求是一台主机发送一个数据包,然后它会收到另一台主机的回复

  • RELATED

当一个连接与另一个已经建立的连接相关时,它被认为是相关的。这意味着,要使连接被视为 RELATED,我们首先必须有一个被视为ESTABLISHED的连接。ESTABLISHED 连接随后将在主连接之外产生一个连接

与之相关的就是FTP连接,FTP连接有控制连接和数据连接两个连接,控制连接负责控制数据传输的流程,那么数据连接相对控制连接来说,就是RELATED

  • INVALID

INVALID状态意味着无法识别数据包或它没有任何状态。这可能是由于多种原因造成的,例如系统内存不足或不响应任何已知连接的ICMP错误消息

  • UNTRACKED

表示报文未被追踪,无法找到相关的连接

如果想实现我们刚才所说的功能,怎么办呢?

iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

这样就表示响应我们的报文可以通过,但是不代表主动发起的我们就拒绝

所以还要再添加一条规则

iptables -t filter -A INPUT -j REJECT

如果是主动发起的,就会在这里被拦截


jasonj333

2021/06/08  阅读:23  主题:红绯

作者介绍

jasonj333