一、概述
iptables 是一款运行在 Linux 内核中的防火墙软件,它允许系统管理员配置内核的 IP 包过滤规则。通过 iptables,可以实现对进出服务器的网络流量进行控制,包括允许、拒绝、转发、重定向等操作,从而增强系统的安全性。
二、iptables 的基本原理
iptables 基于内核中的 netfilter 框架工作。netfilter 在内核网络协议栈的不同位置设置了钩子(hook),当数据包经过这些钩子点时,iptables 规则就会被触发来决定对数据包的处理方式。这些钩子点包括 PREROUTING(路由前)、INPUT(进入本地进程)、FORWARD(转发)、OUTPUT(本地进程发出)和 POSTROUTING(路由后)。
三、iptables 的基本语法
- 命令格式
iptables [-t table] command [match] [target/jump]
其中:
-t table:指定要操作的表,默认是filter表。常见的表还有nat(网络地址转换)和mangle(用于修改数据包内容)。command:是 iptables 的操作命令,如-A(追加规则)、-I(插入规则)、-D(删除规则)等。match:用于指定匹配条件,如源 IP、目的 IP、端口号、协议类型等。target/jump:指定当数据包匹配规则后的目标动作,如ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝并返回错误信息)等。
- 常见命令
-
-A chain:在指定链的末尾添加一条规则。-I chain [rulenum]:在指定链的指定位置(rulenum)插入一条规则,如果未指定rulenum,则插入到链的头部。-D chain rulenum:删除指定链中的指定规则编号(rulenum)的规则。-L chain:列出指定链中的所有规则。-F chain:清空指定链中的所有规则。
四、iptables 的表和链
- filter 表(默认表)
主要用于过滤数据包,决定是否允许数据包到达目标。包含以下几个链:
-
- INPUT 链:用于处理进入本地主机的数据包。例如,要允许来自特定 IP 地址的 SSH 连接,可以在 INPUT 链添加规则:
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
- OUTPUT 链:用于处理本地主机发出的数据包。
- FORWARD 链:用于处理转发的数据包,在路由器等有转发功能的设备中使用。
- nat 表
主要用于网络地址转换操作。有以下几个重要链:
-
- PREROUTING 链:在数据包进入路由表之前进行修改。常用于目的地址转换(DNAT),例如将访问外部特定 IP 和端口的流量重定向到内部服务器:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080
- POSTROUTING 链:在数据包离开路由器之前进行修改。常用于源地址转换(SNAT),如在局域网共享上网场景中:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.100
- OUTPUT 链:在本地产生的数据包进行 NAT 处理。
-
mangle 表
用于对数据包进行修改,如修改 TTL 值、设置 MARK 标记等。可以在多个链上使用,常用于一些高级的网络流量控制场景。
五、匹配条件(match)
- 通用匹配
-
-p protocol:指定协议,如tcp、udp、icmp等。-s source_ip[/mask]:指定源 IP 地址,可以是单个 IP 或网段。-d destination_ip[/mask]:指定目的 IP 地址,可以是单个 IP 或网段。
- 端口匹配(针对 tcp 和 udp 协议)
-
--sport source_port:指定源端口。--dport destination_port:指定目的端口。
- 其他匹配条件
-
-
--icmp-type type:用于匹配 ICMP 数据包的类型,如echo-request(ping 请求)。 -
-m state --state state:根据连接状态进行匹配,常见的状态有NEW(新连接)、ESTABLISHED(已建立的连接)、RELATED(相关连接)等。例如,允许已建立的连接通过:
-
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
六、目标动作(target/jump)
- ACCEPT:允许数据包通过,继续在网络协议栈中传输。
- DROP:直接丢弃数据包,不返回任何信息。这在拒绝恶意流量时很有用,但可能会导致连接超时等问题,因为客户端不会收到反馈。
- REJECT:拒绝数据包并向源发送 ICMP 错误消息,告知对方连接被拒绝。
- DNAT:目的地址转换,用于将数据包的目的地址修改为其他地址。
- SNAT:源地址转换,用于将数据包的源地址修改为其他地址。
- MASQUERADE:是一种特殊的 SNAT,用于动态获取源 IP 地址的情况,通常在使用动态 IP 的网络出口设备上使用。
七、iptables 规则保存与恢复
- 保存规则
不同的 Linux 发行版保存 iptables 规则的方式可能不同。在 CentOS 等基于 Red Hat 的系统中,可以使用service iptables save命令将当前的 iptables 规则保存到/etc/sysconfig/iptables文件中。在 Ubuntu 等基于 Debian 的系统中,可以使用iptables -save > /etc/iptables.rules(可能需要安装iptables-persistent包来实现规则的持久化)。 - 恢复规则
在系统重启后,可以使用相应的命令来恢复保存的规则。在 CentOS 中,系统启动时会自动加载/etc/sysconfig/iptables中的规则。在 Ubuntu 中,如果安装了iptables-persistent,可以使用iptables -restore < /etc/iptables.rules来恢复规则。
八、注意事项
- 编写 iptables 规则时要谨慎,错误的规则可能导致网络连接问题,如无法访问服务器、服务不可用等。
- 在测试新规则时,可以先在规则链的末尾添加
-j LOG目标,将匹配的数据包信息记录到系统日志中,以便查看规则的执行情况和分析问题。 - 对于复杂的网络环境和安全需求,建议在实验室环境中充分测试 iptables 规则后再应用到生产环境中。同时,可以结合其他安全工具和策略,如入侵检测系统、访问控制列表等,提高系统的整体安全性。
常见网络攻击方式及对应的 iptables 规则
一、端口扫描攻击
- 攻击方式描述
-
- 攻击者使用端口扫描工具(如 Nmap)对目标主机的一系列端口进行扫描,试图发现开放的服务端口,为后续的攻击做准备。这种扫描行为会在短时间内产生大量的连接请求,目标主机的端口状态会频繁变化。
- iptables 规则防范
-
-
限制连接频率:可以通过设置连接速率限制来防范端口扫描。例如,使用
iptables的limit模块来限制每秒来自一个 IP 地址的新连接数。
-
iptables -A INPUT -p tcp -m state --state NEW -m limit --limit 10/sec -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -j DROP
- 解释:第一条规则允许每秒最多 10 个新的 TCP 连接,第二条规则丢弃超过这个限制的新 TCP 连接。
二、SYN Flood 攻击
- 攻击方式描述
-
- 攻击者发送大量带有 SYN 标志的 TCP 连接请求,但不完成三次握手过程。这会导致目标服务器的半连接队列被填满,无法处理正常的连接请求,从而使服务器的服务不可用。
- iptables 规则防范
-
-
SYN Cookie 机制:启用
SYN Cookie功能,服务器在收到 SYN 包时,不分配资源,而是根据一定的算法生成一个 Cookie 值,在收到 ACK 包时再验证 Cookie 来建立连接,这样可以避免半连接队列被耗尽。在较新的 Linux 内核中默认启用了此功能,但也可以通过sysctl命令调整相关参数。另外,也可以使用iptables的syncookie模块来增强防范。
-
iptables -A INPUT -p tcp -m tcp --syn -m connlimit --connlimit-above 10 -j REJECT --reject-with tcp-reset
- 解释:这条规则会拒绝来自单个 IP 地址连接数超过 10 个的带有 SYN 标志的 TCP 连接请求,并发送 TCP 重置(RST)包。
三、ICMP Flood 攻击
- 攻击方式描述
-
- 攻击者向目标主机发送大量的 ICMP(Internet Control Message Protocol)数据包,如 ping 请求,使目标主机的网络带宽或系统资源被大量占用,导致网络拥塞或系统性能下降。
- iptables 规则防范
-
- 限制 ICMP 流量:可以限制 ICMP 数据包的速率或禁止某些类型的 ICMP 数据包。
iptables -A INPUT -p icmp -m limit --limit 1/sec -j ACCEPT
iptables -A INPUT -p icmp -j DROP
- 解释:第一条规则允许每秒最多 1 个 ICMP 数据包通过,第二条规则丢弃其余的 ICMP 数据包。也可以根据具体需求,允许特定类型的 ICMP 数据包,如允许回应请求(
echo - reply)但禁止其他类型。
iptables -A INPUT -p icmp --icmp - type 0 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
- 解释:第一条规则允许 ICMP 回应请求(类型为 0)通过,第二条规则丢弃其他 ICMP 数据包。
四、UDP Flood 攻击
- 攻击方式描述
-
- 攻击者向目标主机的特定 UDP 端口发送大量的 UDP 数据包,使目标主机的网络带宽或相关服务被大量占用。UDP 是无连接协议,不需要像 TCP 那样进行三次握手,所以更容易被用于攻击。
- iptables 规则防范
-
- 限制 UDP 流量:可以使用与限制 TCP 和 ICMP 流量类似的方法,限制 UDP 数据包的速率。
iptables -A INPUT -p udp -m limit --limit 100/sec -j ACCEPT
iptables -A INPUT -p udp -j DROP
- 解释:第一条规则允许每秒最多 100 个 UDP 数据包通过,第二条规则丢弃其余的 UDP 数据包。同时,可以针对特定的 UDP 服务端口进行重点防护,例如限制对 DNS 服务(UDP 端口 53)的访问。
iptables -A INPUT -p udp --dport 53 -m limit --limit 20/sec -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j DROP
- 解释:第一条规则允许每秒最多 20 个目的端口为 53(DNS 服务)的 UDP 数据包通过,第二条规则丢弃其余的 UDP 数据包。
五、IP Spoofing 攻击
- 攻击方式描述
-
- 攻击者伪造源 IP 地址发送数据包,试图隐藏自己的真实身份或者绕过基于 IP 的访问控制机制。
- iptables 规则防范
-
- 反 IP 欺骗规则:可以通过检查数据包的源 IP 地址和路由信息是否匹配来防范 IP 欺骗。例如,如果你的服务器所在网络是
192.168.1.0/24,并且通过eth0接口连接到外部网络,那么可以设置规则禁止源 IP 地址为本地网络但入口接口不是eth0的数据包。
- 反 IP 欺骗规则:可以通过检查数据包的源 IP 地址和路由信息是否匹配来防范 IP 欺骗。例如,如果你的服务器所在网络是
iptables -A INPUT -i! eth0 -s 192.168.1.0/24 -j DROP
- 解释:这条规则会丢弃从非
eth0接口进入,但源 IP 地址属于192.168.1.0/24的数据包,因为正常情况下本地网络的数据包应该从内部接口进入。
防范拒绝服务攻击的案例
一、防范 Land 攻击
- 攻击方式描述
攻击者发送源 IP 和目的 IP 相同的数据包,导致服务器在处理这些数据包时出现异常,消耗系统资源。 - iptables 规则防范
iptables -A INPUT -s <your_server_ip> -d <your_server_ip> -j DROP
解释:这条规则会丢弃源 IP 和目的 IP 都是服务器自身 IP 的数据包,防止 Land 攻击。
二、防范 Teardrop 攻击
- 攻击方式描述
攻击者利用 IP 分片重组的漏洞,发送重叠的分片数据包,导致目标系统在处理这些异常分片时崩溃。 - iptables 规则防范
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags RST RST -m length --length 0:5 -j DROP
iptables -t mangle -A PREROUTING -f -j DROP
解释:第一条规则丢弃长度在 0 - 5 字节且带有 RST 标志的 TCP 分片,第二条规则丢弃所有的碎片包(-f表示碎片包),这样可以防止 Teardrop 攻击利用分片漏洞。
三、防范 Smurf 攻击
-
攻击方式描述
攻击者向网络广播地址发送大量带有伪造源 IP(目标受害者的 IP)的 ICMP 回应请求包,网络中的主机收到广播包后会向受害者主机发送回应,从而使受害者主机遭受大量的 ICMP 流量攻击。 -
iptables 规则防范
iptables -A INPUT -i eth0 -p icmp -m icmp --icmp - type 8 -m limit --limit 1/sec -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp --icmp - type 8 -j DROP
解释:这里假设服务器的外网接口是eth0,第一条规则允许每秒最多 1 个从eth0进入的 ICMP 回应请求(类型 8),第二条规则丢弃其余的,限制了 Smurf 攻击中可能产生的大量 ICMP 回应请求。同时,可以禁止向广播地址发送 ICMP 数据包:
iptables -A OUTPUT -p icmp -d 255.255.255.255 -j DROP
iptables -A OUTPUT -p icmp -d 192.168.0.255 -j DROP
解释:这两条规则分别禁止向标准广播地址和本地网络广播地址发送 ICMP 数据包,减少被利用发起 Smurf 攻击的风险,这里的192.168.0.255仅为示例本地网络广播地址,需根据实际网络情况修改。
四、基于连接数限制防范 DoS
- 根据源 IP 的总连接数限制
iptables -A INPUT -p tcp -m state --state NEW -m connlimit --connlimit - above 50 --connlimit -mask 32 -j REJECT --reject - with tcp - reset
解释:这条规则会拒绝来自单个 IP 地址的新 TCP 连接数超过 50 的请求,并发送 TCP 重置(RST)包。这里--connlimit -mask 32表示精确到单个 IP 地址的统计。
-
根据源 IP 和目的端口的连接数限制
iptables -A INPUT -p tcp -m state --state NEW -m multiport --dports 80,443 -m connlimit --connlimit - above 20 --connlimit -mask 32 -j REJECT --reject - with tcp - reset
解释:对于目的端口为 80 和 443(常见的 HTTP 和 HTTPS 端口)的新 TCP 连接,当来自单个 IP 地址的连接数超过 20 时,拒绝该连接并发送 TCP 重置包。
五、防范 HTTP 慢速攻击
- 攻击方式描述
HTTP 慢速攻击包括 Slowloris 和 R-U-Dead-Yet(RUDY)等,攻击者通过保持与服务器的 HTTP 连接处于半打开状态或发送大量的 HTTP 头部信息来消耗服务器资源。 - iptables 规则防范
iptables -A INPUT -p tcp --dport 80 -m string --string "GET / HTTP/1.1\r\nHost:" --algo bm --to 65535 -m recent --name http_slow_attack --set
iptables -A INPUT -p tcp --dport 80 -m recent --name http_slow_attack --update --seconds 60 --hitcount 5 -j DROP
解释:第一条规则检测到包含特定 HTTP GET 请求头部的数据包时,将源 IP 标记为可能的攻击源(--to 65535表示检查整个数据包内容)。第二条规则在 60 秒内,如果来自标记源 IP 的此类数据包达到 5 次,则丢弃后续来自该 IP 的针对 80 端口的 TCP 数据包,从而防范 HTTP 慢速攻击。对于 HTTPS(端口 443)也可以采用类似的方法,只是需要对加密数据进行解包和检查,这可能需要更复杂的配置和工具。
除了以上提到的,还有哪些防范拒绝服务攻击的 iptables 规则?
- 防范 ACK - Flood 攻击
-
- 攻击方式描述:攻击者发送大量带有 ACK 标志的 TCP 数据包,目标主机在处理这些数据包时可能会消耗大量资源用于检查这些非预期的 ACK 包所属的连接状态,从而导致服务质量下降甚至服务不可用。
- iptables 规则防范:
iptables -A INPUT -p tcp -m tcp --tcp - flags ACK ACK - m state --state INVALID - j DROP
解释:这条规则会丢弃状态为无效(--state INVALID)且带有 ACK 标志的 TCP 数据包,减少 ACK - Flood 攻击对服务器的影响。
- 基于 MAC 地址限制访问(针对局域网内攻击)
-
-
规则适用场景描述:在局域网环境下,如果已知合法设备的 MAC 地址,可以通过 MAC 地址来限制访问,防止非法设备接入网络后发起 DoS 攻击。
-
iptables 规则防范:
-
iptables -A INPUT -m mac --mac - source <valid_mac_address> - j ACCEPT
iptables -A INPUT -j DROP
解释:第一条规则允许来自指定 MAC 地址(<valid_mac_address>需要替换为实际合法的 MAC 地址)的数据包进入,第二条规则丢弃其他 MAC 地址来源的数据包。不过这种方法在 MAC 地址容易被伪造的环境下效果可能有限,但在相对封闭、安全的局域网场景中可以作为一种辅助防护手段。
- 防范应用层协议特定的 DoS 攻击(以 DNS 为例)
-
- 攻击方式描述:在 DNS 反射攻击中,攻击者利用 DNS 服务器向目标主机发送大量的 DNS 响应流量。攻击者向多个 DNS 服务器发送查询请求,将源 IP 地址伪造成目标主机的 IP 地址,DNS 服务器会将响应发送给目标主机,导致目标主机被大量的 DNS 响应数据包淹没。
- iptables 规则防范:
iptables -A INPUT -p udp --dport 53 -m string --string "flags: 0x0100; opcode: QUERY; " --algo bm - m recent --name dns_query - - set
iptables -A INPUT -p udp --dport 53 -m recent --name dns_query - - update - - seconds 60 - - hitcount 10 - j DROP
解释:第一条规则检测到符合 DNS 查询特征(通过string模块匹配 UDP 数据包中的特定内容)的数据包时,将源 IP 标记为进行了 DNS 查询的 IP。第二条规则在 60 秒内,如果来自标记 IP 的 DNS 查询相关的数据包达到 10 次,就丢弃后续来自该 IP 的目的端口为 53 的 UDP 数据包,以此来限制可能的 DNS 反射攻击。这只是一个简单的示例,实际应用中可能需要根据 DNS 协议的细节和攻击特征进行更精细的调整。
- 基于时间限制连接(动态防御)
-
- 规则适用场景描述:对于一些非 24 小时持续访问的服务,可以根据服务的正常访问时间来限制连接,减少在非服务时间内遭受攻击的可能性。
- iptables 规则防范(以限制 HTTP 服务在工作时间外访问为例) :
iptables -N TIME_RESTRICT
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00:00 --time - stop 17:00:00 - j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j TIME_RESTRICT
iptables -A TIME_RESTRICT -j DROP
解释:首先创建一个新的链TIME_RESTRICT,然后第一条规则允许在早上 9 点到下午 5 点之间访问 HTTP 服务(端口 80),第二条规则将不符合时间范围的访问引导到TIME_RESTRICT链,第三条规则在TIME_RESTRICT链中丢弃这些数据包,从而实现基于时间的访问限制,降低非工作时间遭受 DoS 攻击的风险。这种方法可以根据具体服务的运营时间灵活调整。
除了 iptables,还有哪些方法可以防范拒绝服务攻击
- 流量清洗设备
-
- 工作原理:
-
-
- 流量清洗设备通常部署在网络的边界,它能够实时监测网络流量。当检测到 DoS 攻击流量时,通过多种复杂的算法和技术,如行为分析、特征匹配等,识别出恶意流量,并将其从正常流量中分离出来进行清洗。这些设备利用深度包检测(DPI)技术,能够检查数据包的内容、协议和行为模式,以区分正常用户请求和攻击流量。
-
-
- 具体措施:
-
-
- 对于 DDoS 攻击中的 SYN Flood 攻击,流量清洗设备可以通过代理服务器的方式来处理 SYN 请求。当收到大量 SYN 包时,设备代替目标服务器响应客户端的 SYN - ACK,只有当收到客户端的 ACK 回复,确认是合法连接后,才将真正的连接请求转发给目标服务器,这样可以有效过滤掉大量虚假的 SYN 请求。
- 对于 UDP Flood 和 ICMP Flood 等攻击,流量清洗设备可以根据流量的行为特征,如流量速率、数据包大小分布、源 IP 分布等,识别出异常流量并进行丢弃或者限制速率。
-
- 负载均衡器
-
- 工作原理:
-
-
- 负载均衡器可以将用户请求均匀地分配到多个服务器上,这样可以分散流量,防止单点服务器因承受过多流量而遭受 DoS 攻击。同时,一些高级的负载均衡器也具备流量检测和防护功能,能够识别异常流量并采取相应措施。
-
-
- 具体措施:
-
-
- 当遭遇 DDoS 攻击时,负载均衡器可以根据预先设定的策略,如基于源 IP 的哈希算法、轮询算法等,将流量分散到后端的多个服务器上。这样即使部分流量是恶意攻击流量,也不会集中在某一个服务器上导致其瘫痪。
- 部分负载均衡器还可以设置健康检查机制,当发现某台后端服务器遭受攻击或者出现故障时,自动将流量切换到其他正常的服务器上,保证服务的可用性。
-
- 入侵检测 / 预防系统(IDS/IPS)
-
- 工作原理:
-
-
- IDS 主要用于监测网络中的入侵行为,它通过分析网络流量、系统日志等信息,检测是否存在潜在的攻击行为。IPS 则在检测的基础上,能够主动采取措施来阻止攻击。它们通常采用基于签名的检测方法(通过识别已知攻击的特征模式)和基于行为的检测方法(通过分析网络行为是否异常)。
-
-
- 具体措施:
-
-
- 对于慢速 HTTP DoS 攻击,IDS/IPS 可以通过监测 HTTP 请求的速率、请求头的大小和格式等特征来发现异常。一旦检测到类似攻击,IPS 可以直接阻断来自攻击源的流量,或者对攻击源进行限速。
- 在应对分布式拒绝服务(DDoS)攻击时,IDS/IPS 可以分析流量的来源和行为模式。如果发现大量来自不同 IP 地址但行为相似(如同时向目标发送大量相同类型的数据包)的流量,判断为可能的 DDoS 攻击,并采取相应的防御措施,如通知防火墙或者上游网络服务提供商来协同防御。
-
- 应用层防火墙
-
- 工作原理:
-
-
- 应用层防火墙能够理解应用层协议(如 HTTP、SMTP、FTP 等)的内容,而不仅仅是像传统防火墙那样基于 IP 地址和端口号进行过滤。它可以对应用层的请求和响应进行深度检查,识别和阻止恶意的应用层攻击,包括那些可能导致 DoS 的攻击。
-
-
- 具体措施:
-
-
- 对于基于 Web 应用的攻击,如 HTTP Flood 攻击,应用层防火墙可以分析 HTTP 请求的合法性。例如,它可以检查请求是否符合 HTTP 协议规范,包括请求方法、请求头格式、请求参数等。如果发现大量不符合规范的请求,可能是攻击行为,防火墙可以直接拒绝这些请求,从而防止应用层服务遭受 DoS 攻击。
- 在防范针对数据库的攻击方面,应用层防火墙可以监控数据库连接请求,检查 SQL 语句是否存在注入风险。如果检测到异常的 SQL 注入尝试,可能是攻击者试图利用漏洞来发动攻击,防火墙可以阻断该连接请求,避免数据库服务因遭受攻击而出现故障。
-
- 网络服务提供商(ISP)层面的防护
-
- 工作原理:
-
-
- ISP 通常拥有更广泛的网络资源和流量监测能力。他们可以在网络的接入层或者核心层检测和过滤大规模的 DDoS 攻击流量。ISP 利用自己的流量清洗中心和网络安全设备,对经过其网络的流量进行监控和过滤。
-
-
- 具体措施:
-
-
- 当发现某个客户的网络流量出现异常,可能遭受 DDoS 攻击时,ISP 可以将攻击流量引导到自己的流量清洗中心。在清洗中心,通过专业的设备和技术对流量进行分析和过滤,将正常流量重新导向客户的网络,从而保障客户网络服务的正常运行。
- ISP 还可以提供一些增值的安全服务,如基于 IP 信誉的过滤。对于那些被识别为经常用于发起攻击的 IP 地址或者 IP 段,在它们进入网络之前就进行拦截,减少潜在的攻击流量。
-