Network

[Network] NAT

Yoonsoo Park 2024. 8. 28. 18:02

 가장 상용화되어있는 IPv4는 2011년 인터넷 주소 관리기구인 IANA에서 더 이상 IPv4이 없다고 선언할 정도로 IP주소 고갈의 문제에 직면해 있다. 약 43억 개의 IP를 사용할 수 있고, 실질적으로 할당 가능한 약 37억 개의 공인 IP주소가 있음에도 전 세계적으로 디지털화가 빠르게 진행됨에 따라 수요를 따라갈 수 없게된 것이다. IPv4 고갈 문제에 대한 대안으로 IPv6가 오래전 개발되었지만, 호환성 문제, 네트워크 장비 업데이트 문제 등 현실적인 원인들로 느리게 상용화가 되고 있는 상황이다. 하지만 현실에서 수없는 PC와 네트워크 장비들이 쏟아져 나옴에도 불구하고, IP 부족을 체감하기는 쉽지 않다. 이유가 뭘까?

이번 포스트에서는 IPv4의 부족 문제를 보완해주는 기술 NAT에 대해 설명하려고 한다. 

 

 

1. 사설 IP공인 IP부터 알아보자!

 NAT에 대해 언급하기 전에 IP 주소 체계를 구성하는 공인 IP, 사설 IP, Bogon IP에 대해 먼저 간략하게 언급하고 시작하자. 먼저, 가장 생소할 Bogon IP IP 주소들 중 공식적으로 할당되지 않은 주소와 루프백, 멀티캐스트와 같이 특수 용도로 예약된 주소들이다. 뒤에 설명할 사설 IP도 Bogon IP의 하위 집합이라고 볼 수 있다. 자세한 내용은 아래의 표를 참고하자.

Bogon IP

 

 사설 IP(Private IP)가정, 사무실 등 로컬 네트워크 즉, 내부망에서만 사용 가능한 IP 주소를 의미한다. 사설 IP는 내부망마다 중복해서 사용가능하기 때문에 인터넷과 같은 공인망에서는 사용할 수 없다. IP주소가 같다면 라우팅이 불가능하기 때문이다. 때문에 공인망에서 사용되는 공인 IP의 경우 인터넷 내에서 고유하게 할당된 주소이다. 공인 IP를 통해서만 인터넷 상에서 서버 또는 다른 네트워크 장비로 직접 접근할 수 있다. 그렇다면 평소에 우리가 사용하는 PC의 경우 사설 IP만 부여되어 있는데 어떻게 다른 PC와 통신이 가능한걸까? 그것을 가능하게 해주는 것이 NAT이다. 

 

 

2. 사설에서 공인으로, 공인에서 사설로, NAT

 NAT(Network Address Translation)내부망에서만 사용 가능한 사설 IP를 이용해 인터넷과 같은 공인망으로 패킷을 보낼 때, 사설 IP를 공인 IP로 변환해주는 기술이다. NAT는 IPv4 고갈 문제만을 해결하기 위한 것은 아니다. 정보 보안의 관점에서 보면, 자사의 내부망과 외부망을 연결할 경우, NAT를 이용해 내부망의 IP주소를 숨길 수 있기 때문에 외부로부터의 직접적인 접근이나, 악의적인 공격으로부터 논리적으로 분리가 가능하다. 이러한 NAT의 동작 방식을 마치 '가면 무도회'와 같다고 하여 IP Masquerading 방식이라고 한다. 아래 그림을 통해 NAT의 동작 방식을 더 자세히 알아보자. 

 

 

 

사설 IP가 부여된 PC1(192.168.0.1/24)에서 라우터를 통해 구글 서버(8.8.8.8)로 패킷을 보내려고 한다. 패킷의 출발지 IP는 사설 IP이기 때문에 해당 패킷이 인터넷으로 나가기 위해서는 출발지 IP를 공인 IP로 반드시 변환해야 한다(일반적으로 ISP쪽에서 사설 IP를 차단하는 정책을 설정한다). 그러므로 라우터에서 NAT를 통해 출발지 IP를 라우터에 부여된 공인 IP로 변환하는 작업을 수행한 후 패킷을 내보내게 된다.

 

 여기서 NAT의 과정을 보면, 먼저 라우터가 라우터에 들어온 패킷의 IP 정보(1)를 확인한다. 확인한 IP 정보에 해당되는 정책이 있는지 확인하고, 있다면 패킷의 사설 IP를 라우터 인터페이스의 공인 IP로 변환(2)하여 인터넷으로 내보낸다. 동시에 변환한 기록을 NAT 테이블에 저장한다. 수신한 패킷이 구글 서버에 정상적으로 도착했다면, 구글 서버는 응답을 보낼 것이다.  구글 서버에서 출발한 응답 패킷(3)은 라우터의 공인 IP (100.100.100.2)을 이용해 라우팅되기 때문에 라우터의 인터페이스에 도착하게 되고, 인바운드된 패킷에 대해 라우터는 NAT 테이블을 확인하여 목적지 IP의 공인 IP를 다시 PC1의 사설 IP로 변환해준다(4).

 

