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

로드 밸런서가 인스턴스에 대한 연결을 설정하므로 액세스 로그가 로드 밸런서의 IP 주소를 캡처합니다. 액세스 로그에서 클라이언트의 IP 주소를 캡처하려면 추가적으로 구성해야 합니다.

  • HTTP/HTTPS 리스너가 있는 Application Load Balancer 및 Classic Load Balancer의 경우 X-Forwarded-For 헤더를 사용하여 클라이언트 IP 주소를 캡처해야 합니다. 그런 다음, 이러한 클라이언트 IP 주소를 액세스 로그에 인쇄해야 합니다.
  • TCP/SSL 리스너가 있는 Classic Load Balancer의 경우 대상 애플리케이션과 Classic Load Balancer에서 프록시 프로토콜 지원을 활성화해야 합니다. 두 측면에서 모두 프록시 프로토콜 지원을 구성해야 합니다. 그렇지 않으면 애플리케이션에 문제가 발생할 수 있습니다. 또한 AWS CLI를 사용하여 프록시 프로토콜 지원을 활성화할 수 있습니다.
  • Network Load Balancer의 경우 인스턴스 ID별로 대상을 등록하여 웹 서버를 추가로 구성하지 않고 클라이언트 IP 주소를 등록할 수 있습니다. 지침은 다음 해결 방법 대신 대상 그룹 속성을 참조하십시오.

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

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

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 구성 파일을 다시 로드합니다. 구성에 대해 적절한 파일 경로를 사용해야 합니다.

# sudo /etc/init.d/nginx reload

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

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.    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 구성 파일을 다시 로드합니다.

Sysvinit 시스템의 경우(예: Amazon Linux, RHEL 6, SLES11 및 Ubuntu 14.04):

# /etc/init.d/nginx reload

Systemd 시스템의 경우(예: RHEL 7, Amazon Linux 2, SLES12 및 Ubuntu 16.04): 

# systemctl reload nginx

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

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

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


페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2018년 12월 7일