重新加载IPTables禁用访问站点

我有CentOS 7 VPS。

IPtables包含2000个IP块规则。 重新加载时需要80秒才能完成重新加载。

在那80秒,我注意到大约15秒,我的网站变得没有反应,并且浏览器不能访问页面。 当重新加载完成时,网站返回并且可以访问页面。

我想问的是当IPTables规则再次被重新加载时,预期的networking无响应?

这是主要结构:

/sbin/iptables -F FORWARD /sbin/iptables -F OUTPUT /sbin/iptables -Z FORWARD /sbin/iptables -Z OUTPUT /sbin/iptables -P INPUT DROP /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -j REJECT --reject-with tcp-reset /sbin/iptables -A INPUT -m state --state INVALID -j DROP /sbin/iptables -P OUTPUT DROP /sbin/iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j REJECT --reject-with tcp-reset /sbin/iptables -A OUTPUT -m state --state INVALID -j DROP /sbin/iptables -P FORWARD DROP /sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j REJECT --reject-with tcp-reset /sbin/iptables -A FORWARD -m state --state INVALID -j DROP /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A OUTPUT -o lo -j ACCEPT /sbin/iptables -A FORWARD -i lo -o lo -j ACCEPT /sbin/iptables -t mangle -F /sbin/iptables -t mangle -Z /sbin/iptables -t mangle -P PREROUTING ACCEPT /sbin/iptables -t mangle -P OUTPUT ACCEPT /sbin/iptables -t mangle -P INPUT ACCEPT /sbin/iptables -t mangle -P FORWARD ACCEPT /sbin/iptables -t mangle -P POSTROUTING ACCEPT /sbin/iptables -t nat -F /sbin/iptables -t nat -Z /sbin/iptables -t nat -P PREROUTING ACCEPT /sbin/iptables -t nat -P OUTPUT ACCEPT /sbin/iptables -t nat -P POSTROUTING ACCEPT # # ACCEPT RULES. JUST A FEW # # /sbin/iptables -I INPUT -s 95.104.79.33 -j ACCEPT /sbin/iptables -I INPUT -s 108.161.176.0/20 -p tcp -m multiport --dports 80,443 -j ACCEPT # # BLOCK RULES. EXCERPT. 2000 RULES MORE # # /sbin/iptables -A INPUT -s 9.101.144.4 -j DROP /sbin/iptables -A INPUT -s 94.229.64.6 -j DROP /sbin/iptables -A INPUT -s 973.209.49.7 -j DROP /sbin/iptables -A INPUT -s 98.150.131.8 -j DROP /sbin/iptables -A INPUT -s 98.168.114.5 -j DROP /sbin/iptables -A INPUT -p tcp --dport 12443 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 11443 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 11444 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 8447 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 8443 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 8880 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 587 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 465 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 995 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 993 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 106 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 3306 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 5432 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 9008 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 9080 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 137 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 138 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 139 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 445 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 1194 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 53 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 53 -j ACCEPT /sbin/iptables -A INPUT -p icmp --icmp-type 8/0 -j ACCEPT /sbin/iptables -A INPUT -j DROP /sbin/iptables -A OUTPUT -j ACCEPT /sbin/iptables -A FORWARD -j DROP 

其实我正在使用Plesk防火墙重新加载shell脚本: firewall-active.sh

