backend proxy의 origin ip를 되돌리기

(Last Updated On: June 14, 2021)

nginx에서 backend 프록시는 nginx 가 설치된 서버가 요청하기 때문에 기존의 클라이언트의 IP주소가 사라지게 된다. 하지만 어플리케이션에 따라 사용자의 IP주소를 가지고 있어야 하는 경우가 많다.

Nginx: HTTP Header

HTTP(s)의 경우 백엔드 프록시 헤더에 기존의 클라이언트의 아이피를 삽입하고 오리진 서버가 이를 사용자 IP로 인식하는 것이다.
오리진 IP를 넘기는 주 헤더 명으로 X-Real-IP또는 X-Forwarded-For를 사용한다.

server {
 ...
 location / {
   proxy_pass http://127.0.0.1:3000
   proxy_set_header X-Real-IP       $remote_addr;
   proxy_set_header X-Forwarded-For $remote_addr;
http {
  ...
  #set_real_ip_from 192.168.1.0/24;
  real_ip_header X-Real-IP

# 또는...
http {
  ...
  server {
    listen 3000;
    real_ip_header X-Real-IP

Nginx: Proxy Protocol

HAProxy의 헤더지만 상당히 많은 곳에서 채택하고 있는 헤더이다.

PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n

이렇게 생겼다.
TCP 데이터스트림 최상단에 추가된다.

server {
 ...
 location / {
   proxy_pass 127.0.0.1:3000
   proxy_protocol on;
server {
  listen 80;
  real_ip_header proxy_protocol;
  ...

# 또는
server {
  listen 80 proxy_protocol;


Non-HTTP Server (TCP)

nginx의 stream모듈로 tcp 서버를 프록시 하는 경우이다.

stream {
  listen 853;
  proxy_pass 127.0.0.1:53;
  proxy_protocol on;

이 경우 TCP서버에 프록시 데이터를 그대로 전송하므로 호환되지 않는 어플리케이션이 존재할 가능성이 있다.
만약 그러한 어플리케이션이 있다면 PROXY PROTOCOL 헤더를 뜯어내는 페킷조작이 필요하다.
Path社의 go-mmproxy 가 해당하는 좋은 어플리케이션의 예가 되겠다.

https://github.com/path-network/go-mmproxy

reference