클라우드웨이즈 IP 모니터링으로 의심 IP 식별하여 차단하는 방법

사이트를 운영하다 보면 방문자가 늘어나는 만큼 악성 봇이나 악의적인 공격 IP의 유입도 덩달아 늘어날 수 있습니다. 워드프레스에서는 워드펜스(Wordfence) 같은 보안 플러그인을 설치하면 악의적인 공격을 어느 정도 차단할 수 있지만, 보안 플러그인만으로 걸러지지 않는 IP도 있습니다. 그런 경우에는 서버 레벨에서 IP를 모니터링하여 차단하거나, 클라우드플레어(Cloudflare)와 같은 서비스를 활용해 방어하는 방법도 고려해볼 수 있습니다.

클라우드웨이즈의 경우, 애플리케이션의 모니터링(Monitoring) 화면에서 트래픽이 많은 IP 요청과 봇을 확인할 수 있습니다. 지난 1시간 또는 지난 하루 동안 접속이 잦았던 IP 목록을 살펴보고, 그중 악성 IP로 의심되는 것이 있는지 체크한 뒤 .htaccess 파일이나 클라우드플레어(Cloudflare), 워드펜스 보안 플러그인 등을 통해 차단하는 방식으로 대응할 수 있습니다.

💡 클라우드웨이즈 가입 방법 (+ 60% 할인 쿠폰)

클라우드웨이즈 IP 모니터링으로 의심 IP 식별하여 차단하는 방법

클라우드웨이즈 IP 모니터링으로 의심 IP 식별하여 차단하는 방법

이 블로그에서는 그동안 악성 IP를 식별하여 차단하는 몇 가지 방법을 소개해드린 적이 있습니다. 이 글에서는 클라우드웨이즈 사용자들이 적용할 수 있는 방법을 소개해드리려고 합니다.

이는 제가 실제로 사용하고 있는 방법이기도 한데요. 이 블로그를 대상으로도 다양한 악성 IP의 공격이나 디도스성 트래픽이 수시로 발생하고 있는데, 특히 블로그의 글이나 이미지를 무단으로 긁어가는 스크래핑 시도가 자주 목격되고 있습니다.

워드프레스 Wordfence의 속도 제한(Rate Limiting) 설정

상업용 SEO 봇이나 악성 봇 때문에 가끔 서버 CPU 사용량이 급증하는 현상이 발생하곤 했습니다. .htaccess 파일에 코드를 넣어 SEO 봇들을 차단하도록 하고 클라우드플레어에서 봇만 필터링하도록 설정하는 등 여러 가지 방법을 동원했지만 만족스럽게 해결되지는 않았습니다.

그러다가 Wordfence의 속도 제한(Rate Limiting) 설정을 하니 짧은 시간에 반복적으로 유입을 시도하는 악성 봇들이 어느 정도 필터링되면서 서버가 안정화되었습니다.

저는 다음 그림과 같이 설정했습니다. 제미나이나 챗GPT에게 어떤 식으로 설정하면 좋을지를 물어보고 마음에 드는 설정을 하시면 될 것 같습니다.

워드프레스 속도 제한 설정

워드펜스가 사이트 속도를 느리게 할 우려가 있기는 하지만, 이 블로그에서는 속도에 그리 영향을 미치지 않는 것 같습니다.

악의적인 IP 식별하기

애플리케이션의 Monitoring » Analytics » Traffic 메뉴의 IP Requests에서 최근 요청이 잦은 IP들을 확인할 수 있습니다.

클라우드웨이즈 악성 IP 식별하기

기간을 15분, 30분, 1시간, 1일로 설정할 수 있습니다. 위의 그림은 지난 1일 동안 접속이 잦은 상위 10개 IP 주소 목록을 보여줍니다.

과도하게 많이 접속하는 IP 중에서 내 IP와 서버 IP, 그리고 구글봇 등 검색엔진 IP를 제외하고는 비정상적인 접근으로 의심되는 것들은 차단하는 것을 고려할 수 있습니다.

위의 그림에서 112.175.184.95라는 IP가 며칠 전부터 /feed에 평균 29초에 1번꼴로 접속을 시도하고 있습니다. 이 봇이 구글봇인지 확인하려면 윈도우 명령 프롬프트에서 nslookup IP 주소 형식으로 명령을 실행해볼 수 있습니다.

다음과 같은 경우에는 구글봇입니다. (챗GPT에게 특정 IP 주소가 구글봇인지 확인하는 방법에 대해 물어보면 자세한 안내를 받을 수 있을 것입니다.😄)

IP가 구글봇인지 확인하기

