본문 바로가기

전공/네트워크

네트워크 계층 - NAT[Network Address Translation]

반응형

공유기를 사용하고 있는 집이라면 '192.168.*.*'이라고 시작하는 자신의 IP주소를 몇번 본적이 있을 것이다. 또는 공유기 설정을 인터넷으로 하기 위해 '192.168.0.1'을 인터넷에 검색할 수도 있을 것이다. 심지어 cmd에서 ipconfig를 통해서 확인한 내 IP가 192.168.*.* 인데 다른 기기에서도 똑같은 IP가 나오는걸 보면서 'IP는 고유한 번호 아닌가?'라고 궁금증이 들었을 수도 있다.

IP는 고유한 번호가 맞다. 그럼 어떻게 다른 기기랑 IP 주소가 같은걸까? '192.168.*.*'는 '가짜'주소이기 때문이다. 그리고 이 '가짜' 주소를 가능하게 하는 프로토콜이 NAT[Network Address Translation]이다.

 

이러한 '가짜' 주소는 왜 필요한걸까?

현재 디지털 세계가 도래하면서 40억 개의 IP주소가 고갈되어가고 있다. 우리집만 해도 인터넷 TV, 와이파이용 아이패드, 데스크탑, 노트북 2대가 존재한다. 각각의 기기들이 인터넷 접속이 필요하지만 이 모든 기기들에게 각각 IP 주소를 제공한다면 IP 주소는 더욱 빠르게 고갈될 것이다.

따라서, 한 가정 내에서는 '가짜' IP 주소를 사용하자는 아이디어가 나왔고 이를 가능하게 하는 것이 바로 '공유기'다. 공유기의 구조를 생각해보자. 공유기에 연결되는 선은 여러가지가 있는데, 가장 필수적인 것이 '인터넷 선'이고 이는 집에 있는 인터넷 선 또는 과거 집 전화기에 연결했었던 특정 부분과 연결된다. 그리고 내 기기들은 이 하나의 공유기를 통해 와이파이를 잡고, 이더넷 선을 연결하여 인터넷을 사용하게 된다.

만약 내가 데스크탑을 이용해서 인터넷에 접속을 한다고 가정해보자. 그러면 인터넷에 요청하는 정보들은 데스크탑과 연결된 이더넷 선을 통해서 공유기랑 연결이 되고, 공유기와 연결된 인터넷 선을 통해서 인터넷에 접속하게 된다. 즉, 우리는 모두 '공유기'를 통해서 인터넷에 접속한다.

공유기와 연결되어 우리 집 내에서 사용되는 모든 기기들은 전부 가짜 주소다. 가짜 주소라는 것은 내가 와닿게 하기 위해 정한 명칭이고 공식 명칭은 사설 주소[Private IP]라고 한다. 이 사설 주소를 가지고 인터넷에 접속을 하면 인터넷에선 인지하지 못한다. 따라서 공유를 통해서 정보를 내보내면, 공유기는 중간에 이 사설 주소를 공공 주소[Public IP]로 변환한다. 이 공공 주소야 말로 인터넷이 인지할 수 있는 주소이며 전 세계에서 고유한 번호다.

위 그림의 X자 모형을 한 것이 공유기라고 가정해보자. 공유기와 연결된 모든 기기들은 192.168.*.*이라는 IP 주소를 가지고 사용하다가, 공유기를 통해 인터넷에 접속하는 순간 공유기가 138.76.29.7이라는 Public IP로 주소를 변환하여 인터넷과 소통한다.

이 방식으로 인터넷을 접속하는 기기는 고유한 IP를 사용하지 않아도 되고 IP 주소를 아낄 수 있게 된다.

각 클래스마다 특정 부분은 Private IP를 위해 남겨놓았다. 

 

 

그러면 해당 방식은 자세하게 어떻게 동작되는 걸까? 모든 기기가 하나의 IP를 공유한다면 데스크탑에서 요청한 정보가 내 인터넷TV나 아이패드가 아니라 어떻게 정확하게 내 데스크탑으로 올 수 있는걸까?

해당 역할을 수행하기 위해 NAT[Network Address Translation] 프로토콜의 도움이 필요하다. NAT 프로토콜은 인터넷으로 정보를 보낼 때는 사설IP를 공공IP로 바꾼다. 반면에 인터넷으로부터 온 정보를 받아드릴 때는 공공IP를 사설IP로 바꾼다. 예시를 보며 이해하자.

