最近我遭遇了很多小规模的 DoS 攻击。我想知道我应该使用哪些 iptables 规则来抵御最常见的 DoS 攻击,并总体上保护我的 Web 服务器。
Web 服务器采用 Varnish -> nginx/php5 -> memcached -> mysql
我尝试了一些通用的收据,但它们也阻止了对位于远程服务器上的数据库服务器的访问,因此我只是刷新了建议的规则,现在当我在 iptables 上只看到 fail2ban 时,感觉有点无能为力和容易受到攻击。
因此,感谢您制定的规则,以阻止最常见的攻击媒介。
答案1
以下是我使用的一些规则:
# Reject spoofed packets
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP
# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP
# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP
# Once the day has passed, remove them from the portscan list
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove
# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
答案2
所以,请欣赏你的防弹规则。
您应该联系您的 ISP,在流量到达您之前将其从主干网丢弃。如果您的防火墙必须丢弃流量,那么它已经消耗了您的可用带宽并使用了您的系统资源。
这是唯一“万无一失”的方法。
答案3
我使用 IPtables 来限制对 FTP 和 SSH 的访问,我只允许我的计算机的 IP 连接到服务器。我不能说我遇到了 DOS 攻击问题。
/sbin/iptables -A INPUT -p tcp --dport 22 -s 86.106.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -s 89.122.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -j DROP
/sbin/iptables -A INPUT -p tcp --dport 21 -s 86.106.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 21 -s 89.122.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 21 -j DROP
这些规则允许访问两个不同 IP 上的端口 22 和 21。您可以添加数据库服务器的 MySQL 端口,这样可以阻止其他客户端直接连接到您的服务器。
编辑:当服务器超载时,我发现查看 Apache“mod-status”统计信息很有帮助,输出如下所示:http://www.apache.org/server-status您可以看到所有网站访问者、蜘蛛、url 请求等。实施只需不到 1 分钟:http://httpd.apache.org/docs/2.2/mod/mod_status.html