web-dev-qa-db-ja.com

Apacheを実行しているubuntuサーバーで98%のCPU使用率、サイトが応答しない

私はubuntuボックスでApache2を使用してサーバーを実行しています。それは暗号マイニングプールです。私たちのサイトにアクセスする人々の大規模な流入にもかかわらず、すべてが正常に実行されていました。そして、どこからともなく、8つのコアすべてでのCPU使用率は98〜100%です。

サーバーの前でリバースプロキシを使用してDDOS攻撃を軽減していますが、これはこれまでに遭遇したことのないものです。

netstat -an | grep:80 | grep SYN | wc -lは、これが発生している間、100 +の出力を提供します。

Apacheを強制終了すると、負荷がすぐに通常のレベルに下がり、クライアントはサーバー上の他のサービスを引き続き使用できるようになります。ただし、フロントエンドを機能させる必要があります。

いくつかのiptablesルールを試しましたが、機能しません。私はいくつかの提案に従ってsysctlを変更しました:

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

しかし、それは問題を軽減するようには見えません。

私は気が遠くなり、ウェブサイトを立ち上げて再び機能させる必要があります。

すべての提案をいただければ幸いです。

ありがとうございました。

4
user3491412

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接続)を確認できます。

また、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を使用したApacheログファイルの上位10個のIP

不正なIPを特定したら、iptables -A INPUT -s 1.2.3.4 -j DROPでそれらをブロックできます。

Iptablesを使用して接続をレート制限することもできます。たとえば、ソースから1分あたり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

1
LinuxDevOps

あなたの質問は「答え」には少し一般的すぎますが、いくつかの提案があります。

First、hosts.denyファイルを使用して、善人のみを許可するか、選択した悪人を除外します。ローカルネットワークをhosts.allowファイルに配置することを忘れないでください。これが優先されます。あなたはあなたのApacheログで、またはこれを行うことによって悪者を見つけることができます(今日のログからの実際の例)

# 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

これは、最適なファイアウォールプロトコルを見つけている間、物事を機能させ続けるのに十分役立つ可能性があります。 免責事項:上記のスニペットはサンプルであり、完全な説明や解決策ではありません。提示されているように、パスワードの入力に問題があった正当なユーザーをブロックする可能性があるため、結果を監査します。これが、ローカルネットワークをhosts.allowに配置する理由です。

SecondDenyHostsまたはfail2banをインストールします。これにより、上記が自動的に実行されます。 DenyHostsの経験は豊富ですが、好意を失っているようです。 sshサービスを攻撃するホストをターゲットにしますが、すべてのサービスをブロックできます。

番目、iptablesルールの問題を解決します。 Ubuntuはデフォルトでルールをロードしません(またはロードしませんでした)が、ルールを永続化する方法はいくつかあります。 iptables-persistentパッケージをチェックしてください。

1
nortally