Remote client <-> AWS ELB <-> Web server (Nginx) <-> Application
當有用戶非常好心地發大量 request 來檢查機器漏洞,若 Nginx 預設都沒多做設定,那 access.log 都會只記錄到 AWS ELB IP ,也就是不能把 access.log 紀錄的 IP 拿來 ban ,會變成 ban 掉 ELB。
而 AWS 提供的 Security group 預設是從 Allow 的角度,若要特意 ban 掉某個 IP 會有點難搞,例如要改寫防火牆規則,因此,最後就改成從實體 server 去阻擋遠端 client request 了。
步驟一:先讓 Nginx 可以記錄到真實的 remote ip
/etc/nginx/nginx.conf
http {
# ...
real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# ...
}
如此一來,access.log 的 remote_addr 就可以不是 AWS ELB IP 了。
步驟二:用 Nginx 去 deny ip
/etc/nginx/conf.d/your-service.conf
server {
# ...
deny RemoteIP;
# ...
}
這樣設定後,在用 sudo nginx -t 檢查語法後,就可以啟用了
在此不用 iptables 去阻擋的主因是封包進來的 IP 都是 AWS ELB ,所以才改從 Nginx/App 這層取阻擋。缺點就是 access.log 還是一直肥,好處是可以觀察 access.log 看看對方是不是放棄攻擊了?XD
未來若碰到 DDOS 就...
沒有留言:
張貼留言