본문 바로가기

사는 이야기/펌킨도서관

L3DSR 구성

L3DSR 구성 ~ 클라우드 시대가 되면서 뜨고 있는(?) 구성 방식입니다. 서버의 물리적인 위치에 관계없이 로드밸런싱을 있는 방식으로 카카오도 L3DSR  서버를 로드밸런싱합니다. L3DSR L3 레이어를 통한 DSR(Direct Server Return) 한다는 뜻입니다.  L2DSR L2 레이어를 이용해 출발지 MAC주소를 서버의 MAC 주소로 변경해 서버로 전달합니다.  반면 L3DSR MAC 대신 IP 주소를 변경해 전달합니다.

MAC  주소 변조 방식은 L4 스위치와 서버가 같은 네트워크 대역에 있어야 합니다. 만약 L4스위치와 서로 다른 대역에 서버가 위치한다면 클라이언트의 요청이 서버까지 도달하지 못하는 상황이 발생합니다.  반면에 일반적인 SLB NAT(목적지 IP 변조) 경우 요청 패킷은 대역과 상관없이 서버까지 도달이 됩니다문제는 응답 패킷이 백본(L3 스위치) 통해 L4 거치지 않고 클라이언트로 가게 되면서 클라이언트 입장에서는 처음 요청했던 서비스IP(가상IP:이하 VIP)로부터 응답이 오지않았으므로(서버의 IP 응) 패킷을 DROP 처리 하게 됩니다(기본적으로 요청했던 IP로부터 응답을 받아야함). 이문제를 해결하기 위해서는 FNAT방식을 사용하면 됩니다.  FNAT 서버에 패킷을 전달할 출발지 IP L4 IP 변경하기 때문에 응답 패킷이 L4 거쳐 클라이언트로 가게 됩니다. 하지만 FNAT인경우 클라이언트 IP L4IP 변경되어 서버로 가기 때문에 서버에서 클라이언트 IP 알 수 없게 됩니다. 이러한 경우 서버에서 클라이언트별로 보안정책을 반영할 경우 불가능하게 됩니다. 이러한 문제를 해결하기 위한 방법이 L3DSR입니다.


L3DSR 개념을 처음 소개한 것은 야후입니다아마도 카카오랑 비슷한 이유에서 서버 로드밸런싱에 대한 고민을 했을 것입니다. 야후가 내놓은 답은 DSCP 필드를 수정해 L4 스위치에서 받은 클라이언트 요청을 L3 레이어를 통해 서버가 직접 응답할 있게 하는 것입니다. MAC 주소 변조 없이, L4 스위치에서 알려준 가상 IP 아니라 실제 출발지 IP 서버가 알게 있을까? 질문은 결국 '커뮤니케이션' 어떻게 가능하게 것인가? 이에 대한 답을 찾는 것인데요, 야후는 처음에 GRE(Generic Routing Encapsulation) IP-In-IP 터널링(RFC 1853) 통해 커뮤니케이션이 가능할지 살펴보았습니다. 옵션은 유효하지 않았고, 그래서 찾은 대안이 DSCP 필드 수정이었습니다

DSCP 필드 수정을 통한 커뮤니케이션이 가능하게 하려면 L4 스위치와 서버 간의 합의점이 필요합니다. DSCP와 가상 IP의 연결이 필요하다는 것인데요, L4 스위치에서는 DSCP 필드를 수정합니다. 이때 출발지 주소 정보는 유지가 됩니다. 서버는 이를 받은 다음 DSCP를 확인합니다. 그리고 서버는 클라이언트 요청에 직접 응답을 합니다. 이 때 서버 측에서 사용하는 것이 iptables입니다.  미리 적용한 iptables 룰을 통해 출발지 주소가 가상 IP 주소로 보이게 다시 쓰는 것이죠. 


현재까지 야후는 L3DSR iptables LVS 이용해 구현해 쓰고 있습니다관련해 깃허브에 관련 문서와 운영체제별 설정 패키지를 공개했습니다야후의 접근법은 내부에 훌륭한 엔지니어 인력이 있는 경우 어렵지 않습니다. 이는 역으로 내부에서 L4 스위치와 서버 운영체제별 설정을 세부적으로 만질 없는 조직의 경우 쉽지 않다는 답이 나옵니다

그래서 펌킨네트웍스가 쉬운 접근법을 찾아냈습니다. 기본 개념은 야후와 같습니다. DSCP 필드를 수정하는 것입니다. 클라이언트가 보낸 요청의 목적지 주소는 L4 스위치의 VIP 됩니다. 이를 받아 L4 스위치가 서버로 보내죠. 서버는 L4 스위치가 아니라 직접 클라이언트에게 응답을 보냅니다. 이때 클라이언트에게 보이는 출발지 주소는 요청을 보낸 목적지 주소와 같은 VIP입니다. 이게 처리되는 과정을 볼까요? 펌킨네트웍스 L4 스위치는 들어온 요청을 서버로 보낼 패킷에 DSCP 값을 입력합니다. 그러면 서버에서 DSCP 설정된 패킷을 가려내고, 해당 패킷은 클라이언트에 응답을 보낼 출발지 주소를 클라이언트가 요청했던 L4 VIP 바꿉니다. , 출발지 주소는 서버의IP 아닌 L4 스위치의 VIP NAT 처리가 됩니다. 이를 위해 iptables 룰과 tc 명령 사용됩니다. 과정을 그림으로 그리면 다음과 같습니다




L3DSR 구성을 위해 L4 스위치에서 해야 설정은 DSCP 값을 선택하는 정도입니다. 서버의 경우 리눅스는 iptables tc 명령을 사용하면 됩니다. 설정 서비스가 돌아가고 있는지는 다음과 같이 확인해보면 됩니다