내용으로 건너뛰기

Elastic Load Balancing을 기반으로 하는 웹 서버 로그에서 클라이언트 IP 주소를 캡처하려면 어떻게 해야 합니까?

5분 분량
0

웹 서버에 Elastic Load Balancing(ELB)을 사용 중이며, 웹 서버 액세스 로그에 로드 밸런서의 IP 주소가 표시됩니다. 대신 클라이언트 IP 주소를 캡처하려고 합니다.

간략한 설명

웹 서버 액세스 로그가 로드 밸런서의 IP 주소를 캡처하는 이유는 로드 밸런서가 인스턴스로의 연결을 설정하기 때문입니다. 웹 서버 액세스 로그에 클라이언트의 IP 주소를 캡처하려면, 다음을 구성하십시오.

  • HTTP/HTTPS 리스너가 있는 Application Load Balancer 및 Classic Load Balancer의 경우, 클라이언트 IP 주소를 캡처하려면 X-Forwarded-For HTTP 헤더를 추가합니다. 그러면 웹 서버 액세스 로그가 이러한 IP 주소를 기록하도록 구성할 수 있습니다.

    참고: 상황에 따라 X-FORWARDED-FOR 헤더가 없거나 비어 있을 수 있습니다. Application Load Balancer, Classic Load Balancer 및 Network Load Balancer가 시작한 상태 확인 요청은 X-FORWARDED-FOR 헤더를 포함하지 않습니다. 또한 TCP/SSL 리스너가 있는 Network Load Balancer 및 Classic Load Balancer는 수신되는 요청에 X-FORWARDED-FOR 헤더를 추가하지 않습니다. Application Load Balancer의 경우, 처리 모드 추가를 선택하여 일관적으로 X-FORWARDED-FOR 헤더를 추가합니다.

  • TCP/SSL 리스너가 있는 Classic Load Balancer의 경우, Classic Load Balancer 및 대상 애플리케이션에서 프록시 프로토콜 지원을 구성합니다.

  • Network Load Balancer의 경우, 인스턴스 ID 기준으로 대상을 등록해 추가적인 웹 서버 구성 없이 클라이언트 IP 주소를 캡처합니다. 관련 지침은 대상 그룹 속성을 참조하십시오.

  • Network Load Balancer의 경우 IP 주소만 대상으로 등록할 수 있는데, 이때는 로드 밸런서에서 프록시 프로토콜 버전 2를 활성화합니다. 관련 지침은 프록시 프로토콜을 참조하십시오.

해결 방법

HTTP/HTTPS 리스너가 있는 Application Load Balancer 및 Classic Load Balancer(Apache)

X-Forwarded-For HTTP 헤더를 추가하고 웹 서버 액세스 로그를 구성하려면 다음 단계를 완료합니다.

  1. 텍스트 편집기를 사용하여 Apache 구성 파일을 엽니다. 위치는 구성에 따라 다릅니다. 예를 들어 Amazon Linux 및 RHEL은 /etc/httpd/conf/httpd.conf, Ubuntu는 /etc/apache2/apache2.conf입니다.

  2. 다음 예시에 표시된 것처럼 LogFormat 섹션에 %{X-Forwarded-For}i를 추가합니다.

    ...    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
        ...
  3. 변경 사항을 저장합니다.

  4. Apache 서비스를 다시 로드합니다. 시스템에 따라 다음 중 한 가지 명령을 실시합니다.

    Sysvinit, Debian 기반 시스템(예: Ubuntu) 및 SUSE(예: SLES11)

    # /etc/init.d/apache2 reload

    Sysvinit, RPM 기반 시스템(예: RHEL 6 및 Amazon Linux), SUSE 제외

    # /etc/init.d/httpd reload

    Systemd, Debian 기반 시스템(예: Ubuntu) 및 SUSE(예: SLES12)

    # systemctl reload apache2

    RPM 기반 시스템(예: RHEL 7 및 Amazon Linux 2), SUSE 제외

    # systemctl reload httpd
  5. Apache 웹 서버 액세스 로그를 엽니다. 위치는 구성에 따라 다릅니다.

  6. 이제 클라이언트 IP 주소가 기록되는지 X-Forwarded-For 헤더 아래에서 확인합니다.

HTTP/HTTPS 리스너가 있는 Application Load Balancer 및 Classic Load Balancer(NGINX)

X-Forwarded-For HTTP 헤더를 추가하고 웹 서버 액세스 로그를 구성하려면 다음 단계를 완료합니다.

  1. 텍스트 편집기를 사용하여 NGINX 구성 파일을 엽니다. 위치는 일반적으로 /etc/nginx/nginx.conf입니다.

  2. 다음 예시에 표시된 것처럼 LogFormat 섹션에 $http_x_forwarded_for를 추가합니다.

    http {    ...
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  /var/log/nginx/access.log  main;
        ...
    }
  3. 변경 사항을 저장합니다.

  4. NGINX 서비스를 다시 로드합니다. Amazon Linux 2 또는 RHEL의 경우 다음 명령을 실행합니다.

    systemctl reload nginx

    참고: NGINX 서비스를 다시 로드하는 명령은 다른 시스템에서는 다릅니다. NGINX를 다시 로드하는 명령은 이전 섹션에서 다룬, Apache 서비스를 다시 로드하는 명령과 유사합니다.

  5. NGINX 웹 서버 액세스 로그를 엽니다. 위치는 구성에 따라 다릅니다.

  6. 이제 클라이언트 IP 주소가 기록되는지 X-Forwarded-For 헤더 아래에서 확인합니다.

