본문 바로가기
Network Infra 쉽게 이해하기/L4 & L7 Network 쉽게 이해하기

L4 스위치 쉽게 이해하기 #5(Source IP NAT 문제)

by 네트워크 엔지니어 환영 2020. 10. 23.
반응형
이번 문서 'L4 스위치 쉽기 이해하기'와 '서버 부하 분산 쉽게 이해하기', 다음에 이어질 문서인 'L4/L7 로드밸런싱 쉽게 이해하기'는 L4/L7 Network Swtich인 'F5 Networks' 장비를 기준으로 설명합니다. Alteon(Radware), Brocade, Cisco, Piolink, Pumkin, Citrix의 관점에서는 다소 다를 수 있습니다.

NAT에 대한 이야기를 계속하니 지루하실지 모르겠습니다. 하지만 앞서 말씀드린 것처럼 L4 스위치에서 NAT를 알고 모르고의 차이는 매우 크기 때문에 제대로 이해하고 넘어가야 합니다. 이번에 할 이야기는 Source IP NAT입니다. 

"잉? 이게 무슨 소리지" 하실 수도 있겠습니다. 이전 문서에서 NAT에 대해 설명한다고 하면서 L4 스위치 통과 시 계속 목적지가 변경되는 것이 NAT라고 말씀드렸으니까요. 사실 IP의 NAT는 Source IP NAT와 Destination IP NAT로 나뉩니다. 지금까지는 L4 스위치 통과시 그저 목적지 주소 변경인 Destination IP NAT에 대해서만 말씀을 드린 것이죠. L4 스위치를 활용함에 있어서 L4 스위치 통과 시 사용자 IP를 L4 스위치의 IP로 변경하는 Source IP NAT를 사용해야 하는 경우는 꽤 있습니다. 그리고 그 이유는 서버의 게이트웨이(Gateway), Local Address Network(LAN) 그리고 MAC Address와 연관이 깊습니다. 그 이유에 대해 먼저 살펴보겠습니다.

 

L4 스위치에서 Source IP NAT가 필요한 이유

1. L4 스위치를 통한 3-way handshake는 모든 과정(SYN, SYN/ACK, ACK)을 모두 L4 스위치를 통해 실시해야 한다.

L4 스위치를 통해 사용자와 서버가 3-way handshake를 맺을 경우, SYN, SYN/ACK, ACK Packet은 반드시 L4 스위치를 통해서 이루어져야 합니다. 그렇지 않으면 제대로 된 Connection을 맺을 수 없으며 Performance L4 Type의 Virtual Server의 경우, SYN Packet을 받아 생성한 Connection을 삭제합니다. 어떻게 된 일일까요? 아래 그림을 보며 설명하겠습니다.

<서버의 게이트웨이(Gateway)가 L4 스위치가 아닌 다른 곳이라면?>

사용자가 서버에 접속하기 위해 L4 스위치를 통해 3-way handshake를 요청하는 상황을 표현한 그림입니다. 위의 그림에서 가장 두드러지는 특징은 서버의 트래픽이 외부로 나가는 관문 역할을 하는 게이트웨이(Gateway)가 L4 스위치가 아닌 다른 스위치로 설정되어있다는 점입니다. 저게 대체 무슨 구성인가 싶으시겠지만 L4 스위치가 다운되더라도 외부와 서버의 통신이 유지되도록 하고자 할 때 많이 사용하는 구성입니다. (네트워크 구성 중 하나인 'One-Arm' 구성을 보기 쉽게 하기 위해 약간 틀어서 그렸습니다. 차후 설명합니다.)

사용자가 서비스 접속을 위해 먼저 SYN Packet을 L4 스위치에게 보냅니다. 그럼 L4 스위치는 이 SYN Packet을 받아 서버에게 넘겨주지요. 서버는 SYN Packet을 받고 SYN/ACK Packet을 사용자에게 전달하려 합니다. 그런데 서버의 게이트웨이가 L4 스위치가 아닌 백본 스위치(Backbone Switch)가 된다면 SYN/ACK Packet은 백본 스위치로 이동합니다. 그리고 백본 스위치와 외부 인터넷을 거쳐서 사용자에게 전달됩니다.

이 시점에서 L4 스위치는 분명 사용자가 전달한 SYN Packet을 전달했지만 서버에게서 SYN/ACK Packet을 받지 못했습니다. 그런데 이미 SYN/ACK Packet을 받은 사용자가 ACK Packet을 L4 스위치에게 전달합니다. L4 스위치는 SYN/ACK Packet을 받지 못했음에도 사용자로부터 ACK Packet을 받았습니다. 그리고 L4 스위치는 이 Packet을 드랍(Drop)합니다. 3-way handshake가 제대로 이루어지지 않았다고 판단한 것이지요. 아래와 같은 상황이 나타나는 것입니다.

