Ncloud(네이버 클라우드)에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

개요

X-Forwarded-For (XFF) 는 HTTP Header 중 하나로 Load Balancer(로드밸런서)나 Proxy Server를 통해 웹서버에 접속하는 Client의 IP 주소를 식별하는 표준 헤더입니다.
웹서버나 WAS 앞쪽에 Load Balancer 혹은 Proxy Server 등이 위치하게 된다면 서버 접근 로그에는 Client IP가 아닌 Load Balancer 혹은 Proxy Server의 IP 주소가 기록됩니다. 이때 웹 어플리케이션에서 X-Forwarded-For 헤더를 이용하면 Client IP를 서버 접근 로그에 남길 수 있습니다.

여기서는 Load Balancer와 연동된 CentOS와 Ubuntu, 그리고 Rocky Linux의 Apache 웹서버 환경에서 X-Forwarded-For 를 이용하여 Apache access_log에 Clinet의 IP를 저장하는 과정을 살펴보겠습니다.

테스트 환경

테스트는 CentOS, Ubuntu, Rocky Linux OS가 각각 설치된 서버를 Load Balancer와 연동한 후 Cloud Log Analytics에서 Apache access_log를 수집해 IP 주소를 확인하는 방식으로 진행하겠습니다.

Network 환경

  • VPC 대역 : 10.0.0.0/16
  • Subnet 대역 (Server) : 10.0.0.0/24
  • Subnet 대역 (Load Balancer) : 10.0.4.0/24

Server 환경

  • xff-test-centos : CentOS 7.8
  • xff-test-ubuntu : Ubuntu 20.04
  • xff-test-rocky : Rocky Linux 8.6

테스트 서버

위 서버 환경에서 정리한 대로 CentOS, Ubuntu, Rocky Linux 이렇게 3대의 서버를 준비했습니다. VPC 환경에서 서버 생성하는 방법은 아래 문서를 참고하시면 됩니다.

Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

로드밸런서도 마찬가지로 준비하고, 서버와 연동까지 완료했습니다. VPC 환경에서 로드밸런서를 생성하는 방법은 아래 문서를 참고하시면 됩니다.

  • 로드밸런서 상세 정보에서 [10.0.4.0/24]로 표시되는 서브넷 정보를 기억했다가 아래쪽에서 테스트할 때 확인해보겠습니다.
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

설정 전 테스트

우선, X-Forwarded-For (XFF) 설정을 하기 전에 어떻게 기록이 남는지 확인해보겠습니다.
아래와 같이 Load Balancer 주소로 접속해서 3대의 서버에 각각 접근하도록 합니다.
위에서 소개한 Application Load Balancer 생성하는 방법을 그대로 따라하면 아래와 같은 메시지를 확인할 수 있습니다.

Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

Apache 접속 로그 확인

Apache 접속 로그 파일은 아래의 위치에 존재하지만, 저희는 네이버 클라우드 (Ncloud)의 상품 중 하나인 Cloud Log Analytics에서 로그를 수집해서 확인해보겠습니다.

  • CentOS : /var/log/httpd/access_log
  • Ubuntu : /var/log/apache2/access.log
  • Rocky Linux : /var/log/httpd/access_log

Cloud Log Analytics에서 수집한 로그를 확인해보면 위에서 설정했던 Load Balancer의 IP 대역 (10.0.4.xx)이 기록된 것을 확인할 수 있습니다.

Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법
  • Rocky Linux는 아직 Cloud Log Analytics Agent를 지원하지 않아 서버에서 직접 로그를 확인해보았습니다.
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

CentOS 설정

이제 실제 Client IP가 기록 되도록 설정을 변경해보겠습니다.
우선 CentOS에서는 httpd.conf 파일만 수정하면 됩니다.

~# vim /etc/httpd/conf/httpd.conf

httpd.conf 파일 [log_config_module] 설정에 있는 LogFormat 항목에서 %h%{X-Forwarded-For}i 로 수정합니다.

httpd.conf 수정 전

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

httpd.conf 수정 후

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

Apache 재시작

httpd.conf 파일 수정 후에 Apache를 재시작합니다. 로그 테스트는 Ubuntu까지 설정을 마친 후에 진행하겠습니다.

~# systemctl restart httpd

Rocky Linux 설정

Rocky Linux는 CentOS와 마찬가지로 /etc/httpd/conf/httpd.conf 파일에 있는 로그 관련 설정을 변경해주면 완료됩니다.

Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

Ubuntu 설정

Ubuntu에서는 apache2.conf 파일을 수정하기 전에 remoteip 모듈을 사용하도록 설정해줘야 합니다.

remoteip 설정

아래 명령어를 실행하면 remoteip 모듈이 활성화 됩니다.

~# a2enmod remoteip
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

remoteip.load 수정

다음으로 remoteip.load 파일을 수정해서 아래쪽에 [RemoteIPHeader X-FORWARDED-FOR]을 추가 합니다.

~# vim /etc/apache2/mods-enabled/remoteip.load
  • remoteip.load 수정 전
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
  • remoteip.load 수정 후
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
RemoteIPHeader X-FORWARDED-FOR
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

apache2.conf 수정

다음으로 apache2.conf 파일을 수정합니다.

~# vim /etc/apache2/apache2.conf

apache2.conf LogFormat 부분에서 %h%a 로 변경합니다.

  • apache2.conf 수정 전
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined  
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법
  • apache2.conf 수정 후
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined  
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

Apache 재시작

~# systemctl restart apache2

설정 후 테스트

위와 같이 CentOS, Ubuntu, Rocky Linux 3대 서버에서 설정을 모두 마친 후에 로드 밸런서 URL로 접속합니다.
이후에 Cloud Log Analytics에서 로그를 확인해보면 아래와 같이 로드밸런서 IP가 아닌 실제 접속한 Client의 IP가 기록된 것을 확인할 수 있습니다.

Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법
  • Rocky Linux는 아직 Cloud Log Analytics Agent를 지원하지 않아 서버에서 직접 로그를 확인해보았습니다.
Ncloud에서 X-Forwarded-For를 이용해 Proxy, Load Balancer 환경에서 Client IP를 Apache access_log에 기록하는 방법

참고 URL

  1. X-Forwarded-For 안내

문서 업데이트 내역

날짜 내용
2021-12-29 문서 최초 생성
2023-08-21 Rocky Linux 추가, 최신 OS 반영, 스크린샷 업데이트