개발노트

고즐의 개발 및 서버 개발 노트

Cloudflare 미사용 환경에서 DDoS와 무차별 대입 방어 구성 기록

# 서버보안 # Apache # Fail2ban # DDoS방어 # 리눅스서버

Security 2025.12.16 7일 전 48 회 읽음



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은 전체 사이트 보호 도구가 아니라 문제를 일으킨 IP를 퇴장시키는 역할이다.


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
문의답변