본문 바로가기
CS/네트워크

Cisco NAT의 기초 개념

by alpacadabra 2023. 10. 29.

<용어 정리>

정적 NAT

정적 규칙에 의한 1:1 변환

 

동적 NAT

IP Pool에서의 유동적인 대여

 

Inside

NAT 장비를 기준으로 하는 내부 네트워크

 

Outside

Inside에 대응하는 외부 네트워크

 

Local (IP)

Inside 네트워크에서 사용하는 IP

 

Global (IP)

Outside 네트워크에서 사용하는 IP

 

Inside Local

Inside 호스트가 Inside에서 사용하는 IP

= Inside 호스트의 원래 IP

 

Outside Local

Outside 호스트가 Inside에서 사용하는 IP

= Outside 호스트의 변환된 IP

 

Inside Global

Inside 호스트가 Outside에서 사용하는 IP

= Inside 호스트의 변환된 IP

 

Outside Global

Outside 호스트가 Outside에서 사용하는 IP

= Outside 호스트의 원래 IP

 

Twice NAT

Outside Local과 Outside Global은 일치하는 경우가 대부분이지만, 그렇지 않으면 위 그림처럼 Twice NAT일 확률이 높다.

Twice NAT은 Source와 Destination을 동시에 변경하는 NAT를 말한다.


<정적 NAT 설정>

1. 인터페이스 설정

Inside와 Outside 인터페이스를 지정하여 네트워크를 구분한다.

 

2. 변환 규칙 설정

정적 NAT의 규칙은 2가지가 있다.

 

inside source static {Local} {Global}

패킷의 Source가 Inside Local이면 Inside Global로 변환

+ 패킷의 Destination이 Inside Global이면 Inside Local로 변환

 

풀어서 설명하자면 Inside에서 Outside로 나가는 패킷의 Source가 Local이면 Global로 변환한다는 뜻이다.

 

outside source static {Global} {Local}

패킷의 Source가 Outside Global이면 Outside Local로 변환

+ 패킷의 Destination이 Outside Local이면 Outside Global로 변환

 

명령어는 단방향이지만 실제론 양방향으로 동작하므로 반대 방향인 inside destination과 outside destination은 필요치 않다.

허나 아래에서도 언급하겠지만 동적 NAT에서 inside destination은 부하 분산을 위해 쓰이곤 한다.


<동적 NAT 설정>

1. 인터페이스 설정

 

2. ACL 설정

ACL을 통해 동적 NAT가 적용될 IP를 식별한다.

필요에 따라 확장 ACL도 사용할 수 있다.

 

3. 공인 IP Pool 설정

대여 가능한 공인 IP의 범위를 지정한다.

 

4. 변환 규칙 설정

ACL(적용 전)과 Pool(적용 후)을 연결하여 동적 NAT 규칙을 설정한다.

 

inside source list {Local-ACL} pool {Global-Pool}

패킷의 Source가 ACL을 통과하는 Inside Local이면 Pool의 Inside Global로 변환

-> 패킷의 Destination이 NAT 테이블에 존재하는 Inside Global이면 Inside Local로 변환

 

outside source list {Global-ACL} pool {Local-Pool}

패킷의 Source가 ACL을 통과하는 Outside Global이면 Pool의 Outside Local로 변환

-> 패킷의 Destination이 NAT 테이블에 존재하는 Outside Local이면 Outside Global로 변환

 

동적 NAT는 정적 NAT와 달리 세션의 수립 순서에 주의해야 한다.

패킷이 Outbound되어 NAT 테이블에 동적 레코드가 추가되기 전까지는 상대 측에서 먼저 통신을 시도할 수 없기 때문이다.

 

inside destination list {Global-ACL} pool {Local-Pool}

패킷의 Destination이 ACL을 통과하는 Inside Global이면 Pool의 Inside Local로 변환

-> 패킷의 Source가 NAT 테이블에 존재하는 Inside Local이면 Inside Global로 변환

 

아래의 공식 문서에 자세히 설명되어 있는데, 요약하자면 가상 서버의 주소를 ACL로 설정하고 실제 서버의 주소를 Pool로 설정하면 라운드 로빈 방식으로 부하 분산이 이루어진다고 한다.

 

동적 NAT를 사용하여 서버 로드 밸런싱 구성

이 문서에서는 Cisco IOS® 라우터에서 NAT(Network Address Translation) 서버 로드 밸런싱 TCP 트래픽을 구성하는 방법에 대해 설명합니다.