TCP/SSL 리스너가 있는 Classic Load Balancer(Apache)

프록시 프로토콜 지원을 구성하려면 다음 단계를 완료하십시오.

  1. 텍스트 편집기를 사용하여 Apache 구성 파일을 엽니다. 위치는 구성에 따라 다릅니다. 예를 들어 Amazon Linux 및 RHEL은 /etc/httpd/conf/httpd.conf, Ubuntu는 /etc/apache2/apache2.conf입니다.

  2. Apache 구성이 모듈 mod_remoteip를 로드해야 합니다(Apache 버전 2.4.31 이후에서 사용할 수 있음). 자세한 내용은 Apache 웹 사이트의 Apache Module mod_remoteip를 참조하십시오. 이 모듈에 RemoteIPProxyProtocol 지시문이 포함되어 있습니다. 자세한 내용은 Apache 웹 사이트의 RemoteIPProxyProtocol Directive를 참조하십시오. 구성 파일에서 다음 중 하나와 유사한 라인이 있는지 확인합니다.

    Amazon Linux 또는 RHEL

    LoadModule remoteip_module modules/mod_remoteip.so

    Ubuntu

    LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
  3. mod_remoteip 모듈이 로드되는지 확인하려면 다음 명령을 실행합니다.

    $ sudo apachectl -t -D DUMP_MODULES | grep -i remoteip
  4. 출력을 검토하고, 출력에 다음과 유사한 라인이 포함되는지 확인합니다.

    remoteip_module (shared)

    중요: 출력이 이 라인이 없으면 구성에 모듈이 포함되지 않았거나 로드되지 않은 것입니다. 계속 진행하기 전에 모듈을 활성화해야 합니다.

  5. 프록시 프로토콜 지원을 활성화하려면 Apache 구성 파일에 다음 라인을 추가합니다.

    RemoteIPProxyProtocol On
  6. 구성 파일의 LogFormat 섹션을 편집하여 원격 IP 주소(%a) 및 원격 포트(%{remote}p:)를 캡처합니다.

    LogFormat "%h %p %a %{remote}p %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  7. 변경 사항을 저장합니다.

  8. Apache 서비스를 다시 로드합니다. 시스템에 따라 다음 중 한 가지 명령을 실시합니다.

    Sysvinit, Debian-based systems(예: Ubuntu) 및 SUSE(예: SLES11)

    # /etc/init.d/apache2 reload

    Sysvinit, RPM 기반 시스템(예: RHEL 6 및 Amazon Linux), SUSE 제외

    # /etc/init.d/httpd reload

    Systemd, Debian 기반 시스템(예: Ubuntu) 및 SUSE(예: SLES12)

    # systemctl reload apache2

    Systemd, RPM 기반 시스템(예: RHEL 7 및 Amazon Linux 2), SUSE 제외

    # systemctl reload httpd
  9. Apache 웹 서버 액세스 로그를 엽니다. 위치는 구성에 따라 다릅니다.

  10. 이제 클라이언트 IP 주소가 기록되는지 프록시 프로토콜 헤더 아래에서 확인합니다.

  11. 대상 애플리케이션에서 프록시 프로토콜 지원을 활성화합니다.

TCP/SSL 리스너가 있는 Classic Load Balancer(NGINX)

프록시 프로토콜 지원을 구성하려면 다음 단계를 완료하십시오.

  1. 텍스트 편집기를 사용하여 NGINX 구성 파일을 엽니다. 위치는 일반적으로 /etc/nginx/nginx.conf입니다.

  2. 서버 섹션의 listen 라인을 proxy_protocol로 업데이트합니다. http 섹션의 log_format 라인을 업데이트하여 proxy_protocol_addr을 설정합니다.

    http {    ...
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$proxy_protocol_addr"';
    
        access_log  /var/log/nginx/access.log  main;
        ...
    }
    server {
            ...
            listen  80  default_server proxy_protocol;
            ...
            }
    ...
    }
  3. 변경 사항을 저장합니다.

  4. NGINX 서비스를 다시 로드합니다. Amazon Linux 2 또는 RHEL의 경우 다음 명령을 실행합니다.

    systemctl reload nginx

    참고: NGINX 서비스를 다시 로드하는 명령은 다른 시스템에서는 다릅니다. NGINX를 다시 로드하는 명령은 이전 섹션에서 다룬, Apache 서비스를 다시 로드하는 명령과 유사합니다.

  5. NGINX 웹 서버 액세스 로그를 엽니다. 위치는 구성에 따라 다릅니다.

  6. 이제 클라이언트 IP 주소가 기록되는지 프록시 프로토콜 헤더 아래에서 확인합니다.

  7. 대상 애플리케이션에서 프록시 프로토콜 지원을 활성화합니다.

AWS 공식업데이트됨 일 년 전