* 공인 IP

 

- 정의

 

공인 IP(public IP)란 공개적으로 라우팅할 수 있다는 것을 뜻한다. 다른 말로 하면 전 세계 인터넷상 어디서든 공인 IP로 패킷을 보내면 이 패킷이 인터넷의 여러 라우터를 거쳐 해당 호스트에 도달할 수 있는 뜻이 된다.

 

 

- 한계

 

해당 호스트에 정확하게 도달하는 역할을 하기 위해서 공인 IP는 반드시 호스트에 고유하게 할당되어야 한다. ICANN 및 산하 기구는 IP 주소 공간을 큰 단위의 블록으로 나누어 여러곳에 할당하지만 IPv4의 주소 공간이 32비트에 불과하므로 할당 가능한 공인 IP는 43억에 못미친다. 네트워크 기기의 숫자는 이를 훨씬 상회하여 문제가 된다.

 

 

* NAT

 

- 정의

 

네트워크 주소 변환(network address translation, NAT)은 IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말한다.

# 패킷에 변화가 생기기 때문에 IP나 TCP/UDP의 체크섬(checksum)도 다시 계산되어 재기록해야 한다.

 

 

- 사용 이유

 

NAT를 이용하는 이유는 일반적으로 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위함이다.

 

 

- 동작 원리

 

서브넷의 각 호스트마다 공인 IP 대신 사설 IP(private IP)를 할당해야한다. IANA가 사설 IP로 사용하게 따로 주소 대역을 지정하고 있는데 이 범위의 IP는 공인 IP로 사용되는 일이 없다. 인터넷에 공개된 라우터가 사설 IP에 직접 접근하는 일은 없기 때문에 사설 IP를 결정할 때 다른 사설망의 사설 IP와 겹치는 문제를 신경쓰지 않아도 된다.

사설 IP 범위의 주소는 다음과 같다.

IP 주소 범위 서브넷
10.0.0.0 - 10.255.255.255 10.0.0.0/8
172.16.0.0 - 172.31.255.255 172.16.0.0/12
192.168.0.0 - 192.168.255.255 192.168.0.0/16

 

 

NAT장비의 하나인 공유기를 예로 설명할 수 있다.

 

그림과 같은 망이 구성되었다고 가정할 때 공유기에는 NIC이 두 개 존재한다. 내부망으로 연결되는 사설 IP용업체가 깔아준 회선에 연결되는 인터넷용(공인IP) 이다. 사설 IP를 사용하는 NIC은 로컬 네트워크에 연결되므로 LAN(local area network)포트라 하고, 인터넷용 NIC은 전 세계에 연결할 수 있으므로 광역 네트워크 포트 또는 WAN(wide area network)포트라 한다.

 

이 모델에서 PC에서 사설 IP 192.168.1.2:100인 게임 클라이언트로 공인 IP 게임서버 12.5.3.2:200에 접속하여 MMORPG게임을 플레이한다고 생각해보자. 다음과 같이 패킷을 서로 주고받을 수 있어야한다.

  1. 클라이언트->서버 : 사설 IP -> 공인 IP : 192.168.1.2:100 -> 12.5.3.2:200
  2. 서버->클라이언트 : 공인 IP -> 사설 IP : 12.5.3.2:200 -> 192.168.1.2:100

1번의 경우 공유기의 WAN포트를 통해 인터넷으로 보내지고 라우팅을 통해 서버에 도달할 수 있다.

2번의 경우 인터넷의 공개 라우터에서 사설 IP에 접근할 수 없고, 만약 접근가능하다고 하더라도 해당 사설 IP를 쓰는 사설망은 무수히 많을 것이기 때문에 문제가 된다.

 

이 문제를 해결하기 위해 공유기의 NAT 모듈은 통과하는 IP 패킷 발신지의 사설 IP를 공유기 자신의 공인 IP 주소와 포트 번호를 재기입한다. 먼저 IP를 보면 192.168.1.2 대신 18.19.20.21로 고쳐쓴다. 이렇게만 설정해두면 클라이언트가 속한 사설망의 공유기까지는 도착할 것이다. 하지만 (그림에서 PC, 노트북, 스마트폰 중에)어떤 호스트한테 보낼지도 알려줘야한다. 사설망의 호스트들이 같은 외부 IP로 접속할 수도 있기 때문에 각 사설 IP가 공인 IP로 일대일 대응이 되어야 한다. IP 주소와 전송계층의 포트 번호를 활용하면 이를 해결할 수 있다. 

 

 

