新睿云

> DDoS高防云服务器 > 安全专家告诉你如何用linux防ddos

安全专家告诉你如何用linux防ddos

作者/来源:新睿云小编 发布时间:2019-06-18

Iptable是什么?

网滤器表(不久将由nftable)是一个用户空间命令行实用工具,用于配置netfilter开发的内核包过滤规则。

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

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

最常见的情况是,它用于阻塞目标端口和源IP地址。

DDoS工具

减轻DDoS的最佳Linux内核设置

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

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

我们不会涵盖您需要调整的每个内核设置,以便更好地使用iptable来减轻DDoS。

相反,我们提供了一组我们将使用的CentOS 7内核设置。把下面的东西放进你的/etc/sysctl.conf文件并将设置应用于sysctl-p.

反DDoS内核设置(sysctl.conf)

kernel.printk = 4 4 1 7

kernel.panic = 10

kernel.sysrq = 0

kernel.shmmax = 4294967296

kernel.shmall = 4194304

kernel.core_uses_pid = 1

kernel.msgmnb = 65536

kernel.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_established = 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

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

linux防ddos——实际的iptable反DDoS规则

考虑到你现在知道您需要使用破烂表与预出链除了优化内核设置以减轻DDoS攻击的影响外,我们现在将继续讨论一些示例规则,以减轻大多数TCPDDoS攻击。

DDoS攻击很复杂。

确实有许多不同类型的DDoS而且几乎不可能对所有这些人维持基于签名的规则。

但幸运的是,有一种叫做连接跟踪(nf_contrack内核模块)的东西,它可以帮助我们减轻几乎任何基于TCP的DDoS攻击,这些攻击不使用似乎合法的SYN数据包。

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

我们将从五个简单的iptable规则开始,这些规则已经删除了许多基于TCP的DDoS攻击。

linux防ddos阻止无效数据包

iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP

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

linux防ddos阻止非SYN的新数据包

iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

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

块不常见的MSS值

iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

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

linux防ddos用假冒TCP标志阻止数据包

iptables -t mangle -A PREROUTING -p tcp --tcp-flags

FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 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,FIN FIN -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 ALL -j DROP iptables -t mangle -A PREROUTING -p tcp --

tcp-flags ALL NONE -j DROP iptables -t mangle -A PREROUTING -p tcp --

tcp-flags ALL FIN,PSH,URG -j DROP iptables -t mangle -A PREROUTING -p

tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP iptables -t mangle -A

PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

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

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

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 DROP

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

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

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

有了上面提到的内核设置和规则,您将能够以行速率过滤ACK和SYN-ACK攻击。

附加规则

iptables -t mangle -A PREROUTING -p icmp -j DROP

这将丢弃所有ICMP数据包。ICMP只是用来检查主机是否还活着。因为它通常不需要,而且只代表了攻击者可以利用的另一个漏洞,因此我们阻止所有ICMP数据包来减少死平(ping洪水)、ICMP洪水和ICMP碎片泛滥。

iptables -A INPUT -p tcp -m connlimit --connlimit-above 80 -j REJECT --reject-with tcp-reset

此iptable规则有助于防止连接攻击。它拒绝来自具有80多个已建立连接的主机的连接。如果您面临任何问题,您应该提高限制,因为这可能会给建立大量TCP连接的合法客户端带来麻烦。

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

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

iptables -t mangle -A PREROUTING -f -j DROP

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

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

这限制了传入的TCP RST数据包,以减少TCP RST溢出。这一规则的有效性值得怀疑。

SYNPROXY缓解SYN洪水

SYNPROXY是Linux内核版本3.12和Iptables 1.4.21中添加的Iptables的一个新目标。CentOS 7支持这个特性,它在其3.10默认内核中可用。

SYNPROXY的目的是检查发送SYN数据包的主机是否确实建立了完整的TCP连接,还是在发送SYN数据包之后什么也不做。

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

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

需要注意的是,如果我们找到要阻止的模式或签名,例如数据包长度(-m长),TOS(-Mtos),TTL(-mttl)或字符串和十六进制值(-m弦和-m u 32对于更高级的用户)。

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

下面是IptabLes SYNPROXY规则,这些规则有助于减轻绕过我们其他规则的SYN洪水:

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

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

要验证SYNPROXY是否有效,可以执行以下操作Watch-n1 cat/proc/net/stat/synxy..如果在建立到使用SYNPROXY的端口的新TCP连接时,值发生了变化,则可以使用。

linux防ddos——完整的iptable反DDoS规则

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

### 1: Drop invalid packets ### /sbin/iptables -t mangle -A PREROUTING

-m conntrack --ctstate INVALID -j DROP ### 2: Drop TCP packets that are

new and are not SYN ### /sbin/iptables -t mangle -A PREROUTING -p

tcp ! --syn -m conntrack --ctstate NEW -j DROP ### 3: Drop SYN packets

with suspicious MSS value ### /sbin/iptables -t mangle -A PREROUTING

-p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

### 4: Block packets with bogus TCP flags ### /sbin/iptables -t mangle -

A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j

DROP /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,FIN FIN -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 ALL -j DROP /sbin/iptables -t mangle -A

PREROUTING -p tcp --tcp-flags ALL NONE -j DROP /sbin/iptables -t

mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP

/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL

SYN,FIN,PSH,URG -j DROP /sbin/iptables -t mangle -A PREROUTING -p

tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP ### 5: Block spoofed

packets ### /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 DROP

### 6: Drop ICMP (you usually don't need this protocol) ###

/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP ### 7: Drop

fragments in all chains ### /sbin/iptables -t mangle -A PREROUTING -f -j

DROP ### 8: Limit connections per source IP ### /sbin/iptables -A INPUT

-p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-

reset ### 9: Limit RST packets ### /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: Limit new TCP

connections per second per source IP ### /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: Use SYNPROXY on all ports (disables connection limiting

rule) ### # Hidden - unlock content above in "Mitigating SYN Floods

With SYNPROXY" section

奖金规则

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

### SSH brute-force protection ### /sbin/iptables -A INPUT -p tcp --

dport ssh -m conntrack --ctstate NEW -m recent --set /sbin/iptables -A

INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update

--seconds 60 --hitcount 10 -j DROP ### Protection against port scanning

### /sbin/iptables -N port-scanning /sbin/iptables -A port-scanning -p

tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j

RETURN /sbin/iptables -A port-scanning -j DROP

结语

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

我们成功地减少了DDoS攻击,这些攻击在每秒百万包使用这些iptable规则。

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

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

不要低估Iptable的力量!

热门标签
new year
在线咨询
咨询热线 400-1515-720
投诉与建议
{{item.description}}

—您的烦恼我们已经收到—

我们会将处理结果发送至您的手机

请耐心等待