(1) S IP: 192.168.0.1
D IP: 8.8.8.8
(2) S IP: 100.100.100.2
D IP: 8.8.8.8
(3) S IP: 8.8.8.8
D IP: 100.100.100.2
(4) S IP: 8.8.8.8
D IP: 192.168.0.1

 

 

위와 같이 공인 IP와 사설 IP가 1:1로 변환되는 경우를 Static NAT라고 한다(서버에서 주로 사용하는 방법). 또한 해당 방법과 유사하게, 여러 PC의 사설 IP와 라우터에 부여된 공인 IP가 n:m 형태로 변환되는 것을 Dynamic NAT라고 한다. 두 방법의 문제점은 동시에 통신 가능한 장비가 공인 IP의 개수로 제한된다는 것이다. 예를 들어보자, 만약 아래와 같이 라우터에는 공인 IP가 하나만 부여되어 있고, PC 2 곳에서 동시에 구글 서버에 접근하려고 한다면 무슨 일이 일어날까?

 

Static NAT로 동시에 통신이 불가능한 경우

 

 

PC1에서 수신한 패킷과 PC2에서 수신한 패킷의 IP주소는 아래와 같이 모두 동일할 것이다. 그렇다면 구글 서버 입장에서는 PC1과 PC2에서 수신한 패킷을 식별할 수 없다는 문제가 발생한다.

 

NAT 후 패킷의 IP 주소 S IP: 192.168.0.1
D IP: 8.8.8.8

 

 

이런 문제를 해결할 수 있는 방법이 PAT(Port Address Translation 또는 NPAT, NAT-PAT)다. PAT는 IP 주소와 포트 번호를 같이 사용하여 패킷을 구분하는데, NAT 시 변환되는 공인 IP는 동일하지만, 포트 번호를 임의로 부여해 식별이 가능하게 하는 것이다. 

 

PAT

 

PAT를 사용하면 PC1과 PC2에서 동시에 구글 서버에 패킷을 보냈을 때, 라우터에서 NAT가 된 후 부여된 공인 IP는 동일하지만 포트 번호가 다르기 때문에 구글 서버에서 식별이 가능하다. 또한 구글 서버가 보낸 응답에 대해서도 NAT 테이블을 확인한 후 최초에 수신된 PC로 패킷을 보낼 수 있다. 

 

*라우터, L4 스위치와 같이 NAT를 수행하는 네트워크 장비들을 세션(Session) 장비라고 하고, NAT를 실시한 기록을 세션 테이블(Session Table)이라고 지칭한다.  

 

*관점에 따라 Source IP를 변환하면 Source IP NAT(SNAT), Destination IP를 변환하면 Destination IP NAT(DNAT)이라고 지칭한다. 뒤에 언급할 inside와 outside 설정과는 무관하다. 

 

 

3. 실습을 통해 NAT, PAT 설정법을 알아보자!

 문제 상황: NAT를 통해 2대의 PC가 동시에 외부 네트워크에 있는 Server와 웹 서비스(HTTP)가 되게 하라.

*기본적인 라우팅 설정에 대한 설명은 생략하겠다.  

실습 Topology

*주의할 점은 사설 IP를 이용해서 직접 다른 네트워크의 사설 IP로 패킷을 보내면 안된다. 

공인 IP가 서울시 ~아파트 같은 주소라면, 사설 IP는 '윤수 집'과 같은 한 동네에서만 알 수 있는 주소이다. 만약 우편의 주소를 '윤수 집'이라고 쓴다면 갈까? 당연하게도 가지 않는다. 그렇다면 서버로는 어떻게 접근할 수 있을까? 일반적으로 서버는 공인 IP를 직접 부여해준다. 만약 사설 IP가 부여된 서버라면, 라우터의 공인망 쪽 인터페이스 IP와 서버의 IP를 Static NAT로 변환해줘야 한다. 그렇게 된다면 공인 IP를 달고 라우터로 들어온 패킷의 목적지 IP를 Static NAT를 통해 서버의 IP로 변환하게 되고, 패킷을 서버까지 전달해주게 되는 것이다(동일한 방식으로 응답 과정도 이뤄진다).  

 

