본문 바로가기

MISC..

Cisco IOS 상에서의 NAT 설정

안녕하세요. 민형애비입니다.
몇년 전 연재를 시작하고 아직까지 마무리 안되는 아주 게으른 애비입니다.
그래서 이제는 단편으로다가 글을 쓸려고 합니다. ㅋㅋ

오늘의 내용은 Cisco IOS에서의 NAT 설정에 관한 것입니다.
CCNA를 준비하고 계신 분들에게 아주 도움이 될 듯하네요... (CCIE, CCNP등은 스킵하셔도...)

NAT는 다들 아시다시피, Network Address Translation, 즉 IP 주소 변환입니다.
제가 나름대로 이해하고 있는바로는, routing 정보가 서로 공유되지 않는 다른 두 네트웍사이의 통신을 가능하게 하는 테크닉이라 할 수 있겠습니다.
가장 대표적인게 사설망과 공인망 사이에서 통신을 가능하게 하는 것입니다.
하지만 망이 커지면 커질수록 보안등의 목적으로 인해 사설망과 사설망 사이 또는 공인망과 공인망 사이에서도 NAT가 사용되어질 경우가 있습니다.

Cisco IOS상에서 NAT 설정을 위해서 아래의 4가지 용어에 대해 아셔야 합니다. 
 1. Inside
 2. Outside
 3. Local Address
 4. Global Address


앞서 말했듯이 NAT는 routing이 되지 않는 두 네트웍 사이에서 이루어지는데요, 이 두 네트웍 중 하나를 Inside, 그리고 다른 하나를 Outside라고 합니다.
그리고 Inside 망에서 사용되는 IP주소를 Local Address라고 하고 Outside망에서 사용되는 주소를 Global Address라고 합니다.

위의 굵은 글씨를 진정 이해하고 계신 독자들은 NAT의 용자이십니다. (다들 용자신가???)


위의 그림에서,
  - 1.1.1.1은 Inside Local Address이고,
  - 2.2.2.2는 Outside Local Address이고,
  - 3.3.3.3은 Inside Global Address이고,
  - 4.4.4.4는 Outside Global Address입니다.

이걸 여러가지로 풀어서 얘기가 가능한데요....
 - 1.1.1.1은 Inside에서 1.1.1.1로 인식이 되고 Outside에서는 3.3.3.3으로 인식이 된다.
 - 4.4.4.4는 Outside에서 4.4.4.4로 인식이 되고 Inside에서는 2.2.2.2로 인식이 된다.

똑같은 내용을 얘기하자면...
  - Inside에서 4.4.4.4로 가기 위해서는 2.2.2.2로 Packet를 보내야 한다.
  - Outside에서 1.1.1.1로 가기 위해서는 3.3.3.3으로 Packet을 보내야 한다.

참 쉽죠잉???
자 이제 NAT router 설정들어갑니다.

NAT router는 서로 통신이 되지 않는 두 망과 연결이 되어 있는데요 편의상 Fa0/0이 Outside와 연결이 되어 있고 Fa0/1이 Inside와 연결이 되어 있다고 칩시다.

첫번째로 NAT를 행하기 위해서 interface가 어디와 연결이 되어 있는지 정해야 합니다.

Router(config)# interface FastEthernet0/0
Router(config-if)# ip nat outside !--> Fa0/0이 outside와 연결이 되어 있다고 설정

Router(config)# interface FastEthernet0/1
Router(config-if)# ip nat inside !--> Fa0/1이 inside와 연결이 되어 있다고 설정


그 다음 본격적인 주소 변환 (NAT) 설정에 들어갑니다.
IOS상에서 IP NAT command는 아래와 같이 크게 3가지가 가능합니다.

ip nat inside source A(Local) B(Global)
ip nat outside source C(Global) D(Local)
ip nat inside destination E(Global) F(Local)

Note) ip nat outside destination은 없습니다. 자세한 얘기는 나중에...