<'SYN Packet' 이후 느닷없이 나타난 'ACK Packet'을 드랍(Drop)하는 L4 스위치>

위의 그림에서는 ACK Packet을 드랍하는 L4 스위치를 볼 수 있습니다. 이렇게 되면 사용자와 서버는 제대로 된 Connection을 맺지 못 할 것이니 통신이 불가능한 상황에 놓이게 됩니다. 이것이 첫 번째 이유입니다. 이런 비슷한 상황이 벌어지는 Case가 하나 더 있습니다. 

반응형

2. Local Address Network(LAN)에서의 통신은 IP 뿐만 아니라 MAC Address를 이용해 이루어진다.

ARP 쉽게 이해하기에서 언급한 바가 있습니다만, Local Address Network(LAN)에서 단말과 단말간 통신시 출발지와 목적지는 IP뿐만 아니라 MAC Address를 이용한다고 말씀드렸습니다. 출발지와 목적지를 IP로 지정하면 ARP Table에 일대일 매칭된 IP, MAC Address를 확인하고 목적지 IP, MAC Address를 향해 나아가죠. 보통 아래와 같은 구성에서 발생하는 문제입니다.

<L4 스위치가 서버와 백본 스위치(서버의 게이트웨이) 중간에 위치할 경우>

L4 스위치가 서버와 백본 스위치(서버의 게이트웨이) 중간에 위치하고 있습니다. 그리고 L4 스위치, 서버, 백본 스위치(서버의 게이트웨이)는 하나의 Local Address Network에 소속되어있습니다. 그럼 이제부터 문제가 되는 부분인 SYN/ACK Packet 전달 과정을 확인해보겠습니다. 

<서버로부터 받은 SYN/ACK이 사용자에게 전달되는 과정>

먼저 서버에 접속하고자 하는 사용자로부터 SYN Packet을 받은 L4 스위치는 이 SYN Packet을 서버에게 전달합니다. 이 때 출발지와 목적지 정보는 다음과 같습니다.

출발지 : L4 스위치(IP 15.15.15.15(사용자), MAC bbbb.bbbb.bbbb(L4 스위치))
목적지 : 서버(IP 192.168.1.100, MAC cccc.cccc.cccc)

이제 서버는 SYN/ACK Packet을 사용자에게 전달하기 위해 백본 스위치(서버의 게이트웨이)를 목적지로 잡고 Packet을 전달합니다. 이 때 출발지, 목적지 정보는 다음과 같습니다. 

출발지 : 서버(IP 192.168.1.100, MAC cccc.cccc.cccc)
목적지 : 백본 스위치(IP 15.15.15.15(사용자) MAC aaaa.aaaa.aaaa(백본 스위치))

서버는 위 정보를 가진 Packet을 L4 스위치를 경유하여 백본 스위치에 전달합니다. 그리고 L4 스위치는 Packet을 보고 Destination IP, Destination MAC 모두 자신에 해당하지 않으므로 백본 스위치로 그대로 Forwading합니다.(서버의 게이트웨이로 보내기 때문입니다.) 그리고 백본 스위치는 이 Packet을 받아 사용자에게 전달합니다. 여기서 중요한 점은 L4 스위치는 SYN/ACK Packet의 목적지 정보에 자신의 IP, MAC 모두 해당하지 않으므로 직접 처리하지 않는 점입니다.

<서버의 목적지 정보에 Destination IP도, Destination MAC도 해당없는 L4 스위치>

L4 스위치가 직접 Packet을 처리하기 위해서는 Packet의 목적지 정보(IP or MAC)가 L4 스위치를 가리키고 있어야 합니다.  다시 말하면 위의 상황에서는 이 Packet이 SYN/ACK Packet이라는 것을 모르는 상태에서 그저 전달만 했다는 겁니다. 그리고 SYN/ACK Packet을 받아든 사용자는 다시 ACK Packet을 L4 스위치로 보낼 것이고, L4 스위치는 아직 SYN/ACK Packet을 받지 못했다고 생각할 것 입니다. 그리고 당연히 다음 반응을 보이며 이 Packet을 드랍시키겠지요.

L4 스위치 : "???"

<ACK Packet을 드랍시키는 L4 스위치>

위의 그림처럼 ACK Packet을 드랍하기 때문에 사용자와 서버는 Connection을 맺을 수 없게 됩니다. 이렇듯 백본 스위치(서버의 게이트웨이)와 서버 사이에 L4 스위치가 있고 L4 스위치를 지난다 하더라도 Connection이 맺어지지 않는 현상이 발생할 수 있습니다. 이것이 두 번째 이유입니다.

다음 문서에서는 사용자의 IP를 L4 스위치의 IP로 Source IP NAT를 실시하면서 해결하는 과정을 이야기하겠습니다. 감사합니다.

반응형

댓글