[AWS-ELB] TCP형태로 세팅 한 후 nginx proxy와 함께 사용 시 client ip 받기
ELB를 Http형태로 세팅을 한 후라면, X-FORWARDED-FOR 헤더에서 찾으면 client ip를 쉽게 얻을 수 있는데,
웹소켓이라던지 기타 TCP 통신을 하는 TCP 형태로 세팅이 된 경우라면, ELB쪽에도 Proxy 세팅을 해야하고,
서버쪽에서도 추가로 Proxy Address를 받을 수 있도록 세팅을 해야 client ip를 얻어올 수가 있었다.
일단 해야 할 작업은 두 가지이므로 정리해본다.
1. ELB에 proxy protocol 활성화 하기
아마존 콘솔을 열고 아래의 명령어를 입력하면 완료된다.
aws elb create-load-balancer-policy --load-balancer-name my-load-balancer --policy-name EnableProxyProtocol --policy-type-name ProxyProtocolPolicyType --policy-attributes "AttributeName=ProxyProtocol,AttributeValue=true"
2. 서버 (이 포스팅에서는 Nginx를 사용하여 웹소켓을 사용함) 세팅
[nginx.conf]
server { listen 80 proxy_protocol; # 필수 real_ip_header proxy_protocol; # 필수 location / { proxy_http_version 1.1; # 필요에 따라 proxy_pass http://127.0.0.1:8000/; # 필요에 따라 proxy_set_header Connection $connection_upgrade; # 웹소켓을 사용한다면 필수 proxy_set_header Upgrade $http_upgrade; # 웹소켓을 사용한다면 필수 proxy_set_header X-Forwarded-For $proxy_protocol_addr; # 필수 } }
기본 Nginx access log 설정이라면, 아마 기존과 동일한 ip가 확인이 될 건데, log_format을 살짝 변환하여 이를 해결할 수 있다.
[nginx.conf]
log_format forward_log '$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"' ;
access_log access.log forward_log # 기존 access_log 설정에 파라미터로 log_format 정의한걸 입력해주면 access_log에서도 확인을 해볼 수가 있다.
만약, nginx를 사용하지 않는경우라도, X-Forwarded-For 헤더에서 찾으면 원하는 client ip 정보를 얻을 수가 있다.