firewall-active.sh

 #!/bin/bash #ATTENTION! # #DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY, #SO ALL YOUR CHANGES WILL BE LOST THE NEXT TIME THE FILE IS GENERATED. set -e echo 0 > /proc/sys/net/ipv4/ip_forward ([ -f /var/lock/subsys/ipchains ] && /etc/init.d/ipchains stop) >/dev/null 2>&1 || true (rmmod ipchains) >/dev/null 2>&1 || true apply_rule() { iptables_bin="$1" shift iptables_version=`/sbin/iptables --version | awk -F '.' '{print $2$3}'` # Use the native --wait option since v1.4.20 if [ $iptables_version -gt 420 ]; then $iptables_bin -w $@ 2>/dev/null return $? fi # Emulate --wait for elderly versions for i in `seq 10`; do $iptables_bin $@ 2>&1 | grep -q xtable || return 0 sleep 1 done return 1 } # # CREATE DELETE RULES BY USING IPTABLES-SAVE # # /sbin/iptables-save -t filter | grep -- "-A INPUT" | grep -v "fail2ban-\|f2b-" | sed -e "s#^-A#apply_rule /sbin/iptables -D#g" | (echo -e "`declare -f apply_rule`\n" && cat ) | /bin/bash apply_rule /sbin/iptables -F FORWARD apply_rule /sbin/iptables -F OUTPUT apply_rule /sbin/iptables -Z FORWARD apply_rule /sbin/iptables -Z OUTPUT apply_rule /sbin/iptables -P INPUT DROP apply_rule /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -j REJECT --reject-with tcp-reset apply_rule /sbin/iptables -A INPUT -m state --state INVALID -j DROP apply_rule /sbin/iptables -P OUTPUT DROP apply_rule /sbin/iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT apply_rule /sbin/iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j REJECT --reject-with tcp-reset apply_rule /sbin/iptables -A OUTPUT -m state --state INVALID -j DROP apply_rule /sbin/iptables -P FORWARD DROP apply_rule /sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT apply_rule /sbin/iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j REJECT --reject-with tcp-reset apply_rule /sbin/iptables -A FORWARD -m state --state INVALID -j DROP apply_rule /sbin/iptables -A INPUT -i lo -j ACCEPT apply_rule /sbin/iptables -A OUTPUT -o lo -j ACCEPT apply_rule /sbin/iptables -A FORWARD -i lo -o lo -j ACCEPT apply_rule /sbin/iptables -t mangle -F apply_rule /sbin/iptables -t mangle -Z apply_rule /sbin/iptables -t mangle -P PREROUTING ACCEPT apply_rule /sbin/iptables -t mangle -P OUTPUT ACCEPT apply_rule /sbin/iptables -t mangle -P INPUT ACCEPT apply_rule /sbin/iptables -t mangle -P FORWARD ACCEPT apply_rule /sbin/iptables -t mangle -P POSTROUTING ACCEPT apply_rule /sbin/iptables -t nat -F apply_rule /sbin/iptables -t nat -Z apply_rule /sbin/iptables -t nat -P PREROUTING ACCEPT apply_rule /sbin/iptables -t nat -P OUTPUT ACCEPT apply_rule /sbin/iptables -t nat -P POSTROUTING ACCEPT # # ACCEPT RULES. JUST A FEW # # apply_rule /sbin/iptables -I INPUT -s 95.104.79.33 -j ACCEPT apply_rule /sbin/iptables -I INPUT -s 108.161.176.0/20 -p tcp -m multiport --dports 80,443 -j ACCEPT # # BLOCK RULES. EXCERPT. 2000 RULES MORE # # apply_rule /sbin/iptables -A INPUT -s 9.101.144.4 -j DROP apply_rule /sbin/iptables -A INPUT -s 94.229.64.6 -j DROP apply_rule /sbin/iptables -A INPUT -s 973.209.49.7 -j DROP apply_rule /sbin/iptables -A INPUT -s 98.150.131.8 -j DROP apply_rule /sbin/iptables -A INPUT -s 98.168.114.5 -j DROP apply_rule /sbin/iptables -A INPUT -p tcp --dport 12443 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 11443 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 11444 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 8447 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 8443 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 8880 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 587 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 465 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 995 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 993 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 106 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 3306 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 5432 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 9008 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 9080 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p udp --dport 137 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p udp --dport 138 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 139 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 445 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p udp --dport 1194 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p udp --dport 53 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p tcp --dport 53 -j ACCEPT apply_rule /sbin/iptables -A INPUT -p icmp --icmp-type 8/0 -j ACCEPT apply_rule /sbin/iptables -A INPUT -j DROP apply_rule /sbin/iptables -A OUTPUT -j ACCEPT apply_rule /sbin/iptables -A FORWARD -j DROP echo 1 > /proc/sys/net/ipv4/ip_forward # # End of script # 

它实际上是这样做的:

  • 先检查iptables-save
  • find一个-A INPUT规则,
  • 将它们转换为-D规则以删除它们。

然后重新加载防火墙,如上所示结构。 因为有2000个单独的规则,它需要80秒和15秒的网站没有响应。

我试图通过指定IP并排地将这2000条单独的规则合并为一条规则,但是没有任何意义。 因为iptables无论如何都在表中添加了2000条规则。 重新加载减less到40秒,但仍然缓慢。

脚本的哪个部分正在创build无响应?

首先,是的,没有反应的预期; 原因是通过设置策略和刷新规则集来重新启动。 你的脚本的第一件事是刷新INPUT链(实际上,它没有这样的事情,但我怀疑你刚刚离开了前两行),然后将策略设置为DROP 。 一旦设置了策略并刷新了现有的规则集,您就会看到一个带有DROP策略的空链,该策略会立即让stream量无法通过。 随着规则随后被重新加载,正常行为被恢复。

更大的问题是规则集的大小。 2000年的规则是疯狂的。 我已经pipe理了一些非常大的基于iptables的防火墙 – 对于整个站点而言,而不仅仅是单个机器 – 多年来,甚至在服务十年之后,从未达到过500条规则。 2000年的规则很多年来,“ oooh dev只是需要能够从这个地址到这个端口上的这个地址 ”,在规则集没有回退,合并,垃圾收集/清理。 与DENY策略相比,2000例外的防火墙坦白地说并不是防火墙,而是劣质的跳线。

我强烈的感觉是,你需要打电话给你的用户社区来certificate这个规则集中的每一条规则,明确的date规则还没有被使用和必要的业务。 您可能会发现需要保留的一些规则可以通过使用用户定义的链, -m multiport ,使用CIDR后缀-s和/或-d进行合并。

严格修剪规则集之前,重新加载需要花费一些时间,并且防火墙在执行操作时不会正常运行。