使用 IPtables 进行 DDoS 保护

有多种方法可以为 iptables 构建自己的反 DDoS 规则。我们将在本综合教程中讨论最有效的 iptables DDoS 保护方法。

本指南将教您如何:

  1. 选择最好的 iptables 表和链来阻止 DDoS 攻击
  2. 调整内核设置以减轻 DDoS 攻击的影响
  3. 使用 iptables 阻止大多数基于 TCP 的 DDoS 攻击
  4. 使用 iptables SYNPROXY 来阻止 SYN 泛洪

请注意,本文是为每天与 Linux 服务器打交道的专业人士编写的。

目录 显示 

如果您只想保护您的在线应用程序免受 DDoS 攻击,您可以使用我们的远程保护、具有 DDoS 保护的 VPS 或受 DDoS 保护的裸机服务器。

虽然使用 iptables 可以做很多事情来阻止 DDoS 攻击,但没有办法绕过实际的硬件防火墙(我们最近审查了 RioRey DDoS 缓解硬件)来检测和阻止大型 DDoS 洪水。

但是,使用 iptables 以线路速率过滤大多数不良流量并非不可能!

我们将只介绍对基于 TCP 的攻击的保护。大多数基于 UDP 的攻击都是放大反射攻击,会耗尽任何普通服务器的网络接口卡。

对这些类型的攻击有意义的唯一缓解方法是在边缘或核心网络,甚至已经在运营商处阻止它们。

如果他们能够访问您的服务器,那么您对这些多 Gbit/s 攻击无能为力,只能移动到受 DDoS 保护的网络。

什么是 IPtables?

netfilter iptables(即将被nftables取代)是一个用户空间命令行实用程序,用于配置由 netfilter 开发的内核数据包过滤规则。

它是 Linux 系统上默认的防火墙管理实用程序——每个使用 Linux 系统的人都应该熟悉它,或者至少听说过它。

iptables 可用于过滤某些数据包、阻止源或目标端口和 IP 地址、通过 NAT 转发数据包以及许多其他事情。

最常见的是它用于阻止目标端口和源 IP 地址。

为什么您的 IPtables 反 DDoS 规则很糟糕

要了解为什么您当前防止 DDoS 攻击的 iptables 规则很糟糕,我们首先必须深入了解 iptables 的工作原理。

iptables 是一个命令行工具,用于设置和控制IP 包过滤规则。有不同的表用于不同的目的。

IPtables 表

过滤器:如果您不使用-t ( –table ) 选项,过滤器表是规则转到的默认和最常用的表。

NAT:此表用于网络地址转换 (NAT)。如果一个数据包创建了一个新连接,则检查nat表的规则。

Mangle: mangle表用于修改或标记数据包及其包头信息。

Raw:此表的目的主要是从使用 NOTRACK 目标的连接跟踪中排除某些数据包。

如您所见,在没有加载非标准内核模块的普通 Linux 系统上,有四个不同的表。这些表中的每一个都支持一组不同的 iptables

IPtables 链

PREROUTING: raw, nat, mangle

  • 适用于进入网卡(NIC)的数据包

输入:过滤器,mangle

  • 适用于发往本地套接字的数据包

FORWARD:过滤器,mangle

  • 适用于通过服务器路由的数据包

输出:原始、过滤器、nat、mangle

  • 适用于服务器发送的数据包(本地生成)

POSTROUTING: nat, mangle

  • 适用于离开服务器的数据包

根据您要阻止或修改的数据包类型,您可以选择某个 iptables 表和所选表支持的链。

当然,我们仍然缺少对 iptables 目标的解释(ACCEPT、DROP、REJECT 等),但我们假设如果您正在阅读本文,您已经知道如何处理 iptables。

我们将解释为什么你的 iptables 规则很难阻止 DDoS,而不是教你如何使用 iptables。让我们回到那个。

如果你想用 iptables 阻止 DDoS 攻击,iptables 规则的性能非常重要。大多数基于 TCP 的 DDoS 攻击类型使用高数据包速率,这意味着每秒的数据包数量是导致服务器关闭的原因。

