文章目录
完整的IPtables Anti-DDoS规则
原文请参考:这里
### 1: 丢弃无效的数据包 ###
#/sbin/iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
#阻止不是SYN的新数据包,
#这将阻止所有不使用SYN标志的新数据包(不属于已建立的连接)。此规则类似于“阻止无效数据包”,但我们发现它捕获了其他数据包未捕获的一些数据包。此规则将阻止所有不是SYN数据包并且不属于已建立的TCP连接的数据包
### 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 DROP
### 4: 阻止带有虚假TCP标志的数据包 ###
#iptables -t mangle -A PREROUTING -m conntrack –ctstate INVALID -j DROP 如果使用这条命令,就不需要下面的命令
/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
#上面的规则集阻止使用伪造的TCP标志的数据包。合法数据包不会使用的TCP标志。
### 5: 阻止欺骗性数据包 ###
#这些规则将阻止源自私有(本地)子网的欺骗性数据包。在您的公共网络接口上,您通常不希望接收来自私有源IP的数据包。
#仅前面五组规则就已经以很高的数据包速率阻止了许多基于TCP的DDoS攻击,使用前文提到的内核设置和规则,您将能够以线速过滤ACK和SYN-ACK攻击
/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: 删除ICMP(您通常不需要此协议) ###
#/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP
### 7: 掉落所有链条中的碎片 ###
/sbin/iptables -t mangle -A PREROUTING -f -j DROP
### 8: 限制每个源IP的连接 ###
#该iptables规则有助于抵御连接攻击。它拒绝来自拥有111多个已建立连接的主机的连接。如果遇到任何问题,则应提高该限制,因为这可能会给建立大量TCP连接的合法客户端造成麻烦。
/sbin/iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset
### 9: 限制RST报文 (作用不大)###
#限制客户端每秒可以建立的新TCP连接。这对于抵御连接攻击很有用,但对于SYN泛洪却没有太大帮助,因为通常使用无数种不同的欺骗源IP。
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 10/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
此规则阻止分段的数据包。通常,您不需要这些,阻塞片段将减轻UDP片段泛滥。但是大多数时候UDP碎片洪泛使用大量带宽,可能会耗尽网卡的容量,这使此规则成为可选规则,可能不是最有用的规则。
iptables -t mangle -A PREROUTING -f -j DROP
### 11: 在所有端口上使用SYNPROXY(禁用连接限制规则) ###
# 隐藏-解锁以上“使用SYNPROXY缓解SYN Floods”部分中的内容
虽然我们上面提供的iptables规则已经可以阻止大多数基于TCP的攻击,但是如果足够复杂,攻击类型仍然可以通过SYN泛滥。
重要的是要注意,如果我们找到要阻止的特定模式或签名,例如包长度(-m length),TOS(-m tos),TTL(-m ttl)或字符串,则规则的性能将始终更好。
和十六进制值(-m字符串和-m u32用于更高级的用户)。
但是在极少数情况下,这是不可能的,或者至少不容易实现。因此,在这些情况下,您可以使用SYNPROXY。
这是iptables SYNPROXY规则,可帮助缓解绕过其他规则的SYN泛洪:
这些规则适用于所有端口。如果您只想在活动的某些TCP端口上使用SYNPROXY(建议–还应使用mangle表和PREROUTING链来阻止所有未使用的TCP端口),则只需在每个规则中添加–dport 80如果只想在端口80上使用SYNPROXY。
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
要验证SYNPROXY是否正常运行,您可以观看watch -n1 cat /proc/net/stat/synproxy。
如果在与使用SYNPROXY的端口建立新的TCP连接时值更改,则该值有效。
以下是一些其他iptables规则,这些规则可用于提高Linux服务器的整体安全性
### SSH暴力保护 ###
/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
### 防止端口扫描 ###
/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
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论