NAT(Network address translation)?
이름 그대로 IP 를 다른 IP 로 바꿔주는 역할입니다. 대체적으로 사설 IP 를 공인 IP로 바꿔주는데 사용됩니다.
NAT를 왜 사용하느냐? 에 대한 답으로는 두가지 큰 이유가 있습니다.
1. IP 갯수 고갈의 한계점을 줄일 수 있다.
IPv4 체계의 IP는 결과적으로 부족해지고 있습니다. 이를 해결하기 위해서 IPv6 도 나온 상태고요. 하지만 NAT를 이용하면 다수의 사설 IP를 공인 IP로 줄여서 바꿔줄 수 있기 때문에 (N:1로 맵핑해줄 수 있음, 대부분 홈 라우터의 NAT가 N:1로 매핑됨, 현재로써 NAT를 사용하지 않는 곳은 없음) IP 고갈 문제를 줄여줍니다.
제 생각엔 NAT 덕분에 아마 제가 죽을때까지도 IPv6가 상용화되긴 어렵지 않을까 싶습니다.
2. 보안에 용이하다.
당연히 NAT 설정 해준다고 절대 공격받지 않는 건 아니지만 드러나선 안되는 사설 IP를 공인 IP로 바꿔주니 보안성을 향상시킬 수 있습니다. 따라서 내부에서는 외부의 IP 를 알지만 외부에선 내부의 IP 를 모르게 되기 때문에 보안성이 향상됩니다.
조금 더 나아가서 제가 티스토리의 서버에 웹 접속을 하고 싶다고 생각해보겠습니다. 하지만 위의 내용대로라면 티스토리의 네트워크 관리자는 보안을 위해 NAT 설정을 해논 상태입니다. 어라 ? 그럼 저는 내부 IP를 몰라 통신이 불가능 한데 어떻게 웹 요청을 보내죠? 그때 필요한게 port forwarding 입니다
예를 들어 192.168.1.2 를 210.110.10.3 으로 static nat 해준다고 가정합시다. 외부의 클라이언트는 192.168.1.2의 요청이 210.110.10.3으로 오고 210.110.10.3에게 응답을 보내도 송신지의 라우터에서 송신 과정에서 생성된 nat 테이블이 있기 때문에 정상적으로 통신될 것입니다. 하지만 외부의 클라이언트가 210.110.10.3으로 요청을 보낸다고 해서 192.168.1.2에게 요청이 도달하진 않습니다. 따라서 포트포워딩으로 210.110.10.3으로 오는 요청은 192.168.1.2로 보내도록 설정하면 외부에서는 210.110.10.3으로 요청을 보내도 정상적으로 192.168.1.2로 요청이 리다이렉트 되어 통신이 성립되는 것입니다.
CISCO에서는 static nat 설정 시 자동으로 port-forwarding이 됩니다.
설정법
설정으로 들어가기 전 몇가지 용어만 알고가면 좋을 것 같습니다.
1. inside local : nat 룰이 적용되는 local ip
2. inside global : nat 룰이 적용되는 local ip의 global ip
3. outside local : 공용망에서 도달 가능한 network
4. outside global : 공용망에서 할당된 주소 (사실 3번과 4번의 차이 잘 모르겠음, 보편적으론 같음)
static nat
ip nat inside source static [내부 ip] [외부 ip]
int s0/0/0
ip nat outside
#외부 포트에 nat 적용
int g0/0
ip nat inside
#nat 룰이 적용되는 내부 포트 선언
sh ip nat translation
#nat 룰 확인
sh ip nat s
#nat 성립 확인
static nat 는 정말 쉽습니다 위 명령어는 192.168.2.2 를 210.110.10.4 로 바꿔준다는 얘기입니다. 확인해볼까요?
스니퍼로 확인해본 결과 놀랍게도 SRC IP 를 보시면 210.110.10.4 로 변형돼서 들어온 것을 볼 수 있습니다. 나는 192.168.2.2 에서 보냈는데 말입니다.
dynamic nat
동적 NAT에서는 Global IP의 pool을 가지고 있다가 NAT요청이 있을 시에 동적으로 pool의 주소 중 하나를 할당해주고 통신이 끝나면 폐기합니다. 따라서 Static NAT와는 다르게 외부에서 내부로 연결되는 접점이 없기 때문에 외부에서 내부로 통신할 수 없습니다. 이 내용은 위에서도 말했다싶이 Port-forward라는 친구로 해결이 가능합니다.
ip nat pool [pool name] [start public ip] [end public ip] netmask ~
#ex) ip nat pool tistory 210.110.10.2 210.110.10.6 netmask 255.255.255.248
#nat 로 들어오는 ip 들을 210.110.10.2 부터 210.110.10.6 중에 하나로 매핑해준다
ip nat inside source list [number] pool [pool name]
access-list [number] permit ip any any
int [내부 port]
ip nat inside
# 여기서 들어오는 ip 들에 nat 룰을 적용시켜 준다는 의미
access-gr 100 in
int [외부 port]
ip nat outside
# nat 되어 나가는 port
access-gr 100 in
현재 192.168.2.3 에서 ping 을 보냈고 외부에서 어떻게 받았는지 sniffer 로 확인해보겠습니다
SRC IP 로 보시면 210.110.10.3 으로 변환되어 들어온 것을 확인할 수 있습니다.
그렇다면 위에서 말한 이론의 증명을 하자면 현재 동적으로 pool을 할당해줬기 때문에 210.110.10.3을 할당받은 것을 볼 수 있습니다. 그렇다면 Static nat처럼 내부로 port-forwarding이 될까요?
정답은 위에서 부터 계속 말했다 싶이 불가능합니다. 앞에서 말했던 이론이 증명이 되었습니다.
pat 설정
ip nat inside source list [number] pool [pool name] overload
#dynamic nat 설정에 overload 추가 시 pat 적용
pat는 간단하게 설명드리자면 동적 nat pool에 비해 nat를 사용하는 호스트들이 많다고 가정하면 당연히 겹치는 ip들을 사용하는 nat 테이블이 생길겁니다. 따라서 트래픽이 돌아올때 문제가 생길수도 있으므로 이런 상황을 해결하기 위해 nat 테이블에 port를 붙이는 겁니다.
Port-forward
ip nat inside source static [tcp/udp] [local ip] [port] [global ip] [port]
cisco 라우터에서는 static nat를 적용하면 포트 포워딩이 적용이 됩니다. 사실 그럼에도 적용해주는 이유는 dynamic nat에서는 앞에서도 설명했듯이 내부 네트워크를 알 수가 없기 때문에 구분해서 사용해줘야 하는 설정입니다.
static nat만 적용하고 외부에서 웹 요청과 DNS 쿼리를 보냈을 시 바로 port-forwarding이 되는 것을 확인할 수 있습니다. 작년 8월에 이 글을 작성할 때에는 port-forward와 nat는 완전히 분리된 개념으로 이해하고 있었는데 신선한 충격이네요.
'네트워크 > 네트워크 일반' 카테고리의 다른 글
Etherchannel (Link Aggregation) (0) | 2022.08.14 |
---|---|
VTP (2) | 2022.08.14 |
DHCP(cisco 라우터, Ubuntu server) (0) | 2022.08.13 |
물리 계층 특성 (0) | 2022.07.17 |
데이터 메세지 분할, 순서화, 캡슐화 (0) | 2022.07.17 |