본문 바로가기

Compute/ELB

AWS ELB Proxy Protocol 기능 활성화 하기(TCP)

금일은 TCP 통신을 위해서 ELB에 Proxy Protocol 정책을 추가해보도록 한다.

 

 

1. 개요

기본적으로 ELB는 http 및 https 통신에 한해서 Sticky Session 지원과 Client IP를 포워딩한다.

기존 http 헤더에서 x-forwarded-for/port/protocol 의 항목이 추가 됐다.

아래는 ELB를 통해 들어온 http 통신 header 값이다.

 

{ 
  host: 'test-2139921278.ap-northeast-1.elb.amazonaws.com:8080',
  accept: '*/*',
  'accept-encoding': 'gzip, deflate, sdch',
  'accept-language': 'ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4',
  referer: 'http://test-XXXXXXX278.ap-northeast-1.elb.amazonaws.com:8080/',
  'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
 Chrome/45.0.2454.101 Safari/537.36',
  'x-forwarded-for': '2XX.XXX.XX.XXX',
  'x-forwarded-port': '8080',
  'x-forwarded-proto': 'http',
  connection: 'keep-alive' 
}

 

만약 ELB에서 TCP를 사용하면 당연히 HTTP x-forwarded 헤더를 지원하지 않는다.

기본적으로 TCP 통신에서 ELB의 Back-end 서버들은 Client IP와 Port를 확인할 수 없다. 그러나 ELB Proxy 모드를 활성화 시키면 Client IP와 Port 정보를 확인할 수 있다.

 

AWS 블로그 참고

 

Elastic Load Balancing adds Support for Proxy Protocol | Amazon Web Services

My colleague Lesley Mbogo is a Senior Product Manager on the Elastic Load Balancing team. She sent along the post below to tell you all about an important new feature — support for the Proxy Protocol. — Jeff; Starting today, Elastic Load Balancing (ELB) su

aws.amazon.com

AWS ELB Proxy Mode 관련 Document

 

Configure Proxy Protocol Support for Your Classic Load Balancer - Elastic Load Balancing

The AWS Documentation website is getting a new look! Try it now and let us know what you think. Switch to the new look >> You can return to the original look by selecting English in the language selector above. Configure Proxy Protocol Support for Your Cla

docs.aws.amazon.com

  •  

위 Document를 따라 ELB를 Proxy 모듈로 실행한다.

 

그럼 node proxy 모듈을 통해 Client IP를 확인할 수 있다.

var http = require('http')
    , proxiedHttp = require('proxywrap').proxy(http)
    , express = require('express')
    , app = express()
    , srv = proxiedHttp.createServer(app); // instead of http.createServer(app)
 
app.get('/', function(req, res) {
    res.send('IP = ' + req.connection.remoteAddress + ':' + req.connection.remotePort);
    console.log('IP = ' + req.connection.remoteAddress + ':' + req.connection.remotePort);
});
srv.listen(80);

 

ELB를 Proxy 모드를 설정하여 Client IP 및 Port를 확인할 수 있다.

 

추가로 ELB는 Roud Robin이 아닌 Least connection 방식을 통해 백앤드 서버와 통신한다.

(가장 레이턴시가 짧은 백앤드와 통신)