![]()
Cloudflare 해당 서비스로 세팅 했다가 웹사이트와 이미지 로딩 속도가 느려져서 다른 방법을 찾다가 서버에서 해결 할 수 있는 방법을 통해 해결 해보려고 합니다.
명령어는 글 아래 따로 모아서 작성 해 두었습니다.
Cloudflare 없이 서버 보안을 구성한 이유
Cloudflare는 편리한 서비스지만, 국내 사용자 중심의 서버 환경에서는 초기 연결 지연이나 외부 리소스 차단 문제를 겪을 수 있다. 또한 서버를 직접 운영하는 경우, 웹 서버와 커널 레벨에서 충분한 보안 구성이 가능하다.
전체 보안 구성 개요
이번 구성은 트래픽 폭주와 무차별 대입 공격을 구분해 각 계층에서 처리하도록 설계했다. 속도 저하 없이 안정성을 확보하는 것이 핵심이다.
- 커널 레벨에서 연결 폭주 방어
- 방화벽에서 비정상 대량 트래픽 보조 차단
- Apache에서 느린 공격 및 응답 감속 처리
- Fail2ban으로 로그인과 SSH만 선별 차단
1단계 커널 레벨 DDoS 기본 방어
sysctl 설정을 통해 SYN Flood와 연결 고갈 공격을 방어했다. 이 단계는 성능 저하가 거의 없고 한 번 설정하면 유지 관리가 필요 없다.
net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1
2단계 방화벽 보조 트래픽 제한
firewalld의 rate limit 기능을 사용해 서버 전체에 과도한 트래픽이 몰리는 상황만 제한했다. IP별 제어는 Apache에서 담당한다.
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="http" limit value="300/s" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="https" limit value="300/s" accept' firewall-cmd --reload
3단계 Apache 느린 공격 및 감속 방어
Apache 기본 모듈을 활용해 Slowloris 계열 공격과 대량 응답 요청을 제어했다. 추가 패키지 없이 안정적으로 동작한다.
RequestReadTimeout 설정
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
출력 속도 제한 설정
SetOutputFilter RATE_LIMIT SetEnv rate-limit 400
4단계 Fail2ban 로그인과 SSH만 보호
Fail2ban은 SSH와 웹 로그인 실패 상황만 감시하도록 구성했다. 멀티 도메인 환경이므로 모든 가상호스트 로그를 대상으로 설정했다.
logpath = /var/log/httpd/*access_log
/var/log/httpd/*ssl_access_log
이 방식으로 정상 사용자는 영향을 받지 않고, 무차별 대입 공격만 자동으로 차단된다.
마무리 정리
이번 구성으로 Cloudflare 없이도 속도 저하 없는 실전 서버 방어 환경을 완성했다. 각 계층의 역할을 분리한 것이 안정성의 핵심이다.
- 서버 응답 속도 유지
- 관리자와 로그인 공격 자동 차단
- 추가 비용 없는 보안 구성
이 구조는 기록해두고 다음 서버에서도 그대로 재 사용할 수 있는 기본 템플릿으로 충분하다.
빠른 재 설치용 명령어 요약
1. 커널 DDoS 기본 보호 설정
# nano /etc/sysctl.d/99-ddos.conf net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1 # sysctl --system
2. 방화벽 보조 트래픽 제한
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="http" limit value="300/s" accept' # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="https" limit value="300/s" accept' # firewall-cmd --reload
3. Apache 느린 공격 방어
# nano /etc/httpd/conf.d/reqtimeout.conf RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500 # systemctl restart httpd
4. Apache 응답 감속 설정
# nano /etc/httpd/conf.modules.d/00-base.conf LoadModule ratelimit_module modules/mod_ratelimit.so # nano /etc/httpd/conf.d/ratelimit.conf SetOutputFilter RATE_LIMIT SetEnv rate-limit 400 # systemctl restart httpd
5. Fail2ban 웹 로그인 보호
# nano /etc/fail2ban/filter.d/apache-login.conf failregex = ^.*"(POST|GET) /(admin/login.php|login.php).*" (401|403) # nano /etc/fail2ban/jail.local [apache-login] enabled = true port = http,https filter = apache-login logpath = /var/log/httpd/*access_log /var/log/httpd/*ssl_access_log maxretry = 5 findtime = 600 bantime = 3600 # systemctl restart fail2ban
상태 확인 명령어
# sysctl net.ipv4.tcp_syncookies # httpd -M | grep reqtimeout # httpd -M | grep ratelimit # fail2ban-client status # fail2ban-client status apache-login