처음에 명령어를 접하고 제대로 이해하는데 오랜 시간이 걸렸습니다. (사실 어제 이해했습니다. 처음 접한건 한 5년전???)

우선 첫번째로 이해하셔야 할 것은 어떤 일로 인해 다른 일이 항상 발생한다면 어떤 일에 대한 명령어만 존재하고 다른 일에 대한 명령어는 생략된다는 것입니다. (내가 쓰고도 어렵구먼...)

ip nat inside source A B라는 명령어는 inside에서 들어오는 packet의 source IP를 A에서 B로 변환하라는 것인데, 당연히 return packet에 대해서 destination IP를 B에서 A로 변환해야 합니다. (위의 그림을 보세요.)
즉 ip nat outside destination이라는 명령어는 불필요한 거죠. (존재하지도 않습니다.)

그 다음 ip nat outside source C D라는 명령어는 outside에서 들어오는 packet의 source IP를 C에서 D로 변환하라는 것인데, 이것도 마찬가지로 return packet에 대한 주소 변환은 따로 명령어 없이 행해집니다.

그럼 ip nat inside destination이라는 명령어는 inside에서 들어오는 packet의 destination 주소를 변환하는 것이냐? 라고 생각할 수 있는데요. 아닙니다.
바로 윗글에서 보시듯 ip nat outside source라는 명령어가 inside에서 들어오는 packet의 destination 주소 변환을 내포하고 있습니다.
ip nat inside destination은 다른 의미로 해석이 될 수 있는데요....
outside에서 inside로 나가는 packet에 대해 destination 주소 변환을 말합니다.
그러니깐 outside에서 inside로 나가는 packet의 destination 대상은 inside에 존재합니다. (주소 변환의 대상)
이 명령어는 내부망에 있는 장비들에 load balancing을 가능하게 합니다.

만약 ip nat outside destination이라는 명령어가 존재한다면 inside에서 들어오는 packet에 대해 outside에서 존재하는 destination에 대한 주소 변환이라고 정의를 내릴 수 있겠죠? (잘 생각해보시면 남의 집 일이라 별 쓰잘데기 없는 명령어임을 아실 수 있습니다.)

제가 말주변이 없다보니 설명은 장황한데 이해가 제대로 될지, 아님 더 헷갈리게 한건 아닌지 모르겠네요.
여하튼 계속 설명을 진행하겠습니다.

시스코의 IP Addressing and Services Command Reference에 의하면,

ip nat inside source는 아래와 같이 정의되어 있습니다.

