반응형

x-forwarded-for 는 백엔드서버가 접근하는데 클라이언트의 ip를 체크하기 위해서 사용한다.

 

다양한 네트워크 구간이 존재하기 때문에 proxy 서버에서 x-forwarded-for 설정이 없다면

백엔드서버의 바로 앞단에 있던 proxy 서버의 ip를 가지고 있는다.

 

테스트 환경

openresty 서버를 2개를 두어 proxy pass 시 x-forwarded-for ip를 로그로 찍으며 테스트한 걸 기록하려한다.

테스트 VM Public IP Private IP
호출서버 223.130.162.121  
proxy 1번 175.45.193.85 10.160.227.8
proxy 2번 175.106.97.177 10.160.227.9

시나리오는 아래와 같다.

1. 호출서버에서 proxy 1번 호출(http)

2. proxy 1번서버는 proxy2번서버로 proxy pass

3. proxy 2번서버는 proxy1번서버 81포트로 proxy_pass, 헤더값을 none 으로 치환

4. proxy 1번서버의 81포트는 index.html 페이지 return

 

proxy pass로 흘려주고, 중간에 헤더값을 강제로 치환시키며 log를 분석한다.

 

nginx.conf 수정

proxy 1번서버

간단히 80, 81 포트를 열고

proxy pass 는 Proxy 2번의 Private IP를 사용해보았다.

server {
    listen 80;
    location / {
        proxy_pass http://10.160.227.9;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen       81;
    location / {
         root   html;
         index  index.html index.htm;
    }
}

 

proxy 2번서버

80 포트를 열고 proxy 1번 public ip의 81 포트로 접근하며,

커스텀헤더인 sa-head의 값을 none 으로 설정하였다.

server {
    listen       80;
    location / {
        proxy_pass http://175.45.193.85:81;
        proxy_set_header sa-head "none";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

 

access.log 포맷

log_format  main  'remote_addr : $remote_addr '
                  'x-forwarded-for : "$http_x_forwarded_for" '
                  'proxy_add_x_forwarded_for : "$proxy_add_x_forwarded_for" '
                  'sa_head : "$http_sa_head"';

간단하게 이전 ip, x-forwararded-for, 커스텀헤더를 출력하게 하였다. 

(커스텀헤더는 http_헤더명 방식으로 사용할 수 있음)

로그포맷을 사용하려면 access_log 쪽에 포맷이름을 기입해주어야한다.

access_log  logs/access.log  main;

 

호출테스트

이제 호출을 해보자

$ curl 175.45.193.85 -H 'sa-head:joon95'

1번째(proxy1:80 listen)

remote_addr : 223.130.162.121 
 x-forwarded-for : "-" 
 proxy_add_x_forwarded_for : "223.130.162.121"
 sa_head : "joon95"

2번째(proxy2:80 listen)

remote_addr : 10.160.227.8
 x-forwarded-for : "223.130.162.121"
 proxy_add_x_forwarded_for : "223.130.162.121, 10.160.227.8" 
 sa_head : "joon95"

3번째(proxy1:81 listen)

remote_addr : 175.106.97.177 
 x-forwarded-for : "223.130.162.121, 10.160.227.8" 
 proxy_add_x_forwarded_for : "223.130.162.121, 10.160.227.8, 175.106.97.177"
 sa_head : "none"

 

로그를 보면 x-forwarded-for 헤더에 추가적으로 ip가 넘어가는 걸 볼 수 있다.

근데 proxy_add_x_forwarded_for 라는 변수는 넘어온 x-forwarded-for ip 목록에 remote_addr를 추가해서 가지고 있다는 사실을 확인할 수 있었다. 그래서 proxy_pass 를 사용할 때 x-forwarded-for 헤더에 이 변수를 기입하여 모든 ip를 연속적으로 넘길 수 있다(nginx 사이트의 해당 변수 처리를 보았음).

 

마치며

간만에 로그를 분석해가며 테스트해보았는데, 많은 도움이 된 것 같다.

긴 글 읽어주셔서 감사합니다.^^

 

참고사이트

 

Using the Forwarded header | NGINX

 

www.nginx.com

 

반응형
복사했습니다!