이야기박스
로드밸런서 inline/dsr 모드 및 remote-addr 구하기 본문
# 개요
소프트웨어 개발자라면 누구나 사용해 보았을 로드밸런서, 그리고 로드밸런서를 지나쳐 온 요청에서 Client IP를 구하는 내용을 포스팅으로 정리해보겠습니다.
인프라 전문가가 아닌, 이용자의 시선에서 포스팅을 작성하였고 예제로 사용된 코드는 자바 언어를 사용하고 있지만 수도 코드에 가깝습니다.
# 로드밸런서란?
서버 부하 분산을 위해 사용하는 것
대부분 L7 로드밸런서를 사용하지만 이전에는 L4를 많이 사용하였다고 합니다. 여기서 L7/L4는 OSI Layer를 의미합니다.
OSI Layer가 궁금하시다면 이야기박스의 OSI 7 Layer 포스팅을 참고 해주세요~
L4와 L7은 모두 IP와 Port를 이용하여 로드 밸런싱을 하지만 L7 로드밸런서에서는 추가적으로 패킷의 정보를 이용한다고 합니다. GET/POST와 같은 Method나 프로토콜을 이용하여 밸런싱이 가능한 것 같습니다.
추가적으로 L4에서는 LB는 Client의 요청을 Application 계층으로 전달만 하게 되지만, L7에서는 Server 측과 별도의 TCP 세션을 생성하고 데이터를 중계하게 됩니다.
위와 같은 작업으로 Mega Proxy Problem을 해소할 수 있다고 하네요.
# LB Mode
Client IP주소를 변경하게 되는 Inline(Proxy) 모드와 출발지/목적지 IP 주소를 변조하지 않는 DSR(Direct Server Return) 모드 크게 두 가지로 생각하면 쉬울 것 같습니다.
(이외에도 Router Mode, One Arm Mode 등.. 많은 모드가 있는 것 같습니다. 인프라 전문가가 아니다 보니,, 위 두 개만 이해하고 넘어가려고 합니다.)
Inline / DSR 모드에 따라서 각각 어떠한 방법으로 Client IP (Remote Addr)을 획득할 수 있는지 알아보도록 하겠습니다.
# DSR 모드에서 Client IP 획득하기
IP를 변조하지 않으니, Request의 Attribute에서 바로 획득이 가능합니다.
# Example
clientIp = request.getRemoteAddr();
# Inline 모드에서 Client IP 획득하기
XFF(X-Forwarded-For)와 같은 헤더로부터 IP를 획득이 가능합니다. 위 헤더는 로드밸런서에서 등록해준 HTTP 헤더로부터 확인이 가능합니다.
# Example
clientIp = request.getHeader("X-Forwarded-For");
# 참조
https://travelc.tistory.com/82
'Computer & Data > Network' 카테고리의 다른 글
OSI 7 Layer, Why is it important? (0) | 2023.07.30 |
---|---|
PKCS 공개키 암호 표준 ; InvalidKeySpecException (1) | 2020.06.03 |
netty-grpc ssl 통신 인증 문제 (0) | 2018.09.07 |
tcp/ip 네트워크 스택 (0) | 2018.09.06 |
SSLProtocolException: handshake alert: unrecognized_name (0) | 2018.08.22 |