Ncloud Network Proxy Load Balancer의 Proxy Protocol을 이용해 CentOS 서버에서 클라이언트 IP 주소를 확인하는 방법입니다.

ToC

개요

Ncloud Load Balancer는 HTTP, HTTPS, TCP, SSL 이렇게 4가지의 프로토콜을 지원합니다.
그런데, Load Balancer를 사용하면서 Client IP를 확인하려고 할 때 http, https 통신의 경우 X-Forwarded-For 헤더값이 지원되기에 Client IP를 확인할 수 있지만, TCP 통신의 경우 X-Forwarded-For 헤더를 사용할 수 없기에 Client IP를 확인하기 위해서는 Proxy Protocol 옵션을 활성화 시켜야 합니다.

여기서는 Ncloud Network Proxy Load Balancer의 TCP 프로토콜을 사용하면서 Proxy Protocol 옵션을 활성화시켜 CentOS 서버에서 Client IP를 기록하는 방법을 소개하겠습니다.

테스트 환경

  • VPC 환경
  • CentOS 7.8
  • Apache 2.4.6
  • Network Proxy Load Balancer
  • Protocol/Port: TCP/80

CentOS 서버 설치

서버를 생성하고 Apache 웹서버와 개발용 추가 모듈이 포함된 httpd-devel 패키지를 설치하고 간단한 웹페이지를 만들어 접속해 보았습니다.

~# yum -y install httpd httpd-devel
Ncloud Network Proxy Load Balancer에서 Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Target Group 설정

우선 Load Balancer를 생성하기 전에 Load Balancer에서 사용할 Target Group을 [Load Balancer] - [Target Group]에서 생성합니다.

Target Group 생성

Target Group의 이름를 입력하고 Target 유형은 [VPC Server]를 선택, 다음으로 VPC 대역을 선택합니다.
그리고, 프로토콜은 PROXY_TCP를 선택하고, 포트는 80포트를 사용하겠습니다.

Ncloud Network Proxy Load Balancer에서 Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Health Check 설정

Health Check 할 프로토콜은 TCP를 선택합니다.

Ncloud Network Proxy Load Balancer에서 Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Target 추가

앞에서 생성했던 서버 2대를 선택하고 [적용 Target]쪽으로 이동시킵니다.

Ncloud Network Proxy Load Balancer에서 Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

설정 확인

설정 정보를 최종 확인하고 이상이 없으면 Target Group을 생성합니다.

Ncloud Network Proxy Load Balancer에서 Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

생성된 Target Group를 확인할 수 있습니다.

Ncloud Network Proxy Load Balancer에서 Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Network Proxy Load Balancer 생성

[Load Balancer]에서 [로드밸런서 생성] 버튼을 클릭하고 [네트워크 프록시 로드밸런서]를 선택합니다.

Ncloud Network Proxy Load Balancer에서 Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

로드밸런서 설정

필요한 로드밸런서 설정을 선택하는데, 그 중에서 서브넷은 혹시 생성되어 있지 않으면 [서브넷 생성] 버튼을 클릭해 로드밸런서 전용 서브넷을 생성한 후에 다시 돌아옵니다. 여기서는 [10.0.4.0/24] 대역으로 설정했습니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

리스너 설정

리스너는 TCP 프로토콜에 80 포트를 선택하고 추가합니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Target Group 선택

Target Group는 위쪽에서 생성한 [Proxy-Protocol-TG] 을 선택합니다. 선택하면 해당 Target Group 설정 내용을 바로 확인할 수 있습니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

설정 확인

선택한 설정을 최종 확인하고 이상이 없으면 [로드밸런서 생성] 버튼을 클릭합니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

생성 확인

생성된 로드밸런서의 정보를 확인합니다. 특히 접속 정보와 서브넷은 이후 테스트에 사용되므로 꼭 기억하거나 메모해 두는 것이 좋습니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Network ACL 설정

