NGINX Real IP 모듈을 사용하여 Client IP 추출
이번 포스트에서는 NGINX real ip 모듈을 사용하여 앞 단에 load balancer 또는 Proxy 등등이 있을 때, Client IP를 추출하는 방법에 대해 알아보겠습니다.

위의 예시 사진과 같이 NGINX 앞 단에 Firewall, Load Balancer 등이 있을 때, NGINX가 받는 IP는 바로 앞에 있는 Load Balancer의 IP를 Client IP로 받게 됩니다.
이번 포스트에서 사용할 ngx_http_realip_module을 사용하면 NGINX의 $remote_addr 변수에 firewall, load balancer 등의 IP가 아닌, 원본 Client IP를 추출할 수 있습니다.
목차
1. NGINX Real IP 모듈 개요
2. NGINX Real IP 설정
3. NGINX Real IP 작동 원리
4. 결론
1. NGINX Real IP 모듈 개요
ngx_http_realip_module 모듈은 클라이언트 주소 및 포트 옵션을 지정된 헤더 필드의 전송된 항목으로 변경하는 데 사용되는 모듈입니다.
Syntax: set_real_ip_from address | CIDR | unix:;
Default: —
Context: http, server, location
올바른 교체 주소를 전송하는 것으로 알려진 신뢰할 수 있는 주소를 정의합니다. 특수 값 unix:가 지정되는 경우 모든 UNIX-도메인 소켓을 신뢰할 수 있습니다. 신뢰할 수 있는 주소도 호스트 이름(1.13.1)을 사용하여 지정할 수 있습니다.
위 지시문을 사용하여 Firewall IP 또는 Load Balancer IP 등을 신뢰할 수 있는 주소로 지정할 수 있습니다.
Syntax: real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;
Default: real_ip_header X-Real-IP;
Context: http, server, location
클라이언트 주소를 대체하는 데 사용될 값이 있는 요청 헤더 필드를 정의합니다.
NGINX는 X-Forwarded-For 헤더를 확인하고, 설정된 신뢰할 수 있는 load balacner 등으로부터 온 요청에 대해 클라이언트 IP를 업데이트합니다.
Syntax: real_ip_recursive on | off;
Default: real_ip_recursive off;
Context: http, server, location
재귀 검색이 비활성화되면 신뢰할 수 있는 주소 중 하나와 일치하는 원래 클라이언트 주소가 real_ip_header 명령이 정의하는 요청 헤더 필드의 전송된 마지막 주소로 교체됩니다.
X-Forwarded-For 헤더를 뒤에서부터 탐색하며, set_real_ip_from으로 지정된 신뢰할 수 있는 IP를 건너뛰고 그 이전 값을 실제 클라이언트 IP로 간주합니다.
2. NGINX Real IP 설정

트래픽 흐름이 위의 사진과 같을 때, Real IP 설정을 하지 않은 상태에서는, NGINX의 로그를 확인해보면 원본 클라이언트 IP가 아닌, 바로 앞의 Load Balancer IP가 기록되는 것을 확인할 수 있습니다.
아래는 일반적인 NGINX 구성에서 log_format에 $remote_addr 변수만 추가하여 client IP를 확인해보겠습니다:
log_format ip '$remote_addr';
server {
listen 80;
access_log /var/log/nginx/access.log ip;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
요청을 보내고 로그를 확인해보면 원본 클라이언트 IP가 아닌 NGINX 바로 앞의 Load Balancer IP가 기록되는 것을 확인할 수 있습니다.

set_real_ip_from 지시문을 사용하여 Firewall IP와 Load Balancer IP를 등록하고, 원본 Client IP를 받는 구성은 다음과 같습니다.
http {
...
log_format ip '$remote_addr';
set_real_ip_from 192.168.201.100;
set_real_ip_from 192.168.201.101;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
server {
listen 80;
access_log /var/log/nginx/access.log ip;
location / {
root /usr/share/nginx/html;
index new_index.html;
}
}
}
위와 같이 구성하면 192.168.201.100, 192.168.201.101을 신뢰할 수 있는 IP라고 지정합니다.
요청을 보내 로그를 확인해보면

원본 클라이언트 IP가 기록되는 것을 확인할 수 있습니다.
3. NGINX Real IP 작동 원리
NGINX Real IP 설정 섹션에서 사용한 구성으로 작동 원리를 확인해보자면,
http {
...
log_format ip '$remote_addr';
set_real_ip_from 192.168.201.100;
set_real_ip_from 192.168.201.101;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
server {
listen 80;
access_log /var/log/nginx/access.log ip;
location / {
root /usr/share/nginx/html;
index new_index.html;
}
}
}
- set_real_ip_from – 192.168.201.100과 192.168.201.101은 신뢰 가능한 IP로 간주됩니다. NGINX는 요청이 이 IP 주소에서 오는 경우에만 real_ip_header에 정의된 헤더 값을 사용해 클라이언트 IP를 결정합니다.
- real_ip_header – 요청 헤더가 여러 프록시 등을 거친 경우, X-Forwarded-For 헤더에 IP는 콤마로 구분되어 나열됩니다.(
X-Forwarded-For: 203.0.113.15, 192.168.201.100, 192.168.201.101) - real_ip_recursive – 다중 프록시를 거친 요청의 경우 헤더 내 첫 번째 IP를 클라이언트의 실제 IP로 확인할 수 있게 합니다.
작동 흐름:
1. 클라이언트에서 요청이 Load Balancer(192.168.201.100과 192.168.201.101)를 통해 NGINX로 전달됩니다.
2. NGINX는 요청이 set_real_ip_from에 지정된 신뢰할 수 있는 IP(Load Balancer 등)에서 온 것인지 확인합니다.
3. 헤더 값이 여러 IP(X-Forwarded-For: 203.0.113.15, 192.168.201.100, 192.168.201.101)를 포함하고 있다면 첫 번째 IP(203.0.113.15)를 실제 클라이언트 IP로 설정합니다.
4. 결론
NGINX Real IP 모듈을 활용하면 로드 밸런서나 프록시 서버를 경유한 클라이언트의 원본 IP를 효과적으로 추출할 수 있습니다. 이를 위해 신뢰할 수 있는 IP를 설정하고, X-Forwarded-For 헤더를 통해 클라이언트 IP를 확인하는 구성으로 설정합니다.
real_ip_recursive 옵션을 활성화하면 다중 프록시를 거친 경우에도 첫 번째 IP를 실제 클라이언트 IP로 인식할 수 있습니다. 이러한 설정을 통해 원본 클라이언트 IP를 정확히 기록할 수 있어 로그 분석 및 보안 강화에 기여할 수 있습니다.
NGINX Plus를 직접 사용하여 성능을 업그레이드 해보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.
댓글을 달려면 로그인해야 합니다.