하지만 문제의 IP 주소에 대하여 nslookup으로 조회하면 아래와 같이 닷홈 서버 IP로 나타납니다. 아마도 닷홈 공유 호스팅에서 호스팅되는 사이트에서 자동화 스크립트를 돌려서 제 블로그에 새 글이 올라오면 빠르게 긁어가려고 시도하는 것이 아닌가 생각됩니다.

도메인 서버 정보

이 IP가 비정상 IP로 판단되는 이유:

  1. 비정상적인 단일 URL 집중 요청:
    하루 동안 /feed 한 경로에만 2,946회 요청 — 다른 페이지는 전혀 방문하지 않고 오직 RSS 피드만 반복 호출
  2. 비정상적인 요청 빈도:
    24시간(86,400초) 기준 계산 시 평균 약 29초에 한 번꼴로 쉬지 않고 요청. 정상적인 RSS 리더는 보통 15분~1시간 간격으로 갱신하므로, 이런 짧고 기계적인 간격은 사람의 구독 행위로 보기 어려움
  3. 신원 불명 서버발 트래픽:
    Whois상 KT 회선 대역으로 잡히지만, 실제 rDNS 확인 시 dot-k1-095.dothome.co.kr(닷홈 공유 호스팅 서버)로 나옴. 즉 개인 사용자가 아니라 제3의 임대 서버에서 돌아가는 자동화 스크립트
  4. 서버 부하 유발:
    /feed는 요청마다 DB 쿼리로 최신 글 목록을 동적 생성하는 경우가 많아, 이런 반복 요청이 정적 페이지보다 리소스 소모가 큼

그리고 아래와 같은 IP도 악성 IP에 해당합니다.

악성 IP 트래픽

이 IP는 앞서 다룬 112.175.184.95(과다 폴링)와는 성격이 완전히 다릅니다. 명백한 취약점 스캐닝(정찰) 행위가 확인된 케이스입니다.

1. 요청 경로 자체가 공격 정찰용

같은 시간대에 요청한 경로들을 보면 패턴이 뚜렷합니다.

요청 경로노리는 것
/Dockerfile, /docker-compose.prod.yml, /var/task/docker-compose.yml컨테이너 설정 노출 여부 — DB 비밀번호, 내부 구조 유출 확인
/mysql.sql.gzDB 덤프 파일이 실수로 웹에 노출됐는지
/localhost.keySSL/SSH 개인키 노출 여부
/:27017MongoDB 기본 포트가 인증 없이 열려 있는지
/robomongo.jsonMongoDB 관리 툴 설정 파일(DB 접속 정보 포함 가능)
/telescope/requestsLaravel 프레임워크의 디버그 대시보드가 프로덕션에 실수로 열려 있는지
/bower.json, /phpstan.neon서버가 어떤 프레임워크/스택을 쓰는지 지문 채취(fingerprinting)

2. 정상 방문자·크롤러라면 있을 수 없는 행동

사람이나 정상 검색엔진 봇은 이런 파일들을 요청할 이유가 전혀 없습니다. 실제로 이런 파일이 사이트에 존재하는지 확인하려는 게 아니라, 인터넷의 모든 IP/도메인에 대해 같은 경로 목록을 자동으로 순회하며 "혹시 열려 있나?" 무차별로 확인하는 대량 스캐닝 봇의 전형적인 특징입니다.

3. 신원을 숨긴 클라우드 인프라 사용

이 IP도 GCP(Google Cloud) 대역 소속입니다. 즉 공격자가 자기 서버가 아니라 임대한 클라우드 VM을 통해 스캐닝을 수행하고 있어, 추적을 어렵게 만들고 있습니다.

내 IP 주소와 서버 IP 주소를 제외한 IP들 중에 의심스러운 패턴을 보이는 IP들을 챗GPT 등 AI에 넣어서 패턴과 nslookup 조회 결과를 함께 제공하여 악성 IP로 의심되는지 여부를 확인해 볼 수 있습니다.

간혹 구글봇을 악성 IP로 오해하는 경우가 있으므로 주의가 필요할 수 있습니다. 역방향 DNS 조회와 정방향 DNS로 재확인하여 구글봇인지 여부를 판단할 수 있습니다. 예시:

# 1단계 — 역방향 DNS 조회
nslookup 34.64.82.78

# 정상 결과 예시:
서버:    kns.kornet.net
Address:  168.126.63.1

이름:    geo-crawl-34-64-82-78.geo.googlebot.com
Address:  34.64.82.78

# 2단계 — 정방향 DNS로 재확인
nslookup geo-crawl-34-64-82-78.geo.googlebot.com

