본문 바로가기

IT/WEB, WAS

역방향 DNS 조회(Reverse DNS Lookup)로 웹 크롤링 확인하는 방법

반응형

웹 크롤러(예: Googlebot, Bingbot 등)는 HTTP 요청 시 User-Agent 헤더를 포함하지만, 이는 쉽게 조작할 수 있습니다. 따라서 보다 신뢰할 수 있는 방법은 역방향 DNS 조회(Reverse DNS Lookup) 를 이용하여 요청한 IP 주소가 실제로 해당 크롤러의 공식 도메인에서 온 것인지 확인하는 것입니다.

1. 역방향 DNS 조회 개념
  • 웹 크롤러가 사이트를 방문하면 요청의 IP 주소가 서버 로그에 기록됩니다.
  • 해당 IP 주소의 도메인을 확인하기 위해 역방향 DNS 조회(reverse DNS lookup, rDNS) 를 수행합니다.
  • 얻어진 도메인이 공식 크롤러 도메인(googlebot.com, bing.com 등)인지 확인합니다.
  • 다시 해당 도메인으로 정방향 DNS 조회(forward DNS lookup)를 수행하여 원래 IP와 일치하는지 확인합니다.
   → 이렇게 하면 IP 스푸핑을 방지할 수 있습니다.

2. 역방향 DNS 조회 과정

(1) 클라이언트 IP 확인
  • 웹 서버에서 크롤러의 IP 주소를 로그에서 확인합니다.

66.249.66.1 - - [19/Feb/2025:12:34:56 +0000] "GET /index.html HTTP/1.1" 200 -

위의 66.249.66.1이 크롤러의 IP 주소입니다.

(2) 역방향 DNS 조회 (Reverse DNS Lookup)
  • IP 주소에 대한 호스트명을 확인합니다.

nslookup 66.249.66.1

출력 예시:

Name: crawl-66-249-66-1.googlebot.com
Address: 66.249.66.1

googlebot.com 도메인을 포함하고 있으므로 Googlebot일 가능성이 높습니다.

 

(3) 정방향 DNS 조회 (Forward DNS Lookup)
  • 역방향 DNS 조회만으로는 신뢰할 수 없으므로, 얻어진 도메인(crawl-66-249-66-1.googlebot.com)을 다시 정방향 DNS 조회하여 원래의 IP와 일치하는지 확인합니다.

nslookup crawl-66-249-66-1.googlebot.com

출력 예시:

Name: crawl-66-249-66-1.googlebot.com
Address: 66.249.66.1

• 여기서 다시 원래의 IP 주소(66.249.66.1)가 반환되면 진짜 Googlebot입니다.
• 만약 다른 IP가 반환되거나 조회가 실패하면 가짜 크롤러(스푸핑된 봇) 일 가능성이 높습니다.

 

3. Python으로 역방향 DNS 조회 자동화
  • 아래 Python 코드를 사용하면 요청한 크롤러의 IP가 실제 Googlebot 또는 Bingbot인지 확인할 수 있습니다.

import socket

def is_valid_bot(ip, valid_domains):
    try:
        # 1. 역방향 DNS 조회 (Reverse Lookup)
        host = socket.gethostbyaddr(ip)[0]  # IP 주소 → 도메인 확인
        print(f"Reverse Lookup: {ip} → {host}")

        # 2. 도메인이 공식 크롤러 도메인인지 확인
        if not any(host.endswith(domain) for domain in valid_domains):
            print("Invalid bot: Domain mismatch")
            return False

        # 3. 정방향 DNS 조회 (Forward Lookup)
        verified_ip = socket.gethostbyname(host)  # 도메인 → IP 주소 확인
        print(f"Forward Lookup: {host} → {verified_ip}")

        # 4. 원래 IP와 비교
        return verified_ip == ip
    except Exception as e:
        print(f"Error: {e}")
        return False

# 테스트할 크롤러 IP
test_ip = "66.249.66.1"  # Googlebot 예제 IP

# 공식 크롤러 도메인 목록
valid_bot_domains = ["googlebot.com", "bing.com"]

if is_valid_bot(test_ip, valid_bot_domains):
    print(f"{test_ip} is a valid bot!")
else:
    print(f"{test_ip} is NOT a valid bot!")

 

4. 주요 검색 엔진 크롤러의 공식 도메인
  • 아래 도메인을 역방향 DNS 조회 결과에서 확인하면 해당 크롤러가 진짜인지 판별할 수 있습니다.

검색 엔진 공식 크롤러 도메인
Googlebot googlebot.com
Bingbot bing.com
Yahoo Slurp crawl.yahoo.net
Baidu Spider baidu.com
YandexBot yandex.ru

5. 자동화하여 서버에서 크롤러 차단
  • 서버에서 nginx 또는 Apache 설정을 통해 정식 크롤러가 아닌 봇을 차단할 수 있습니다.

(1) Nginx에서 크롤러 차단

map $remote_addr $is_bot {
    default 0;
    "66.249.66.1" 1; # Googlebot IP 예제
}

server {
    location / {
        if ($is_bot = 0) {
            return 403;
        }
    }
}

• 66.249.66.1과 같이 확인된 IP만 허용하고, 나머지는 403 Forbidden 응답.


(2) Apache에서 크롤러 차단

.htaccess에서 특정 크롤러 차단:

RewriteEngine On
RewriteCond %{REMOTE_HOST} !googlebot\.com$ [NC]
RewriteCond %{REMOTE_HOST} !bing\.com$ [NC]
RewriteRule .* - [F]

• googlebot.com, bing.com이 아닌 크롤러의 요청을 차단.

관련 블로그

 

robots.txt 파일을 이용한 웹 크롤링 여부 판단

robots.txt 파일을 사용하여 웹 크롤러(특히 Googlebot 등 검색 엔진 크롤러)가 사이트를 크롤링하는지 확인하는 방법은 다음과 같습니다.1. robots.txt 파일의 위치 • 웹사이트의 robots.txt 파일은 항상

make2t.tistory.com

 

HTTP 헤더 정보를 통한 웹 크롤러 여부 판단

웹 서버는 HTTP 헤더 정보를 활용하여 클라이언트가 웹 크롤러인지 아닌지를 판단할 수 있습니다. 이를 위한 주요 방법들은 다음과 같습니다.1. User-Agent 확인   • 대부분의 웹 크롤러는 User-Agent

make2t.tistory.com

 

반응형