Sngle(Master)
CentOS 7.x firewalld DDOS 차단하기이전 iptables 에서 80 포트 디도스를 막는 방법이다.
# iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 24 -j DROP
초당 24번 이상 접속은 drop 하라는 의미이다.firewall-cmd 에서도 iptables 를 확장하여 사용할 수가 있다.
[root@conoha ~]# firewall-cmd --permanent --direct --add-passthrough ipv4 -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 24 -j DROP
success
[root@conoha ~]# firewall-cmd --reload
success
[root@conoha ~]# iptables -L | grep DROP
DROP tcp -- anywhere anywhere tcp dpt:http
flags:FIN,SYN,RST,ACK/SYN #conn src/32 > 24
방화벽 룰이 추가된 것을 확인할 수 있다.이번엔 룰을 지워보자.
[root@conoha ~]# firewall-cmd --permanent --direct --remove-passthrough ipv4 -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 24 -j DROP
success
[root@conoha ~]# firewall-cmd --reload
success
[root@conoha ~]# iptables -L | grep DROP
[root@conoha ~]#
룰이 지워진 것을 확인하였다.
nginx.conf
http {
limit_req_zone $binary_remote_addr zone=hello:10m rate=1r/s;
...
..
✅ binary_remote_addr => 클라이언트의 IP를 기준으로 제한하겠다는 의미
✅ zone=hello:10m => hello라는 이름을 가진 10메가짜리 용량의 메모리 공간 확보 (zone 이름은 맘대로 지을 수 있음.)
✅ rate : 1 r/s => 1 request / second 의 의미로 1초에 1개의 request만을 허용한다는 뜻 (예시로 1초당 1개를 설정하였지만, 실재 운영시에는 원할한 서비스를 위해 10r/s 등으로 해주어야 합니다.)
server {
listen 80;
..
location / {
limit_req zone=hello burst=5 nodelay;
✅ zone=hello => nginx.conf 에서 지정한 zone 이름과 동일하게 입력함.
✅ burst=5 => 5개의 요청까지는 임시 큐에 저장을 해둔 후 순차적으로 통과를 시킨다는 뜻입니다. 앞nginx.conf에서 rate=1r/s 라고 하였기에, 만약 1초에 10개의 request가 들어온다면, 하나는 바로 통과시키고, 2~6번째 요청은 큐에 저장 후 순차적으로 통과시킵니다. 7~10번째 요청은 바로 무시되어 503 오류가 뜨게 됩니다.
✅ nodelay => 이 명령을 넣지 않으면 바로 위 burst 설명처럼 1초마다 순차적으로 통과시켜 6번째 요청은 5초 후에 실행이 되기에 서비스가 너무 느린 것처럼 느끼게 됩니다. 따라서, nodelay 설정을 추천하며, 큐에 들어있는 요청에 대해 시간 간격을 두지 않고 지연없이 바로 처리해 버립니다.
오류 페이지 변경 (503 -> 429 로 변경)
limit_req_status 429; ## max requests
}
}
# vi /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
<passthrough ipv="ipv4">-I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 24 -j DROP</passthrough>
<passthrough ipv="ipv4">-I INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 24 -j DROP</passthrough>
</direct>