그림과 같이 네트워크 주소 변환(NAT) 테이블을 활용하여 처리해준다. 과정을 간단히 다음과 같다.

  1. 사설 IP를 사용하는 호스트의 패킷이 외부로 나가기 전 공유기에 도달하면 NAT 모듈이 그 발신자 IP 주소와 포트 번호를 NAT 테이블에 새 항목으로 추가한다.
  2. 아직 사용한 적 없는 포트 번호 하나를 임의로 골라 외부 식별용으로 NAT 테이블에 같이 등록해준다.
  3. '공인 IP : 외부 식별용 포트 번호' 형식으로 발신자 주소를 재기입하고 공개 라우터를 통해 서버에 도착한다.
  4. 서버에서 해당 패킷을 처리한 후 도착지를 '공인 IP : 외부 식별용 포트 번호' 로 기입해서 응답패킷을 보낸다.
  5. 해당 패킷은 공유기에 도달하게 되고 네트워크 주소 변환 테이블을 조회하여 해당 포트에 해당하는 호스트를 찾아내서 패킷을 보내준다.

 

* NAT 투과(NAT traversal)

 

위에서는 서버는 공인 IP로 되어 있었기 때문에 NAT장비를 사용하는 클라이언트에서 패킷을 보낼 수 있었다. 하지만 둘다 각각 NAT장비를 사용하는 호스트 사이에서는 위의 방식을 사용할 수 없다.

 

그림과 같은 상황이 존재한다고 가정 해보자. (호스트 A와 B의 사설 IP와 포트가 같은 경우도 다른 NAT이므로 상관없다.)

호스트 B에서 호스트 A로 패킷을 보내고 싶어도 NAT A의 NAT 테이블에 B의 정보가 없어서 보내지 못한다.

이런 문제를 해결하기 위해 몇 가지 방법이 있다.

 

- 1. 포트 포워딩 설정

 

A 측에서 공유기 설정에서 포트 포워딩을 해준다. 예를 들어 호스트 A(192.168.10.2:200)를 18.19.20.21:50000으로 포트 포워딩 하는 식이다. 주의할 점은 호스트 A가 인터넷 도달 전까지의 NAT장비 수만큼 포트 포워딩을 해줘야한다. (그림에서 NAT A 1개)

 

 

- 2. STUN(simple traversal of UDP through NAT) / 홀 펀칭(hole punching)

 

각 호스트는 공인 IP로 공개된 중개 호스트(ex. Xbox 라이브, 플레이스테이션 네트워크 서버 등)에 연결해야한다. 중개 호스트는 여러 호스트가 서로 직접 연결하기 위해 필요한 작업을 중개해준다. 

 

 

 

  1. 호스트 A는 서버를 개설할 의도를 중개 호스트(호스트 N)에게 전달한다. 
  2. 호스트 A -> 중개 호스트로 전달되는 과정에서 NAT A는 NAT 테이블에 중개 호스트(공인 IP)를 발신자 주소로 발신자 포트를 60000(사용한적 없는 포트 임의로)으로 할당한다. // NAT A 테이블 1행
  3. 호스트 B는 호스트 A의 서버에 연결하고 싶다는 패킷을 중개 호스트에게 전달한다.
  4. 호스트 B -> 중개 호스트로 전달되는 과정에서 NAT B는 NAT 테이블에 중개 호스트(공인 IP)를 발신자 주소로 발신자 포트를 62000(사용한적 없는 포트 임의로)으로 할당한다. // NAT B 테이블 1행
  5. 여기서 바로 호스트 B에게 호스트 A의 공인 IP와 포트 번호(18.19.20.21:60000)를 전달하여 해당 주소로 패킷을 보내면 될 것 같지만 NAT A는 호스트 B와 통신한 적이 없기 때문에 NAT A 테이블에 호스트 B의 정보가 존재하지 않는다. 이 경우 패킷이 차단된다. 
  6. 5번을 해결하기 위해 먼저 중개 호스트는 호스트 A에게 호스트 B의 공인 IP와 포트를 전달한다. 
  7. 호스트 A에서 호스트 B로 패킷을 하나 보낸다. NAT B에서 호스트 A의 정보가 없기 떄문에 이 패킷은 차단되지만 NAT A 테이블 2행이 만들어진다.
  8. 이제 호스트 B에서 호스트 A로 패킷을 보내면 NAT B에서 2행이 만들어지게 되고 7번에서 NAT A에 호스트 B에 대한 정보가 만들어져 있기 때문에 패킷을 차단하지 않는다.
  9. 이제 호스트 A <=> 호스트 B의 통신이 가능하다.

이 기법은 밖으로 나가는 요청마다 고유한 외부 포트를 할당하는 대칭형 NAT(symmetric NAT)의 경우 사용할 수 없다.

그림에서 중개 호스트로 보낼 때 할당되는 외부 포트와 다른 호스트 B로 보낼 때 할당되는 외부 포트가 다르기 때문이다.

'네트워크' 카테고리의 다른 글

리플리케이션  (0) 2022.01.04
직렬화  (0) 2021.12.31
신뢰성과 UDP  (0) 2021.12.07
서버-클라이언트 구조 설계 : IOCP와 Overlapped I/O  (0) 2021.11.29
OSI모델과 TCP / UDP  (0) 2021.11.10

+ Recent posts