서버를 운영하다 보면 meta-externalagent(페이스북), Amzn-SearchBot(아마존) 같은 봇들이 검색창에 수만 번의 쿼리를 날려 트래픽을 고갈시키는 경우가 있습니다. 오늘 실전 경험을 바탕으로, 트래픽 도둑은 막고 검색 엔진 노출은 유지하는 보안 설정을 정리합니다.
📋 핵심 요약
- 로그 분석: 어떤 IP가 어느 사이트를 공격하는지 파악
- Nginx 차단: 봇의 ‘검색 요청’만 정교하게 필터링
- 방화벽(UFW): 악성 IP 대역을 서버 입구에서 즉시 차단
- 순서 보정: 차단 규칙을 최상단으로 올려 우선순위 확보
1. 실시간 로그 모니터링 및 범인 색출
가장 먼저 “누가” 공격하는지 알아야 합니다. 아래 명령어들을 터미널에 입력하여 분석하세요.
tail -f /var/log/nginx/access.log | grep “도메인명”# [IP 순위] 현재 가장 접속량이 많은 IP TOP 10 (도메인 로그 설정 시)
awk ‘{print $2}’ /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
# [공격 대상] 10개 사이트 중 가장 공격을 많이 받는 사이트 순위
awk ‘{print $1}’ /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
2. Nginx: 봇의 ‘검색 기능’만 정교하게 차단
일반 사용자의 검색은 허용하고, 봇이 search= 파라미터로 트래픽을 유발할 때만 403 에러로 튕겨냅니다.
if ($http_user_agent ~* (meta-externalagent|SERankingBacklinksBot|Amzn-SearchBot|AhrefsBot|ChatGPT-User|Bytespider)) {
set $is_bad_bot “Y”;
}
# 2. 검색(?search=) 파라미터 확인
if ($args ~* “search=”) {
set $is_search “S”;
}
# 3. 봇이면서 검색 시도 시 403 차단
if (“$is_bad_bot$is_search” = “YS”) {
access_log off; # 차단 로그 중단 시 활성화
return 403;
}
3. 방화벽(UFW) IP 대역 ‘입구 컷’
Nginx까지 신호가 오지 않도록 서버 입구에서 물리적으로 막습니다. 가장 효율적인 방법입니다.
sudo ufw insert 1 deny from 57.141.14.0/24# 악성 단일 IP 차단
sudo ufw insert 1 deny from 37.27.55.110
# 설정 적용 및 확인
sudo ufw reload
sudo ufw status numbered
UFW는 위에서부터 규칙을 읽습니다.
ALLOW Anywhere(80, 443포트)보다 DENY(차단) 규칙이 반드시 번호가 빨라야(상단) 합니다. insert 1 명령어를 사용하는 이유입니다.4. 주의: 차단 금지 ‘착한 봇’ 리스트
검색 노출을 위해 네이버, 구글, 다음 봇은 상태코드 200(정상)을 유지해야 합니다.
| 봇 이름 | 포털 | 역할 |
|---|---|---|
| Yeti | Naver | 네이버 웹사이트 수집 |
| Daumoa | Daum/Kakao | 다음/카카오톡 미리보기 |
| Googlebot | 글로벌 검색 노출 |
✅ 최종 점검 방법
설정 후 tail -f 로그를 확인했을 때, 악성 봇의 요청 끝이 403 162(거절 및 저용량)로 바뀌어 있거나 아예 로그가 사라졌다면 완벽하게 방어에 성공한 것입니다!