로드밸런서 → 서버 접속이 가능하도록 Network ACL에 규칙을 추가합니다.
[VPC] - [Network ACL] - [ACL Rule]에서 서버와 로드밸런서가 속한 VPC의 ACL을 선택하고 [Rule 설정] 버튼을 클릭합니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Network ACL 규칙 설정 화면에서 프로토콜은 TCP, 접근소스는 로드밸런서 IP 대역인 10.0.4.0/24, 포트는 80을 입력하고 추가합니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

ACG 설정

로드밸런서 → 서버 접속이 가능하도록 서버 ACG에 규칙을 추가합니다.
서버에 적용된 ACG의 규칙 설정 화면에서 프로토콜은 TCP, 접근소스는 로드밸런서 IP 대역인 10.0.4.0/24, 포트는 80을 입력하고 추가합니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

로드밸런서 접속 테스트

위에서 생성된 로드밸런서 접속 주소로 접속을 해보면 아래와 같은 화면을 확인할 수 있습니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Apache 접속 로그 확인

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

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

다음에는 로드밸런서 IP가 아닌 실제 Client IP가 기록되도록 설정을 변경해 보겠습니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Proxy Protocol 설정

이제 실제 Client IP가 기록되도록 Proxy Protocol을 설정해보겠습니다.
[Load Balancer] - [Target Group]에서 위에서 생성했던 Target Group를 선택하고 [TargetGroup 설정] 버튼을 클릭합니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Target Group 설정 화면에서 [ProxyProtocol] 옵션을 체크하고 확인 버튼을 클릭합니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

위에서 정상적으로 접속이 되었던 로드밸런서 주소로 접속하면 [Bad Request] 메시지가 뜨는 것을 확인할 수 있습니다.
다음으로는 서버 설정을 변경해야 합니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Apache 모듈 설치

Proxy Protocol을 사용할 때 필요한 Apache 모듈을 CentOS 서버에 설치하겠습니다.

mod_myfixip 모듈 다운로드

아래 명령어로 mod_myfixip.c 파일을 다운로드 받습니다. 정상적으로 다운로드가 완료되면 ‘mod_myfixip.c’ saved 라는 메시지를 확인할 수 있습니다.

~# wget --no-check-certificate https://raw.githubusercontent.com/ggrandes/apache24-modules/master/mod_myfixip.c
Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

모듈 설치

이어서 /{아파치가 설치된 경로}/bin/apxs -c -i mod_myfixip.c 명령어로 모듈을 설치합니다.

~# /usr/bin/apxs -c -i mod_myfixip.c
Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

httpd.conf 설정 변경

모듈 설치가 완료된 후에 httpd.conf 파일을 열어서 제일 아래쪽에 아래 코드를 추가합니다.
RewriteIPAllow 항목에는 로드밸런서 IP 대역 (ex: 192.168.0.0/16, 10.31.0.0/16 등)을 입력합니다.
여기서는 위에서 설정했던 로드밸런서 IP 대역인 10.0.4.0/24를 입력했습니다.

~# vi /etc/httpd/conf/httpd.conf
LoadModule myfixip_module modules/mod_myfixip.so

<IfModule mod_myfixip.c>
  RewriteIPResetHeader off
  RewriteIPAllow 10.0.4.0/24
</IfModule>
Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

Apache 재시작

설정을 마친 후에 Apache를 재시작합니다.

~# systemctl restart httpd
Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

최종 접속 테스트

모든 설정을 모두 마친 후에 서버에 접속해봅니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

최종 접속 로그 확인

접속 로그를 다시 확인해보면 이번에는 로드밸런서 IP가 아닌 Client IP가 기록된 것을 확인할 수 있습니다.

Ncloud Network Proxy Load Balancer에서 
Proxy Protocol을 이용해 클라이언트 IP 주소를 확인하는 방법

참고 URL

  1. Proxy Protocol 설정하기
  2. Ubuntu 서버에서 Proxy Protocol을 이용해 Client IP 확인하기