먼저 Static NAT, Dynamic NAT와 PAT를 설정하는 명령어들을 알아보자.

 

1) Static NAT 명령어

R1(config)# ip nat inside source static [사설 IP] [공인 IP]
NAT 정책 설정
R1(config)# interface [inside interface]
R1(config-if)# ip nat inside
Interface 역할 결정 - 사설 네트워크를 연결하는 인터페이스 → inside
R1(config)# interface [outside interface]
R1(config-if)# ip nat outside
Interface 역할 결정 - 공용 네트워크를 연결하는 인터페이스 → outside

 

2) Dynamic NAT 명령어

R1(config)# access-list 1 permit [사설 IP] [wildcard mask]
조건 정책 설정 - 사설 IP 네트워크 정보 → ACL
R1(config)# ip nat pool [name] [start IP] [end IP] netmask [subnet mask]
조건 정책 설정 - 변환에 사용할 공인 IP 정보 → Pool
R1(config)# ip nat inside source list [ACL number] pool [pool name]
NAT 정책 설정
R1(config)# interface [inside interface]
R1(config-if)# ip nat inside
Interface 역할 결정 - 사설 네트워크를 연결하는 인터페이스 → inside
R1(config)# interface [inside interface]
R1(config-if)# ip nat inside
Interface 역할 결정 - 공용 네트워크를 연결하는 인터페이스 → outside

 

3) PAT 명령어

R1(config)# access-list 1 permit [사설 IP] [wildcard mask]
조건 정책 설정 - 사설 IP 네트워크 정보 → ACL
R1(config)# ip nat pool [name] [start IP] [end IP] netmask [subnet mask]
조건 정책 설정 - 변환에 사용할 공인 IP 정보 → Pool (NAT 정책 설정에서 interface로 지정할 경우 생략)
R1(config)# ip nat inside source list [ACL number] pool [pool name] overload
NAT 정책 설정(두개 중 하나만 설정) - 공인 IP Pool 을 이용해 설정 할 경우
R1(config)# ip nat inside source list [ACL number] interface [outside interface]
NAT 정책 설정(두개 중 하나만 설정) - 공인 IP가 설정된 Interface를 이용해 설정 할 경우
R1(config)# interface [inside interface]
R1(config-if)# ip nat inside
Interface 역할 결정 - 사설 네트워크를 연결하는 인터페이스 → inside
R1(config)# interface [outside interface]
R1(config-if)# ip nat outside
Interface 역할 결정 - 공용 네트워크를 연결하는 인터페이스 → outside

 

4) NAT 정보 확인 명령어

R1# show ip nat translations
NAT Table 변환 정보 확인 - NAT 변환 기록
R1# show ip nat statistics
NAT 설정 정보 확인
R1# debug ip nat
NAT 동작과정 확인
R1# clear ip nat translation *
NAT Table 변환정보 초기
R1# clear ip nat translation inside [global IP] [local IP] outside [global IP] [local IP]
NAT Table 한 항목 삭제

 

 이제 실습으로 돌아와 라우터0에서 PC0, PC2로부터 오는 패킷의 사설 IP를 공인 IP로 변환할 수 있게 PAT 설정을 해보자. 토폴로지 상 부여된 공인 IP가 하나이므로 인터페이스를 통해 변환해 패킷을 내보내는 것으로 설정해보자.

 

R1(config)# access-list 1 permit 192.168.0.0 0.0.0.255 - 사설 네트워크 주소 설정

R1(config)# interface fastethernet 0/0 - 내부 설정
R1(config-if)# ip nat inside

R1(config)# interface fastethernet 0/0 - 외부 설정
R1(config-if)# ip nat outside

R1(config)# ip nat inside source list 1 interface serial 0/0/0 overload - 인터페이스 통해 변환

 

 

 

힘들지만 오늘도 해낸 나를 위한 한 마디.

"기적을 일으키는 것은 신이 아닌 자신의 의지이다. 기적을 바라기만 하고, 아무 노력도 하지 않는 이들에게 기적은 일어나지 않는다.", 김연아

'Network' 카테고리의 다른 글

[Network] 고가용성, 이중화, 로드 밸런싱  (0) 2024.09.08
[Network] LAN 이중화 - STP  (0) 2024.09.05
[Network] Network ACL  (0) 2024.08.26
[Network] 라우팅 프로토콜 실습 및 설정법  (1) 2024.08.24
[Network] VLAN, L3 Switch  (0) 2024.08.23