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

최종 업데이트 날짜: 2021년 3월 17일

웹 서버에 Elastic Load Balancing(ELB)을 사용 중이며 웹 서버 액세스 로그에서 로드 밸런서의 IP 주소를 볼 수 있습니다. 이 IP 주소 대신 클라이언트 IP 주소를 캡처하려면 어떻게 해야 합니까?

간략한 설명

인스턴스에 대한 연결이 로드 밸런서에서 설정되므로 웹 서버 액세스 로그에는 로드 밸런서의 IP 주소가 캡처됩니다. 웹 서버 액세스 로그에 클라이언트의 IP 주소를 캡처하려면 다음을 구성합니다.

  • HTTP/HTTPS 리스너가 있는 Application Load Balancer 및 Classic Load Balancer의 경우 X-Forwarded-For HTTP 헤더에 클라이언트 IP 주소가 캡처됩니다. 이 IP 주소를 기록하도록 웹 서버 액세스 로그를 구성할 수 있습니다.
  • TCP/SSL 리스너가 있는 Classic Load Balancer의 경우 대상 애플리케이션과 Classic Load Balancer에서 프록시 프로토콜 지원을 활성화합니다. 로드 밸런서와 애플리케이션 모두에서 프록시 프로토콜 지원을 구성해야 합니다.
  • Network Load Balancer의 경우 인스턴스 ID별로 대상을 등록하여 웹 서버를 추가로 구성하지 않고 클라이언트 IP 주소를 등록합니다. 지침은 다음 해결 방법 대신 대상 그룹 속성을 참조하세요.
  • IP 주소만 대상으로 등록할 수 있는 Network Load Balancer의 경우 로드 밸런서에서 프록시 프로토콜 버전 2를 활성화합니다. 지침은 다음 해결 방법 대신 프록시 프로토콜 활성화를 참조하세요.

해결 방법

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

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

Sysvini 및 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

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

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

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

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 이상에서 사용 가능)를 로드해야 합니다. 이 모듈에는 RemoteIPProxyProtocol 명령이 포함되어 있습니다. 구성 파일에서 다음과 비슷한 행을 확인합니다.

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 기반 시스템(예: Ubuntu) 및 SUSE(예: SLES11)의 경우 다음 명령을 실행합니다.

# /etc/init.d/apache2 reload

Sysvini 및 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 주소가 이제 Proxy Protocol 헤더에 기록되는지 확인합니다.

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

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

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

2.    server 섹션의 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 주소가 이제 Proxy Protocol 헤더에 기록되는지 확인합니다.

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


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?