这就是为什么您要确保每秒可以处理和阻止尽可能多的数据包。

您会发现大多数(如果不是全部)关于如何使用 iptables 阻止 DDoS 攻击的指南都使用过滤表和 INPUT 链来获取反 DDoS 规则。

这种方法的问题在于,INPUT 链仅在 PREROUTING 和 FORWARD 链之后处理,因此仅适用于数据包与这两个链中的任何一个都不匹配的情况。

这会导致对消耗资源的数据包的过滤产生延迟。总之,为了使我们的规则尽可能有效,我们需要将我们的反 DDoS 规则移动到尽可能远的位置。

可以应用于数据包的第一个链是 PREROUTING 链,因此理想情况下,我们希望已经过滤掉该链中的坏数据包。

但是,过滤表不支持 PREROUTING 链。为了解决这个问题,我们可以简单地使用mangle表而不是过滤表作为我们的 anti-DDoS iptables 规则。

它支持过滤表支持的大多数(如果不是全部)规则,同时还支持所有iptables 链。

所以你想知道为什么你的 iptables DDoS 保护规则很糟糕?这是因为您使用过滤器表和 INPUT 链来阻止坏包!

显着提高 iptables 规则性能以及它们可以过滤的 (TCP) DDoS 攻击流量的最佳解决方案是使用mangle表和 PREROUTING 链!

缓解 DDoS 的最佳 Linux 内核设置

另一个常见的错误是人们没有使用优化的内核设置来更好地减轻 DDoS 攻击的影响。

请注意,本指南侧重于 CentOS 7 作为首选操作系统。CentOS 7 包括最新版本的 iptables 和对新 SYNPROXY 目标的支持。

我们不会涵盖您需要调整的每一个内核设置,以便更好地使用 iptables 缓解 DDoS。

相反,我们提供了一组我们将使用的 CentOS 7 内核设置。只需将以下内容放入您的/etc/sysctl.conf文件并使用sysctl -p应用设置。

防 DDoS 内核设置(sysctl.conf)

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">内核.printk = 4 4 1 7
kernel.panic = 10
内核.sysrq = 0
kernel.shmmax = 4294967296
kernel.shmall = 4194304
kernel.core_uses_pid = 1
内核.msgmnb = 65536
内核.msgmax = 65536
vm.swappiness = 20
vm.dirty_ratio = 80
vm.dirty_background_ratio = 5
fs.file-max = 2097152
net.core.netdev_max_backlog = 262144
net.core.rmem_default = 31457280
net.core.rmem_max = 67108864
net.core.wmem_default = 31457280
net.core.wmem_max = 67108864
net.core.somaxconn = 65535
net.core.optmem_max = 25165824
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 16384
net.ipv4.neigh.default.gc_interval = 5
net.ipv4.neigh.default.gc_stale_time = 120
net.netfilter.nf_conntrack_max = 10000000
net.netfilter.nf_conntrack_tcp_loose = 0
net.netfilter.nf_conntrack_tcp_timeout_builted = 1800
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 20
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_no_pmtu_disc = 1
net.ipv4.route.flush = 1
net.ipv4.route.max_size = 8048576
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.udp_rmem_min = 16384
net.ipv4.tcp_wmem = 4096 87380 33554432
net.ipv4.udp_wmem_min = 16384
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 400000
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 10
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1</span></span>

这些 sysctl.conf 设置有助于最大限度地提高服务器在 DDoS 下的性能以及我们将在本指南中提供的 iptables 规则的有效性。

实际的 IPtables Anti-DDoS 规则

考虑到您现在知道需要使用mangle表和 PREROUTING 链以及优化的内核设置来减轻 DDoS 攻击的影响,我们现在将继续介绍一些示例规则来减轻大多数 TCP DDoS 攻击。

DDoS 攻击很复杂。

许多不同类型的 DDoS,几乎不可能针对所有这些类型维护基于签名的规则。

