如何使用Linux Iptables阻止不同的攻击
iptables是基于Linux内核的数据包筛选器防火墙。
iptables模块存在于内核本身中,没有单独的守护程序。
这使防火墙非常快速有效。
Iptables规则控制网络设备上的传入和传出流量。
在本教程中,我们将讨论一些常见的网络攻击,以及如何使用iptables阻止它们。
一些常见的网络攻击是SYN泛洪攻击,蓝精灵攻击,陆地攻击,ICMP数据包故障引起的攻击以及其他形式的DOS攻击。
在详细介绍这些攻击之前,我们先概述一下iptables,以及如何使用此命令。
iptables
iptables为默认表提供3个过滤点:INPUT,OUTPUT和FORWARD。
这些在iptables中称为“链”。
顾名思义,它们指定数据包是发往系统的(INPUT),是发自系统的(OUTPUT)还是被路由到网络中的另一个节点(FORWARD)。
iptables中的规则以记录的形式存储在表中。
要列出规则,请运行“ iptables -L”,如下所示:
root@raghu-Inspiron-1440:~# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
其中没有任何链条的规则。
这些规则是从上到下读取的,如果发生匹配,则不会检查其他规则。
因此,如果一个规则覆盖了之前的任何规则,那么它一定已经低于该规则。
因此,我们将添加稍后出现的现有规则。
但是,如果要求是显式插入,则也可以插入它们。
要插入一个规则(在所有其他规则之上或者以指定的数字),-i以及添加一个-A选项。
我们需要指定要为其编写规则的链。
-j选项指定目标,例如:如果规则匹配,我们要如何处理数据包。
其中一些值是ACCEPT,DROP(或者REJECT),RETURN等。
目标可以是其他一些现有的或者用户定义的链。
但是,出于本文的目的,我们将仅局限于现有的链,而不再赘述。
iptables的一般语法为:
iptables CHAIN RULE_SPECIFICATION
现在,让我们使用上述选项创建一个简单的规则。
# iptables -A INPUT -j ACCEPT
这将接受所有传入的数据包,现在可以使用“ iptables -L”检查规则:
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
iptables提供了许多选项作为模块,以便在包含相应的模块时可以使用这些选项。
我们将在讨论中使用的一种这样的模块是极限模块。
该模块的详细信息将在稍后给出,但是现在,我只想让我们知道为了包含一个模块,使用了-m选项。
因此,要包含“限制模块”,我们将在规则中使用“ -m限制”。
现在我们已经了解了iptables,下面我们来讨论常见的攻击以及如何使用IPtables阻止它们。
攻击类型及其保护
1)LAND攻击
LAND代表“局域网拒绝”。
在这种攻击中,使用源地址作为目标本身的地址来欺骗数据包,即源地址和目标地址相同。
目标机器最终连续不断地对其自身进行回复。
尽管Linux和其他一些现代系统不容易受到此攻击,但我们仍可能需要确定。
要阻止来自我们自己的IP(假设47.156.66.17作为计算机的IP)的所有数据包,请执行以下操作:
# iptables -A INPUT -s 47.156.66.17/32 -j DROP
使用以上命令中的-s选项,可以指定源IP地址。
此外,要阻止来自本地网络(自身IP)的任何数据包,请执行以下操作:
# iptables -A INPUT -s 127.0.0.0/8 -j DROP
2)XMAS数据包
圣诞树数据包是其中设置了任何协议中的所有标志的数据包。
设置此类数据包的TCP报头中的FIN,URG和PSH位。
该数据包称为圣诞树数据包,因为标头的所有字段都像圣诞树一样“变亮”。
这种类型的数据包比通常的数据包需要更多的处理,因此服务器为该数据包分配了大量资源。
因此,这可用于在服务器上执行DOS攻击。
这些类型的数据包可以通过以下方式阻止:
# iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
在此,-p选项指定该规则适用的协议。
--tcp-flags用于指定TCP标头的标志。
它需要两个选项,第一个选项是'mask',其中我们指定应检查的标志(ALL),第二个选项是'comp',例如:必须设置的标志。
因此,在这里我们要检查必须设置FIN,PSH和URG的所有标志。
3)蓝精灵攻击
此攻击中的攻击者发送了大量ICMP回显广播数据包,其源IP地址被欺骗为目标IP地址。
网络中的所有机器都接收到此广播消息,并使用回声回复数据包回复目标。
阻止此攻击的一种方法是阻止所有ICMP数据包,但如果不能这样做,则可能对允许的icmp数据包施加限制。
要限制icmp数据包的数量,请执行以下操作:
# iptables -A INPUT -p icmp -m limit --limit 2/second --limit-burst 2 -j ACCEPT
要阻止所有ICMP数据包,请执行以下操作:
# iptables -A INPUT -p icmp -j DROP
在继续进行之前,我们先讨论一下极限模块。
限制模块可用于对传入的连接进行限制。
它使用令牌桶过滤器。
该模块可以包含在“ -m limit”中。
此模块可用的选项是--limit和--limit-burst。
根据iptables的手册页:
--limit rate[/second|/minute|/hour|/day]
最大平均匹配率:指定为数字,后缀为“ /秒”,“ /分钟”,“ /小时”或者“ /天”;默认值为3 /小时。
--limit-burst
匹配的最大初始数据包数量:每次未达到上述指定的限制时,此数量将充值一次,直至此数量;默认值为5.
如果听起来令人困惑,请不要担心。
让我提供一个类比来理解这两个选项。
假设有一个令牌桶,其中有一些令牌。
--limit给出令牌到达存储桶的速率。
默认值为3 /小时,因此每20分钟有一个令牌到达存储桶,但存储桶具有最大容量。
该容量由--limit-burst选项提供。
缺省值为5.
如果数据包具有令牌,则只能通过此存储桶。
因此,最初存储桶已满。
因此,如果我们采用默认值,则首先,将有5个数据包通过此规则。
由于没有可用的令牌,因此不会再有其他数据包通过。
现在根据突发速率,下一个令牌将在20分钟后到达。
因此,第6个数据包将仅在20分钟后通过。
如果在20分钟的间隔内没有数据包到达,则令牌将开始累积。
而100分钟(20 * 5)后,存储桶将装满。
在接下来的20分钟内,将不会再累积更多tokens。
(请注意,以上命令中的限制仅出于示例目的。
实际限制将取决于服务器上的可用资源。
)阻止icmp数据包也将防止系统对死亡攻击执行ping操作(尽管当前系统是ping)。
不容易受到伤害)
4)SYN洪水
SYN泛洪是一种DOS(拒绝服务)攻击。
要了解SYN泛洪,让我们看一下三种方式的TCP握手。
TCP是可靠的面向连接的协议。
在使用TCP协议在客户端和服务器之间交换任何信息之前,将通过TCP握手形成连接。
此握手过程分为三个步骤:
1.客户端通过发送SYN请求来请求服务器要建立连接。
2.服务器收到客户端的请求,并以“ SYN/ACK”回复,确认它已从客户端收到请求。
服务器分配资源并等待客户端确认。
3.客户端通过将ACK发送回服务器进行确认。
攻击者可以创建大量伪造其源IP地址的伪SYN请求,并将其发送到目标。
目标使用SYN/ACK进行回复,并为连接分配其资源,但永远不会返回ACK回复。
目标计算机的资源已用尽,并且停止处理任何合法计算机发出的任何其他请求。
通过限制传入的TCP连接请求数据包,可以阻止此攻击和其他形式的DOS/DDOS攻击。
这里要注意的一点是,我们不应限制来自已建立连接的请求。
为了避免这种类型的攻击,仅需要控制新的连接请求。
此外,服务器可以处理的请求数取决于服务器的可用资源。
因此,在下面的示例中,必须根据服务器的容量来更改TCP连接的限制:
# iptables -A INPUT -p tcp -m state --state NEW -m limit --limit 2/second --limit-burst 2 -j ACCEPT
在此命令中,包括了一个新的模块“状态”,用于指定数据包的状态。
不要忘记丢弃所有不符合上述规则的其他数据包,否则默认情况下将允许它们。
因此,在给出上述命令后,还请发出以下命令:
# iptables -A INPUT –p tcp –m state --state NEW –j DROP