이야기박스
로드밸런서 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
[System Network] L4 Mode비교(Inline vs DSR) 및 설정하기
Overview 서비스(웹서버) Load Balancing을 위한 매커니즘으로 구성환경에 따라 L4Inline Mode 또는 DSR Mode를 사용합니다. Inline vs DSR 구성 보통 서비스에서는 Inbound Traffic 대비 Outbound Traffic이 월..
travelc.tistory.com
로드밸런서란?(L4, L7)
서버 부하 분산을 위해 로드밸런서를 이용한다. 근래들어 L7을 많이 이용하고 이전에 많이 사용하던 장치는 L4였다. 추상적으로만 알고 있던 L7과 L4에 대해 정리를 해보았다.
medium.com
X-Forwarded-For(XFF) 란?
X-Forwarded-For(XFF) 란? XFF는 HTTP Header 중 하나로 HTTP Server에 요청한 Client의 IP를 식별하기 위한 표준입니다. 웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server, caching server 등의 장비가 있을 경우 웹��
blog.plura.io
'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 |