但幸运的是,有一种称为连接跟踪(nf_conntrack 内核模块)的东西,它可以帮助我们缓解几乎所有不使用看似合法的 SYN 数据包的基于 TCP 的 DDoS 攻击。

这包括所有类型的 ACK 和 SYN-ACK DDoS 攻击以及使用虚假 TCP 标志的 DDoS 攻击。

我们将从五个简单的 iptables 规则开始,这些规则已经可以阻止许多基于 TCP 的 DDoS 攻击。

阻止无效数据包

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP</span></span>

此规则阻止所有不是 SYN 数据包且不属于已建立的 TCP 连接的数据包。

阻止不是 SYN 的新数据包

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -t mangle -A PREROUTING -p tcp !--syn -m conntrack --ctstate NEW -j DROP</span></span>

这会阻止所有新的数据包(不属于已建立的连接)并且不使用 SYN 标志。此规则类似于“阻止无效数据包”规则,但我们发现它捕获了一些其他规则没有捕获的数据包。

阻止不常见的 MSS 值

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss !--mss 536:65535 -j 删除</span></span>

上面的 iptables 规则阻止使用不常见的 TCP MSS 值的新数据包(根据前两个规则,只有 SYN 数据包可以是新数据包)。这有助于阻止愚蠢的 SYN 洪水。

阻止带有虚假 TCP 标志的数据包

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
iptables - t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
iptables -t mangle -A PREROUTING -p tcp -- tcp-flags ALL NONE -j DROP</span></span>

上述规则集阻止使用虚假 TCP 标志的数据包,即。合法数据包不会使用的 TCP 标志。

阻止来自私有子网的数据包(欺骗)

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP
iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP
iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP
iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP
iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP
iptables -t mangle -A PREROUTING -s 127.0.0.0/8 !-i lo -j 删除</span></span>

这些规则阻止来自私有(本地)子网的欺骗数据包。在您的公共网络接口上,您通常不想接收来自私有源 IP 的数据包。

这些规则假定您的环回接口使用 127.0.0.0/8 IP 空间。

仅这五组规则就已经阻止了许多以非常高的数据包速率进行的基于 TCP 的 DDoS 攻击。

使用上面提到的内核设置和规则,您将能够以线速过滤 ACK 和 SYN-ACK 攻击。

附加规则

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -t mangle -A PREROUTING -p icmp -j DROP</span></span>

这将丢弃所有 ICMP 数据包。ICMP 仅用于 ping 主机以查明它是否还活着。因为它通常不需要并且只代表攻击者可以利用的另一个漏洞,所以我们阻止所有 ICMP 数据包以缓解 Ping of Death(ping 洪水)、ICMP 洪水和 ICMP 碎片洪水。

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -A INPUT -p tcp -m connlimit --connlimit-above 80 -j REJECT --reject-with tcp-reset</span></span>

此 iptables 规则有助于抵御连接攻击。它拒绝来自已建立超过 80 个连接的主机的连接。如果您遇到任何问题,您应该提高限制,因为这可能会导致建立大量 TCP 连接的合法客户端出现问题。

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP</span></span>

限制客户端每秒可以建立的新 TCP 连接。这对于对抗连接攻击很有用,但对于 SYN 泛洪来说就没有那么大了,因为它通常会使用无数种不同的欺骗源 IP。

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -t mangle -A PREROUTING -f -j DROP</span></span>

此规则阻止分段数据包。通常你不需要这些,阻塞碎片将减轻 UDP 碎片泛滥。但大多数情况下,UDP 碎片泛滥使用大量带宽,这可能会耗尽网卡的容量,这使得这条规则是可选的,可能不是最有用的规则。

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP</span></span>

这会限制传入的 TCP RST 数据包以减轻 TCP RST 泛洪。这条规则的有效性值得怀疑。

使用 SYNPROXY 缓解 SYN 洪水

SYNPROXY 是 iptables 的新目标,已在 Linux 内核版本 3.12 和 iptables 1.4.21 中添加。CentOS 7 向后移植了该功能,并在其 3.10 默认内核中可用。