ip nat inside source
{list {access-list-number | access-list-name} | route-map name} {interfacetype number | pool name} [mapping-id map-name | vrf name] [overload]
또는,
ip nat inside source {static {local-ip global-ip} [vrf name] [extendable] [no-alias] [no-payload] [route-map] [redundancy group-name] | {esp local-ip interface type number}}
또는,
ip nat inside source {static {tcp | udp local-ip local-port global-ip global-port} [extendable] [no-alias] [no-payload]
또는,
ip nat inside source {static {network local-network global-network mask} [extendable] [no-alias] [no-payload]

복잡해 보여도 아주 간단합니다.
위의 글처럼 어쨌든 ip nat inside source A(Local) B(Global), 즉 inside에서 들어오는 packet의 source IP를 Local 주소인 A에서 Global 주소인 B로 바꾸라는 얘기입니다.
Local 주소의 형태로는 access-list,  route-map, static IP, static IP:Port, static network등이 가능하고,
Global 주소의 형태로는 pool, static IP, static IP:Port, static network등이 가능합니다.

위의 그림에서 inside의 1.1.1.1을 3.3.3.3으로 변환하는 명령어는 아래와 같습니다.
Router(config)# ip nat inside source static 1.1.1.1 3.3.3.3

같은 맥락으로 outside의 4.4.4.4를 2.2.2.2로 변환하는 명령어는 아래와 같습니다.
Router(config)# ip nat inside source static 4.4.4.4 2.2.2.2
 
이제 별것도 아닌 NAT에 대한 설명이 막바지로 치닫고 있습니다.
자 이제 실전 들어갑니다.

다들 아시다시피 시스코 command가 가끔은 인간의 말과 다를 때가 아주 많습니다.
NAT command도 그 중 하나인데요....

보통 요구 사항은 아래와 같습니다.

1. 내부망은 192.168.1.1/24으로 구성되어 있다.
Router(config)# interface FastEthernet0/1
Router(config-if)# ip address 192.168.1.1 255.255.255.0
Router(config-if)# ip nat inside  


2. 외부망은 210.64.128.121/29의 IP를 가지고 default gateway는 210.64.128.126이다.
Router(config)# interface FastEthernet0/0
Router(config-if)# ip address 210.64.128.121 255.255.255.248
Router(config-if)# ip nat outside
Router(config)# ip route 0.0.0.0 0.0.0.0 210.64.128.126

3. 내부망에서 인터넷을 이용할때 210.64.128.121 IP를 이용해야 한다.
Router(config)# ip nat inside source list 10 interface FastEthernet0/0 overload
Router(config)# ip access-list 10 permit 192.168.1.0 0.0.0.255
--> access-list 10에 해당하는 주소가 inside로 들어오면 Fa0/0의 IP로 변환하라는 뜻이고 다수의 내부 IP를 하나의 공인IP로 변환해야 하기때문에 port를 이용하여 하나의 공인 IP를 overload하라는 옵션을 줘야 함. (이것을 PAT, Port Address Translation이라고 함.)

4. 외부망에서 210.64.128.121로 내부망에 있는 192.168.1.100 RDP Access가 가능해야 한다.
Router(config)# ip nat inside source static tcp 192.168.1.100 3389 210.64.128.121 3389 extendable 
--> 이게 솔직히 제일 헷갈릴수도 있는데, 인간의 말을 그대로 번역하면 외부망의 destination 주소인 210.64.128.121을 내부망의 주소인 192.168.1.100으로 변환해라, 즉 ip nat outside destination으로 해야하지 않나 생각하실겁니다. 일단 존재하지 않는 명령어이구요... 위의 장황한 설명을 바탕으로 하면 ip nat outside destination은 inside에서 outside로 나가는 packet에 대한 변환입니다. 내부든 외부든 들어오는 packet에 대한 변환은 destination이 아니라 source입니다. 그리고 내부망에 존재하는 장비의 주소 변환은 inside, 외부망에 존재하는 장비의 주소변환은 outside입니다. (밑줄 쫙~~) 그럼 위의 인간의 말을 다시 정리하면 외부에서 들어오는 패킷에 대한 내부 장비 주소(inside source) 변환입니다.
그리고 3번 요구사항에서 이미 PAT로 210.64.128.121를 사용하고 있기 때문에 3389 포트에 대해 다른 NAT rule을 적용하기 위해서는 extendable이라는 옵션으로, 말 그대로 NAT table을 확장해야 합니다.

5. 210.64.128.122는 내부망에 192.168.1.200으로 port forwarding되야 한다.
Router(config)# ip nat inside source static 192.168.1.200 210.64.128.122

오늘 글에서 가장 중요한 사항은 아래와 같습니다.
  1. 내부망에 존재하는 장비에 대한 주소변환을 위해서는 ip nat inside source
  2. 외부망에 존재하는 장비에 대한 주소변환을 위해서는 ip nat outside source
  3. 내부에 있는 장비들의 load-balancing을 위해서는 ip nat inside destination (쏠라구구님의 블로그 http://mongu2.blog.me/140031273918 에서 4. NAT 부하분산을 참조하세요.)

별거 아닌 NAT 포스팅을 끝까지 읽어주셔서 감사합니다. (덴장... 블로그 포스팅에 2시간이나 걸리구먼...)

그럼 이만.