Notes/Network

[Network] NAT - PAT와 포트포워딩을 구분지을 수 있을까?

ReTeu 2023. 4. 21. 20:28

  친구와 마인크래프트에서 만나 멀티플레이를 하기 위해서 서버를 열려고 한다. 서버에 친구를 초대하기 위해서는 우선 서버를 열기 위해 마인크래프트 버킷을 세팅하고 우리집 공유기의 25565포트로 들어오는 TCP 패킷을 내 컴퓨터로 전송하도록 공유기 어드민 페이지에서 설정해주어야 한다. 우리는 이 과정을 포트포워딩이라고 부른다.

마인크래프트 유저라면 익- 숙한 숫자, 25565

 

  하나의 공인 ip로 들어오는 요청을 포트 번호 별로 구분지어 사용하는 포트포워딩과 유사하게 우리는 하나의 공인 ip를 보다 효율적으로 사용하기 위해 라우터나 스위치 단계에서 자체적인 주소 체계 (사설 ip)를 만들어 사용한다. LAN을 구성하는 장치들에 사설 ip를 할당하는 프로토콜은 DHCP (Dynamic host Configuration Protocol)라고 부르며, 사설 ip와 장치의 MAC (Media Access Control) 주소를 매칭하는 프로토콜은 ARP (Address Resolution Protocol), 실제로 ip 헤더의 수/발신지를 변경하는 작업은 NAT (Network Address Translation)라고 부른다.

 

  NAT는 작업의 성격에 따라 3가지로 분류된다.
1. Static
2. Dynamic
3. PAT

  줄여서는 SNAT, DNAT라고 부르기도 하나, 이 외에도 source NAT, destination NAT를 칭할 때도 있는데, 이는 Static, Dynamic과 머릿글자만 겹칠 뿐 전혀 별개의 개념이므로 유의할 필요가 있다. 우리는 위의 세 가지 종류를 먼저 다뤄보도록 하자.

 

  그 전에 NAT가 무엇인지에 대해 짧게 짚어보고 넘어가도록 하자. NAT는 Network Address Translation의 두문자로서, 말 그대로 네트워크의 주소를 변환해주는 개념을 의미한다. 위에서 라우터나 방화벽 단계에서 사설 ip를 관리한다고 적었는데, 다시 말하면 라우터에 연결된 개별 장치들은 이를 고려하지 않고 작동하는 방식을 취한다는 의미이다. 가령 다음과 같은 상황에서 내 핸드폰에서 네이버 페이 서비스에 접속한다고 가정해보자.

 

    핸드폰 (발신지)

공인 ip : 163.152.37.225

사설 ip : 192.168.1.12

 

    네이버 페이(수신지)

공인 ip : 110.93.54.9

사설 ip : (알 수 없음 - 아마도 네이버 파이낸셜의 로드 밸런싱 서버로 연결될 것이다.)

 

  핸드폰에서 쏘아올리는 패킷은 ' 192.168.1.12 -> 110.93.54.9 ' 형태의 ip 헤더를 담고 있다.

이 패킷이 우리집의 라우터에서 NAT를 거치면서 ' 163.152.37.225 -> 110.93.54.9 '의 형태로 변환되고 내 핸드폰에서 출발된 패킷이라는 사실을 기억해둔다. (나가는 패킷에 대한 NAT는 Source NAT라고 부른다.)

  네이버 파이낸셜 서버에 우리의 요청이 닿게 되면 해당 서버의 스위치에서 로드밸런서의 공인 ip로 NAT되어 전달된다.

(들어오는 패킷에 대한 NAT를 Destination NAT라고 부른다.)

 

1. SNAT (Static)

  Static NAT에서는 하나의 공인 ip 주소와 하나의 사설 ip 주소가 1:1로 대응하도록 설계되어 있다. 공인 ip를 여러 개 사용해야 한다는 단점을 가지지만, 내부적으로 포트포워딩 설정이 굉장히 많이 필요한 경우에는 맵핑된 서버 한 대가 혼자서 공인 ip 하나의 포트를 모두 활용할 수 있다는 점에서 장점으로 작용할 수 있게된다.

 

 