SYNPROXY 的目的是检查发送 SYN 数据包的主机是否真的建立了完整的 TCP 连接,或者在发送 SYN 数据包后什么都不做。

如果它什么都不做,它会以最小的性能影响丢弃数据包。

虽然我们上面提供的 iptables 规则已经阻止了大多数基于 TCP 的攻击,但如果足够复杂,仍然可以通过它们的攻击类型是 SYN 洪水。

需要注意的是,如果我们找到要阻止的特定模式或签名,例如数据包长度(-m length)、TOS(-m tos)、TTL(-m ttl)或字符串,规则的性能总是会更好。和十六进制值(-m 字符串和-m u32用于更高级的用户)。

但在极少数情况下,这是不可能的,或者至少不容易实现。因此,在这些情况下,您可以使用 SYNPROXY。

以下是有助于缓解绕过我们其他规则的 SYN 泛滥的 iptables SYNPROXY 规则:

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack
iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP</span></span>

这些规则适用于所有端口。如果您只想在某些活动的 TCP 端口上使用 SYNPROXY(推荐 - 您还应该使用 mangle 表和 PREROUTING 链阻止所有未使用的 TCP 端口),您只需将–dport 80添加到每个规则如果您只想在端口 80 上使用 SYNPROXY。

要验证 SYNPROXY 是否正常工作,您可以执行watch -n1 cat /proc/net/stat/synproxy。如果在您与使用 SYNPROXY 的端口建立新的 TCP 连接时值发生变化,则它可以工作。

完整的 IPtables 反 DDoS 规则

如果您不想复制和粘贴我们在本文中讨论的每条规则,您可以使用以下规则集对您的 Linux 服务器进行基本的 DDoS 保护。

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">### 1:丢弃无效数据包###
/sbin/iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP  

### 2:丢弃新的且不是 SYN 的 TCP 数据包 ###
/sbin/iptables -t mangle -A PREROUTING -p tcp !--syn -m conntrack --ctstate NEW -j DROP
 
### 3:丢弃具有可疑 MSS 值的 SYN 数据包###
/sbin/iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss !--mss 536:65535 -j 删除  

### 4:阻止带有虚假 TCP 标志的数据包###
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN, RST -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN ,ACK FIN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK ,PSH PSH -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP

### 5:阻止欺骗性数据包###
/sbin/iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 127.0.0.0/8 !-i lo -j 删除  

### 6:丢弃 ICMP(您通常不需要此协议)###
/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP  

### 7:在所有链中丢弃片段###
/sbin/iptables -t mangle -A PREROUTING -f -j DROP  

### 8:限制每个源 IP 的连接数 ###
/sbin/iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset  

### 9:限制RST数据包###
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP  

### 10:限制每个源 IP 每秒的新 TCP 连接数 ###
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP  

### 11:在所有端口上使用 SYNPROXY(禁用连接限制规则)###
# 隐藏 - 解锁上面“使用 SYNPROXY 缓解 SYN 洪水”部分中的内容</span></span>

奖金规则

以下是一些有助于提高 Linux 服务器整体安全性的 iptables 规则:

<span style="background-color:#eeeeee"><span style="color:#3a3a3a">### SSH 蛮力保护 ###
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m 最近 --set
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m 最近 --update --seconds 60 --hitcount 10 -j DROP  

### 防止端口扫描###
/sbin/iptables -N 端口扫描
/sbin/iptables -A 端口扫描 -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
/sbin/iptables -A 端口扫描 -j DROP</span></span>

结论

本教程演示了一些使用 iptables 阻止 DDoS 攻击的最强大和最有效的方法。

我们已经使用这些 iptables 规则成功地缓解了以每秒数百万个数据包为峰值的 DDoS 攻击。

我们研究过的关于同一主题的每一份指南都提供了阻止 DDoS 流量的低效方法,或者仅提供了非常有限数量的 iptables 规则。

如果使用得当,iptables 是一个非常强大的工具,能够以 1GigE NIC 的线速和接近 10GigE NIC 的线速阻止不同类型的 DDoS 攻击。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值