# 결과 IP가 1단계에서 조회했던 원래 IP와 일치하면 검증 완료

악성 IP 차단하기

악성 IP들을 식별했다면 IP를 차단하도록 합니다. 여러 가지 방법으로 차단이 가능합니다. 클라우드플레어를 이용하거나 .htaccess 파일에 코드를 넣거나, 워드프레스 플러그인의 방화벽을 통해 IP를 차단할 수 있습니다.

구분클라우드플레어.htaccessWordfence
차단 위치서버 도달 전(엣지)서버 도달 즉시(Apache)워드프레스 내부(PHP)
캐시 우회 문제없음있음있음
설정 위치Cloudflare 대시보드.htaccess 파일워드프레스 관리자
장점가장 확실하고 리소스 부담 없음별도 서비스 없이 즉시 적용차단 로그를 쉽게 확인 가능
단점Cloudflare 연동 필요Nginx 스택에서는 사용 불가상대적으로 리소스 부담 큼

클라우드플레어 서비스를 이용한다면 서버 도달하지 전에 차단하므로 사이트에 대한 영향이 없습니다. Wordfence 플러그인에서 차단 목록에 IP를 등록하여 차단하는 경우 서버를 거쳐 워드프레스 내부까지 도달하여 차단되는 것이므로 다른 방법에 대해 상대적으로 리소스 부담이 큰 편이지만, 차단 로그를 쉽게 확인할 수 있다는 장점이 있습니다.

워드펜스를 이용하여 차단하기를 원한다면 Wordfence » 방화벽 » 차단에서 IP 주소를 등록해서 차단할 수 있습니다.

워드펜스 IP 차단

112.175.184.95 IP는 며칠이 지나도 지속적으로 짧은 시간 간격으로 접속을 시도하고 있는 것으로 나타나서 .htaccess 파일에 코드를 넣어서 차단시켰습니다. .htaccess 파일에 코드를 추가하여 차단하면 워드펜스에서는 해당 IP를 더 이상 감지하지 못하게 됩니다. (그러므로 .htaccess 파일을 통해 IP를 차단하고 있다면 해당 IP를 Wordfence를 통해 차단할 필요가 없습니다.)

.htaccess 파일에 코드를 넣어 차단하고 싶은 경우 다음과 같은 형식으로 IP를 추가할 수 있습니다.

<RequireAll>
	Require all granted
	Require not ip 112.175.184.95
	Require not ip 180.178.57.0/24
</RequireAll>

👉 WebStack이 Lightning Stack인 경우에는 .htaccess가 작동하지 않습니다. 이 방법으로 IP를 차단하려면 웹스택이 Hybrid Stack이어야 합니다.

마치며

우연의 일치이겠지만 클라우드웨이즈가 PHP 버전을 애플리케이션 레벨에서 설정할 수 있도록 하는 등 UI를 변경한 직후에 서버 과부하가 일시적으로 나타나서 체크해보니 몇 개 IP들이 짧은 시간에 지속적으로 접속을 시도하고 있어서 차단시켰습니다.

그리고 다음과 같은 코드를 .htaccesss 파일에 넣으면 ShapBot, WebSearchCrawler, img2dataset, ImageBot, SCspider, Textbot, s2bot, MJ12bot, YandexBot, SemrushBot, AspiegelBot, BLEXBot, webmeup-crawler, oBot, SiteExplorer, BaiDuSpider, Barkrowler, proximic, PetalBot, Trendiction, DataForSeoBot, Bolt, FlipboardProxy, SeznamBot 등의 봇들이 차단됩니다.

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTP_USER_AGENT} (ShapBot|WebSearchCrawler|img2dataset|ImageBot|SCspider|Textbot|s2bot|MJ12bot|YandexBot|SemrushBot|AspiegelBot|BLEXBot|webmeup-crawler|oBot|SiteExplorer|BaiDuSpider|Barkrowler|proximic|PetalBot|Trendiction|DataForSeoBot|Bolt|FlipboardProxy|SeznamBot) [NC]
	RewriteRule ^ - [F,L]
</IfModule>

저는 위와 같은 코드를 .htaccess 파일에 추가해서 다양한 상업용 SEO 봇들과 바이두 스파이더 등의 봇들을 차단하고 있습니다.

IP를 차단할 때에는 다음 IP들은 차단하지 않도록 주의합니다.

  • 내 IP (네이버에서 '내 IP'로 검색하면 확인할 수 있음)
  • 서버 IP
  • 구글, 네이버 등 검색엔진 봇

참고

댓글 남기기

댓글 남기기