www.cisco.com


<예제>

출처: Flackbox.com

외부에서 INT-S1에 접속할 수 있도록 정적 NAT를 설정해보겠다.

 

R1#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R1(config)#int f0/1
R1(config-if)#ip nat inside
R1(config-if)#int f0/0
R1(config-if)#ip nat outside
R1(config-if)#ex
R1(config)#ip nat inside source static 10.0.1.10 203.0.113.3
R1(config)#do debug ip nat
IP NAT debugging is on

내부 서버의 주소인 10.0.1.10을 203.0.113.3으로 변환하도록 설정하고 디버깅을 활성화하였다.

 

SP1#ping 203.0.113.3

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 203.0.113.3, timeout is 2 seconds:
..!!!
Success rate is 60 percent (3/5), round-trip min/avg/max = 0/0/0 ms

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

R1(config)#
*Mar 01, 02:38:48.3838: NAT: s=203.0.113.1, d=203.0.113.3->10.0.1.10 [2]
R1(config)#
*Mar 01, 02:38:50.3838: NAT: s=203.0.113.1, d=203.0.113.3->10.0.1.10 [3]
*Mar 01, 02:38:50.3838: NAT*: s=10.0.1.10->203.0.113.3, d=203.0.113.1 [1]
R1(config)#
*Mar 01, 02:38:50.3838: NAT: s=203.0.113.1, d=203.0.113.3->10.0.1.10 [4]
*Mar 01, 02:38:50.3838: NAT*: s=10.0.1.10->203.0.113.3, d=203.0.113.1 [2]
R1(config)#
*Mar 01, 02:38:50.3838: NAT: s=203.0.113.1, d=203.0.113.3->10.0.1.10 [5]
*Mar 01, 02:38:50.3838: NAT*: s=10.0.1.10->203.0.113.3, d=203.0.113.1 [3]

Echo Request를 받은 R1은 Dst를 203.0.113.3에서 10.0.1.10으로 변환하였다.

또한 Echo Reply의 Src를 10.0.1.10에서 203.0.113.3으로 변환하였다.

이렇듯 정적 NAT는 명령어가 단방향이어도 실제로는 양방향으로 작동한다는 것을 알 수 있다.

 

R1#show ip nat translations
Pro  Inside global     Inside local       Outside local      Outside global
icmp 203.0.113.3:10    10.0.1.10:10       203.0.113.20:10    203.0.113.20:10
icmp 203.0.113.3:11    10.0.1.10:11       203.0.113.20:11    203.0.113.20:11
icmp 203.0.113.3:12    10.0.1.10:12       203.0.113.20:12    203.0.113.20:12
icmp 203.0.113.3:9     10.0.1.10:9        203.0.113.20:9     203.0.113.20:9
---  203.0.113.3       10.0.1.10          ---                ---

show ip nat translations 명령어를 통해 테이블을 확인할 수 있다.

이번에는 동적 NAT를 통해 내부 PC가 외부 서버를 이용할 수 있도록 하겠다.

 

R1(config)#int f1/0
R1(config-if)#ip nat inside
R1(config-if)#
*Mar 01, 09:41:32.4141: ip_ifnat_modified: old_if 2, new_if 0

R1(config-if)#ex
R1(config)#access-list 1 permit 10.0.2.0 0.0.0.255
R1(config)#ip nat pool MyPool 203.0.113.4 203.0.113.12 netmask 255.255.255.240
R1(config)#ip nat inside source list 1 pool MyPool
*Mar 01, 09:43:42.4343: pnat_add_dynamic_cfg: id 1, flag 5, range 0

*Mar 01, 09:43:42.4343: oolstart 203.0.113.4 poolend 203.0.113.12

*Mar 01, 09:43:42.4343: d 1, flags 0, domain 0, lookup 0, aclnum 1 ,

*Mar 01, 09:43:42.4343:        aclname 1 , mapname idb 0

내부의 10.0.2 서브넷을 ACL로 정의하고 Inside Global인 203.0.113.4 ~ 12를 Pool 범위로 지정하여 동적 NAT를 설정하였다.

 

이후 PC1과 EXT-S1이 서로에게 Ping을 시도하였을 때, PC1에서는 Ping이 성공했지만 EXT-S1에서는 그렇지 않았다.

동적 NAT는 정적 NAT와는 다르게 외부로부터의 세션 수립을 허용하지 않는 모습이다.

댓글