2. DNAT (Dynamic)

  Dynamic NAT에서는 사설 ip와 대응되는 공인 ip가 1대1이 아닌 경우를 말하며, 물론 일반적인 경우에는 공인 ip쪽이 적은 쪽인 경우가 많다. DNAT에서는 가용 공인 ip를 풀 (pool)에 담아두고, 사설 ip를 부여받은 개별 장치로부터 새로운 요청이 들어올 때마다 풀에서 공인 ip를 꺼내고 맵핑을 생성하는 방식으로 작동한다. 때문에 사설 ip와 공인 ip가 고정적으로 매칭되지 않는다. 부족한 공인 ip를 여러 대의 장치에서 사용하기 위해 사용하는 것이 일반적인 용례이다.

 

 

3. PAT

  PAT에서는 하나의 공인 ip를 여러 대의 장치에서 사용 가능하도록 설계하는 방법을 다룬다. 하나의 공인 ip로 들어오는 요청을 여러 개의 사설 ip로 뿌려주기 위해 포트 개념을 가져와 활용한다. 때문에 ip (L3)만 사용하는 나머지 두 방식과 다르게 L4의 포트 개념을 가져오게 된다는 특징을 가진다. 

  이 부분에서 혼란이 오게 된다. PAT와 포트포워딩, 두 가지 프로토콜 모두 하나의 공인 ip를 대상으로 인바운드 포트 번호를 이용해 사설 ip를 매칭한다. PAT와 포트포워딩의 차이를 파악하기 위해서는 NAT의 작동 과정을 기억한 상태로 돌아오는 패킷을 쳐다볼 필요가 있다.

 

들어오는 패킷의 경우에는...

  위에서 네이버페이 서버에 접속하는 예시를 들어 설명할 때, NAT를 통해 ip를 변환하는 과정에서 '라우터는 발신 장치의 사설 ip 정보를 라우터의 포트 번호와 매칭하여 기억한다.' 라고 했다. 덕분에 네이버 페이 서버에서 우리집 공유기를 목적지로 설정하여 돌아오는 응답을 공유기에서 destination NAT를 통해 내 핸드폰으로 포워딩해줄 수 있는 것이다. 그렇다면 내가 외부로 보낸 요청에 대해 돌아오는 응답에는 PAT를 이용하면 정상적으로 처리되지만, 외부에서 먼저 패킷을 보내는 경우는 어떨까? 내부에서 외부로 패킷을 보낸 적이 없기 때문에 우리집 공유기에는 내 핸드폰에 대한 PAT 정보가 등록되어 있지 않다. 즉, 외부에서 먼저 요청이 들어오는 경우에는 어느 장치로 패킷을 전달해야할지 알 수 있는 방법이 없기 때문에 해당 패킷은 둥둥 떠다니다가 유실될 것이다. (미아 패킷이라고 브로드캐스트로 쏘진 않겠지 설마)

 

 

포트포워딩을 사용하는 이유

  이제야 비로소 포트포워딩의 진가를 알겠다. 포트포워딩의 경우 인바운드 패킷에 대한 규칙을 미리 선언해두었기 때문에 외부에서 들어오는 요청이 두 노드 사이에 이루어지는 첫 통신이라고 하더라도 정상적으로 목적지를 찾아갈 수 있게 만들어준다. 명확히 한 번 더 짚고 넘어가자면, 포트포워딩은 나가는 패킷이 아니라 들어오는 패킷에 대한 규칙을 설정하는 개념이다.

  다시 마인크래프트로 돌아가보자. 내 데스크탑에서 마인크래프트 서버를 열고 라우터 어드민 페이지에 접속한다. 외부에서 라우터의 공인  ip:25565로 들어오는 인바운드 TCP 패킷들을 내 데스크탑의 사설 ip로 포워딩하도록 포트포워딩 설정을 만진다. 내 친구가 마인크래프트 클라이언트에서 '라우터ip:25565'로 접속 요청을 보내면 우리집 라우터에서는 포트포워딩 설정에 따라 데스크탑으로 포워딩되고 마인크래프트 버킷에서 들어오는 패킷을 처리한다. 이에 대한 응답을 돌려줄 때에는 포트포워딩이 아니라 다시 NAT를 이용하게 된다.