본문 바로가기

IT/WEB, WAS

제우스 WAS에서 역방향 DNS 조회로 크롤러 필터링 적용하는 방법

반응형

제우스 WAS는 TmaxSoft의 Java EE 기반 애플리케이션 서버로, 필터(Filter) 또는 인터셉터(Interceptor)를 활용하여 Googlebot 등 공식 검색 엔진 크롤러를 판별하고 비공식 크롤러를 차단할 수 있습니다.


역방향 DNS 조회 적용 순서
  1. 클라이언트 요청을 인터셉트 (Servlet Filter 활용)
  2. 클라이언트 IP 확인
  3. 역방향 DNS 조회 수행 (IP → 도메인)
  4. 도메인이 공식 크롤러 도메인(googlebot.com, bing.com 등)인지 검증
  5. 정방향 DNS 조회 수행 (도메인 → IP)
  6. IP 주소가 원래 요청한 IP와 일치하는지 확인
  7. 검증 실패 시 요청 차단 (403 Forbidden 반환)

JEUS WAS에 적용하는 방법
  • 제우스 WAS는 Java EE 기반이므로 Servlet Filter를 구현하여 전역 필터로 적용하는 것이 가장 효과적입니다.

(1) Java Servlet Filter 구현
  • 다음 필터(Filter)는 web.xml 또는 @WebFilter를 이용하여 등록할 수 있습니다.
  • 필터 클래스 (ReverseDNSFilter.java)

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ReverseDNSFilter implements Filter {

    // 공식 크롤러 도메인 목록
    private static final String[] VALID_BOT_DOMAINS = {"googlebot.com", "bing.com"};

    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String clientIp = httpRequest.getRemoteAddr();

        if (isValidBot(clientIp)) {
            chain.doFilter(request, response); // 정상적인 크롤러라면 요청 계속 진행
        } else {
            ((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
        }
    }

    @Override
    public void destroy() {}

    private boolean isValidBot(String ip) {
        try {
            // 1. 역방향 DNS 조회 (IP → 도메인 확인)
            InetAddress addr = InetAddress.getByName(ip);
            String hostName = addr.getCanonicalHostName();
            System.out.println("Reverse Lookup: " + ip + " → " + hostName);

            // 2. 도메인이 공식 크롤러 도메인인지 확인
            for (String domain : VALID_BOT_DOMAINS) {
                if (hostName.endsWith(domain)) {
                    // 3. 정방향 DNS 조회 (도메인 → IP 확인)
                    InetAddress verifiedAddr = InetAddress.getByName(hostName);
                    System.out.println("Forward Lookup: " + hostName + " → " + verifiedAddr.getHostAddress());
                    
                    // 4. 원래 IP와 비교하여 검증
                    return verifiedAddr.getHostAddress().equals(ip);
                }
            }
        } catch (UnknownHostException e) {
            System.out.println("DNS Lookup Failed: " + e.getMessage());
        }
        return false;
    }
}


(2) JEUS WAS에 필터 등록
   • 제우스 WAS는 web.xml을 사용하여 필터를 등록할 수 있습니다.
   • 방법 1: web.xml 설정 (JEUS 기본 방식)

Jeus WAS의 web.xml 파일(WEB-INF/web.xml)에 아래 내용을 추가합니다.

<filter>
    <filter-name>ReverseDNSFilter</filter-name>
    <filter-class>com.example.ReverseDNSFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ReverseDNSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

• url-pattern을 /*로 설정하면 모든 요청에 대해 크롤러 검사를 수행합니다.
• com.example.ReverseDNSFilter는 패키지 경로에 맞게 변경해야 합니다.


   • 방법 2: @WebFilter 어노테이션 사용 (Java EE 6 이상)
   • JEUS WAS 8 이상에서는 @WebFilter 어노테이션을 지원하므로, web.xml을 수정하지 않고 직접 Java 코드에서 필터를 설정할 수도 있습니다.

import javax.servlet.annotation.WebFilter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

@WebFilter("/*")
public class ReverseDNSFilter implements Filter {
    // 동일한 코드 사용
}

• @WebFilter("/*") → 모든 요청을 필터링

3. JEUS WAS에서 테스트 및 적용
1) DNS 조회 테스트
   • 위의 Java 코드가 정상적으로 동작하는지 확인하기 위해 로컬 또는 JEUS WAS 서버에서 다음 테스트를 수행합니다

public class ReverseDNSTest {
    public static void main(String[] args) {
        String testIp = "66.249.66.1"; // Googlebot 테스트 IP
        try {
            InetAddress addr = InetAddress.getByName(testIp);
            System.out.println("Reverse Lookup: " + testIp + " → " + addr.getCanonicalHostName());

            InetAddress verifiedAddr = InetAddress.getByName(addr.getCanonicalHostName());
            System.out.println("Forward Lookup: " + addr.getCanonicalHostName() + " → " + verifiedAddr.getHostAddress());

            if (verifiedAddr.getHostAddress().equals(testIp)) {
                System.out.println("✅ 유효한 크롤러입니다.");
            } else {
                System.out.println("❌ 가짜 크롤러입니다.");
            }
        } catch (UnknownHostException e) {
            System.out.println("DNS 조회 실패: " + e.getMessage());
        }
    }
}

• Googlebot, Bingbot의 실제 IP를 입력하여 테스트 수행
• googlebot.com 또는 bing.com 도메인이 출력되면 정상
• 다른 도메인이거나 DNS 조회가 실패하면 가짜 크롤러(스푸핑된 봇) 일 가능성 있음


4. 크롤러 차단 정책 설정
   • 위의 필터를 적용한 후, 추가적인 차단 정책을 적용할 수 있습니다.
   • IP 차단 목록 적용 (비정상적인 크롤러 차단)

JEUS jeus.conf에서 특정 IP 차단

$JEUS_HOME/configs/jeus.conf 파일을 수정하여 특정 IP 차단 가능

deny_ip = 192.168.1.100  # 특정 IP 차단
deny_ip_range = 203.0.113.0/24  # 특정 IP 대역 차단
반응형