1. 내 데스크탑이 '192.168.0.2'라는 사설 IP를 부여 받았다. 인터넷을 통해 '떡볶이 사진'을 검색했다. 그러면 '떡볶이 사진'을 요청하는 메시지가 공유기에 전송된다. 이때 데스크탑의 메시지의 송신자[Sender]의 IP는 192.168.0.2이다.

2. NAT 프로토콜은 NAT 테이블에 사설IP인 192.168.0.2를 기록한 다음, 메시지에는 사설IP를 공공IP인 138.76.29.7로 바꾼 후 데이터를 인터넷을 통해 전송한다. 

3. 인터넷을 통해 검색된 정보가 도착했다. 해당 메시지는 공공IP 주소인 138.76.29.7을 찾아온 것이다.

4. NAT 프로토콜은 해당 메시지의 도착지를 공공IP에서 사설IP인 192.168.0.2로 바꾸어 전송한다.

 

 

만약에 클라이언트 측이 아니라 서버 측에서 해당 NAT 기능을 활용하고 있다면 어떤 일이 발생할까?

클라이언트는 정보를 요청하는 쪽이기 때문에 항상 출발지가 된다. 따라서 NAT는 출발지를 기록해 놓음으로써 클라이언트를 찾을 수 있다. 근데 서버는 다르다. 요청을 받는 쪽이기 때문에 항상 목적지(Destination)이 된다.

클라이언트는 목적지의 사설IP에 대한 정보를 모른다. 따라서 메시지를 보낼 때는 목적지의 공공IP를 적어 정보를 보낸다. 그러나 이는 공공IP이기 때문에 이를 받은 NAT 프로토콜은 어떤 기기한테 온건지 알 수가 없다. (사설IP는 메시지에 적혀있는게 아니니까!) 이러한 문제를 NAT Traversal Problem이라고 한다.

이를 해결하기 위해서는 '포트 포워딩 [Port Forwarding]' 방식을 사용한다. NAT는 하나의 LAN 안에 있는 모든 전자기기들에게 '고정적인 포트 번호'를 부여한다. 그리고 메시지를 받을 때는 이 포트번호를 기반으로 LAN안에 있는 기기를 찾을 수 있다.

 

이와 같은 NAT을 활용하여 얻을 수 있는 이점이 많지만 이에 따른 단점도 물론 존재한다. 이를 정리하면서 포스팅을 마치도록 한다.

- 장점

공공&사설 IP의 활용: 대량의 호스트가 적은 공공 IP를 공유할 수 있다 -> IP 주소 할당을 아낄 수 있다.
확장성 : LAN 내에 새로운 기기를 추가하는 것이 쉽다.
LAN 통제력 강화: 사설 네트워크이기 때문에 관리자는 관리를 쉽게할 수 있다.
ISP 선택의 유연성: ISP를 변경하는 것이 용이하다. 공인 IP만 바꾸면 된다.
보안 강화: 간접 계층을 추가하는 것이기 때문에, 외부 공격자는 내부 클라이언트를 직접 접근하여 공격하기 어렵다.

 

- 단점

복잡함: IP 주소를 끊임없이 바꿔야하기 때문에 시스템이 복잡해짐
보안 프로토콜 문제: IPsec와 같은 프로토콜은 헤더의 변조를 탐지하기 때문에 NAT에 의해 변경된 경우, 악성 데이터로 간주될 수 있다.
성능 감소: 주소 변환으로 인해 시간이 소요된다. 이때 헤더 체크섬을 다시 계산하는 추가 작업도 이뤄져야하기 때문이다.
특정 어플리케이션과의 호환성 문제가 있다. NAT 데이터그램의 IP헤더 필드만을 수정하고, 어플리케이션 데이터 영역은 수정하지 않기 때문에 특정 어플리케이션에서 호환성 문제가 발생할  있다.
클라이언트 접근 지원이 어렵다.  클라이언트에 공인 IP 주소가 없다는 것은 양날의 검이다. 해커로부터 호스트를 보호할  있지만 로컬 네트워크로 정당하게 접근하는 것도 어렵게 한다.
반응형