본문 바로가기

컴퓨터 사이언스/네트워크

[모바일 컴퓨팅] NAT (Network Address Translation)

NAT 탄생 배경

- IPv4 주소 체계에서 주소 고갈에 대한 불안감으로 시작되었다.

- short-term solution으로 NAT, long-term solution으로 IPv6가 대두되었지만,

라우터 장비 교체에 드는 경제적 손실 등을 이유로 NAT가 계속 쓰이고 있는 실정이다.

 

Private Network

- Private IP 네트워크란 직접적으로 인터넷과 연결되지 않는 IP 네트워크이다.

- Private IP address는 임의로 할당될 수 있다.

따라서, 이 주소는 globally unique하지 않다.

- 일반적으로, 라우트에 쓰이지 않는 experimental address ranges에 Private address가 할당된다.

class A: 10.0.0.0 - 10.255.255.255

class B: 172.16.0.0 - 172.31.255.255

class C: 192.168.0.0 - 192.168.255.255

ex) 192.168.0.1과 같이 배정된 주소가 공유기에서 할당된 것을 쉽게 찾아볼 수 있었을 것이다.

 

NAT (Network Address Translation)

- 라우터가 자신의 private network안에서 IP 데이터그램의 IP 주소와 포트 번호를 변경할 수 있는 기능이다.

- Private network안의 host가 public network(internet)의 host와 통신할 수 있도록 해준다.

 

NAT와 NAPT (Network Address and Port Translation)

- 기존의 NAT는 n:m으로 주소를 매핑시키는 방식이었다.

- NAPT는 Private Netwok안의 host들이 동일한 public address를 가지지만, Port Number를 다르게 해 통신이 가능하도록 해준다.

 

Hole Punching

- private netwrok의 host가 다른 private network의 host와 통신을 할 때, 사용된다.

- 중개서버를 통해 pinhole을 뚫게 된다.

 

NAT의 단점

- IP address가 수정되면, IP header checksum을 다시 계산해주어야 되고,

Port number가 수정되면, TCP checksum을 다시 계산해주어야 한다.

- End-to-End principle 파괴

- Public host와의 통신에 third-party(NAT 변환 테이블 등) 없이 통신이 불가능하다.

이 단점은 private host들간의 통신에 더욱 두드러진다.

 

Configuring NAT in Linux

- Netfilter/iptable 패키지 사용

- kernel에 5 hooking point를 두고 필터링한다.

(filter INPUT, nat PREROUTING, filter OUTPUT, filter FORWARD, nat POSTROUTING)

 

iptables –A INPUT –j DROP : 전부 드랍

iptables –A INPUT –p tcp –dport 80 –j DROP : tcp protocol을 사용해 80번 포트로 가는 패킷 드랍

iptables –A INPUT –s 10.2.2.5 –j DROP : 출발지 IP 주소가 10.2.2.5인 패킷 드랍

iptables –A INPUT –d 10.2.2.5 –j DROP : 목적지 IP 주소가 10.2.25인 패킷 드랍

 

ALG (Application Layer Gateway)

- SIP 등의 프로토콜을 사용하는 private host가 public network (Internet)과 통신을 하면 private 주소로 인해 기존 NAT 통신이 불가능하다.

- ALG는 applcation layer에 관여가 가능한 gateway여서, SIP와 같은 5계층 프로토콜의 주소를 변환해 통신이 가능하도록 한다.

 

STUN (Session Traversal Utilities for NAT)

- Public Network에 있는 STUN server가 필수적이다.

- TCP/UDP와 3478 port를 사용

- private host가 STUN 서버에 request를 보내면, Mapped address를 reply해주고 이 주소가 해당 호스트의 public address가 된다.

- magic cookie와 mapped address를 XOR해 일종의 checksum 역할을 한다.

ex) magic cookie : 2112A442

mapped address : 82.127.73.39

0010/0001/    0001/0010/    1010/0100/    0100/0010

01010010/        011111111/          01001001/       00100111

--------------------------------------------------------

0111/0011/        0110/1101/         1110/1101/       0110/0101 

XOR'd address : 736DED65

 

TURN (Traversal Using Replays around NAT) or STUN Relay

- 같은 NAT에 존재하는 두 private host 처럼 STUN을 통해 peer-to-peer 통신을 할 수 없는 경우가 있다.

- TURN 서버를 통해, 두 end host를 릴레이 해준다.

- TURN 서버는 당연히 많은 대역폭을 필요로 하고, end-host들이 통신할 동안 서버가 이용가능한 것이 보장되어야 한다.

- 추가 헤더로 인해, overhead가 생기고 실제 전송자를 찾기 위해, 방화벽은 페이로드를 검사해야 한다.

- ICMP가 중개되지 않고, TTL이 제대로 줄어들지 않기 때문에 loop의 가능성이 있다.

 

ICE (Interactive Connectivity Establishment)

- STUN/TURN 등을 이용해 후보를 모은다.

- host transport(public 주소를 이용해) > server-reflective (STUN 서버를 통해 받은 public address) > relayed (TURN 서버를 이용)

의 순서로 우선순위를 정한다.

- 우선순위 순으로 연결을 시도하고, 수립되면 종료