Elastic Load Balancing을 기반으로 하는 웹 서버 로그에서 클라이언트 IP 주소를 캡처하려면 어떻게 해야 합니까?
웹 서버에 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 헤더를 추가하고 웹 서버 액세스 로그를 구성하려면 다음 단계를 완료합니다.
-
텍스트 편집기를 사용하여 Apache 구성 파일을 엽니다. 위치는 구성에 따라 다릅니다. 예를 들어 Amazon Linux 및 RHEL은 /etc/httpd/conf/httpd.conf, Ubuntu는 /etc/apache2/apache2.conf입니다.
-
다음 예시에 표시된 것처럼 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 ... -
변경 사항을 저장합니다.
-
Apache 서비스를 다시 로드합니다. 시스템에 따라 다음 중 한 가지 명령을 실시합니다.
Sysvinit, Debian 기반 시스템(예: Ubuntu) 및 SUSE(예: SLES11)
# /etc/init.d/apache2 reloadSysvinit, RPM 기반 시스템(예: RHEL 6 및 Amazon Linux), SUSE 제외
# /etc/init.d/httpd reloadSystemd, Debian 기반 시스템(예: Ubuntu) 및 SUSE(예: SLES12)
# systemctl reload apache2RPM 기반 시스템(예: RHEL 7 및 Amazon Linux 2), SUSE 제외
# systemctl reload httpd -
Apache 웹 서버 액세스 로그를 엽니다. 위치는 구성에 따라 다릅니다.
-
이제 클라이언트 IP 주소가 기록되는지 X-Forwarded-For 헤더 아래에서 확인합니다.
HTTP/HTTPS 리스너가 있는 Application Load Balancer 및 Classic Load Balancer(NGINX)
X-Forwarded-For HTTP 헤더를 추가하고 웹 서버 액세스 로그를 구성하려면 다음 단계를 완료합니다.
-
텍스트 편집기를 사용하여 NGINX 구성 파일을 엽니다. 위치는 일반적으로 /etc/nginx/nginx.conf입니다.
-
다음 예시에 표시된 것처럼 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; ... } -
변경 사항을 저장합니다.
-
NGINX 서비스를 다시 로드합니다. Amazon Linux 2 또는 RHEL의 경우 다음 명령을 실행합니다.
systemctl reload nginx참고: NGINX 서비스를 다시 로드하는 명령은 다른 시스템에서는 다릅니다. NGINX를 다시 로드하는 명령은 이전 섹션에서 다룬, Apache 서비스를 다시 로드하는 명령과 유사합니다.
-
NGINX 웹 서버 액세스 로그를 엽니다. 위치는 구성에 따라 다릅니다.
-
이제 클라이언트 IP 주소가 기록되는지 X-Forwarded-For 헤더 아래에서 확인합니다.
TCP/SSL 리스너가 있는 Classic Load Balancer(Apache)
프록시 프로토콜 지원을 구성하려면 다음 단계를 완료하십시오.
-
텍스트 편집기를 사용하여 Apache 구성 파일을 엽니다. 위치는 구성에 따라 다릅니다. 예를 들어 Amazon Linux 및 RHEL은 /etc/httpd/conf/httpd.conf, Ubuntu는 /etc/apache2/apache2.conf입니다.
-
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.soUbuntu
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so -
mod_remoteip 모듈이 로드되는지 확인하려면 다음 명령을 실행합니다.
$ sudo apachectl -t -D DUMP_MODULES | grep -i remoteip -
출력을 검토하고, 출력에 다음과 유사한 라인이 포함되는지 확인합니다.
remoteip_module (shared)중요: 출력이 이 라인이 없으면 구성에 모듈이 포함되지 않았거나 로드되지 않은 것입니다. 계속 진행하기 전에 모듈을 활성화해야 합니다.
-
프록시 프로토콜 지원을 활성화하려면 Apache 구성 파일에 다음 라인을 추가합니다.
RemoteIPProxyProtocol On -
구성 파일의 LogFormat 섹션을 편집하여 원격 IP 주소(%a) 및 원격 포트(%{remote}p:)를 캡처합니다.
LogFormat "%h %p %a %{remote}p %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined -
변경 사항을 저장합니다.
-
Apache 서비스를 다시 로드합니다. 시스템에 따라 다음 중 한 가지 명령을 실시합니다.
Sysvinit, Debian-based systems(예: Ubuntu) 및 SUSE(예: SLES11)
# /etc/init.d/apache2 reloadSysvinit, RPM 기반 시스템(예: RHEL 6 및 Amazon Linux), SUSE 제외
# /etc/init.d/httpd reloadSystemd, Debian 기반 시스템(예: Ubuntu) 및 SUSE(예: SLES12)
# systemctl reload apache2Systemd, RPM 기반 시스템(예: RHEL 7 및 Amazon Linux 2), SUSE 제외
# systemctl reload httpd -
Apache 웹 서버 액세스 로그를 엽니다. 위치는 구성에 따라 다릅니다.
-
이제 클라이언트 IP 주소가 기록되는지 프록시 프로토콜 헤더 아래에서 확인합니다.
-
대상 애플리케이션에서 프록시 프로토콜 지원을 활성화합니다.
TCP/SSL 리스너가 있는 Classic Load Balancer(NGINX)
프록시 프로토콜 지원을 구성하려면 다음 단계를 완료하십시오.
-
텍스트 편집기를 사용하여 NGINX 구성 파일을 엽니다. 위치는 일반적으로 /etc/nginx/nginx.conf입니다.
-
서버 섹션의 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; ... } ... } -
변경 사항을 저장합니다.
-
NGINX 서비스를 다시 로드합니다. Amazon Linux 2 또는 RHEL의 경우 다음 명령을 실행합니다.
systemctl reload nginx참고: NGINX 서비스를 다시 로드하는 명령은 다른 시스템에서는 다릅니다. NGINX를 다시 로드하는 명령은 이전 섹션에서 다룬, Apache 서비스를 다시 로드하는 명령과 유사합니다.
-
NGINX 웹 서버 액세스 로그를 엽니다. 위치는 구성에 따라 다릅니다.
-
이제 클라이언트 IP 주소가 기록되는지 프록시 프로토콜 헤더 아래에서 확인합니다.
-
대상 애플리케이션에서 프록시 프로토콜 지원을 활성화합니다.
- 언어
- 한국어

관련 콘텐츠
질문됨 3년 전
