我在ubuntu上运行apache2服务器。 这是一个encryption矿池。 即使访问我们的网站的人大量stream入,一切正常运行。 那么无处不在我们的CPU使用率在所有8核心是在98至100%
我在服务器前使用反向代理来帮助减轻DDOS攻击,但是这是我以前从未遇到过的。
netstat -an | grep:80 | grep SYN | 当发生这种情况时,wc -l会给出100+的输出。
杀死阿帕奇立即将负载下降到正常水平,并允许我的客户继续使用服务器上的其他服务。 但是我们必须让我们的前端工作。
我已经尝试了几个iptables规则,但他们不工作。 我已经修改了我的sysctl根据一些build议:
net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.core.wmem_max = 16777216 net.core.rmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.tcp_mem = 128000 200000 262144 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_synack_retries = 1 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 1800000 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_tw_recycle = 1 vm.swappiness = 5 net.ipv4.tcp_syncookies = 1
但这似乎并没有缓解这个问题。
我在我的智慧结束,我需要得到的网站,并再次运作。
任何和所有的build议,将不胜感激。
谢谢。
您可以通过netstat -tan| grep -v 'LISTEN'| awk '{print $5}'| grep -v 'and' |grep -v 'Address' |cut -d':' -f1 |sort -n | uniq -c | sort -rn | head -n10每个IP的前10位(或其他编号)当前TCP连接的数量 netstat -tan| grep -v 'LISTEN'| awk '{print $5}'| grep -v 'and' |grep -v 'Address' |cut -d':' -f1 |sort -n | uniq -c | sort -rn | head -n10
Apache日志文件中前10个IP地址为cd /var/log/apache2; for i in ./access.log*; do echo $i; cat $i | awk '{print $1}'| sort -n | uniq -c | sort -rn | head -n10; done cd /var/log/apache2; for i in ./access.log*; do echo $i; cat $i | awk '{print $1}'| sort -n | uniq -c | sort -rn | head -n10; done
一旦你确定了滥用的IP,你可以用iptables -A INPUT -s 1.2.3.4 -j DROP阻止它们iptables -A INPUT -s 1.2.3.4 -j DROP 。
你也可以限制与iptables的连接,例如,如果你不想每分钟从一个源连接超过20个连接:
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP
你的问题对于“答案”来说太笼统了,但是我有几点build议:
首先 ,使用你的hosts.deny文件,要么只允许好人或排除选定的坏人。 请记住将您的本地networking放在您的hosts.allow文件中,这个文件优先。 你可以在你的Apache日志中find坏人,或者通过这样做(从今天的日志中的实例)
# BADGUYS=(`grep "authentication failure.*rhost=" /var/log/auth.log | \ sed 's/.*rhost=\(\S*\).*/\1/' | \ sort -u`) # echo ${BADGUYS[0]} 109.228.29.199
现在阻止他们
# for GUY in ${BADGUYS[*]}; do > echo "ALL: $GUY" >> /etc/hosts.deny > done
这可能有助于在找出最佳防火墙协议的同时保持工作。 免责声明 :上面的片段是一个样本,而不是一个完整的讨论或解决scheme。 如上所述,它可能会阻止一些合法用户在input密码时遇到麻烦,因此请审核结果。 这就是为什么你希望你的本地networking在hosts.allow 。
其次 ,安装DenyHosts或fail2ban ,这会自动执行上述操作。 我对DenyHosts有了更多的经验,但是似乎正在失宠。 它的目标主机攻击你的SSH服务,但可以阻止所有的服务。
三 ,解决iptables规则问题。 Ubuntu没有(或没有)默认加载规则,但有几种方法使其持久化。 看看iptables-persistent包。