일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- rfc5508
- 풀이
- epoll_wait
- level trigger
- DOCKER-USER
- wrefresh
- epoll
- LOB
- Compiler
- cbpf
- packet filter
- mvwin
- C언어
- iptables
- architecture
- ioctl
- .nret core 배포
- .net core 7
- vtable
- doupdate
- packet flow
- BOF
- wnourefresh
- NAPT
- 취약점
- edge trigger
- ncurses
- REDIS
- Docker
- 어셈블리어
- Today
- Total
Tuuna Computer Science
ICMP를 위한 NAT의 동작 요구사항 with RFC 5508 본문
우리가 흔히 사용하고 있는 NAT(Network Address Translator ) 또는 NAPT(Network Address Translator)의 기본적인 매커니즘음 "인터넷의 다른 부분에서 동일 집합의 IP주소를 재사용하는 것을 허용하는 것이다. "
차후 언급할 NAT는 NAT와 NAPT를 통용하는 말이다.
즉, NAT를 사용하면 IPv4의 주소 고갈문제를 임시적으로 해결할 수 있는 대비책이다. NAT로 구성되어 있는 하나의 네트워크는 하나의 Public IP를 부여받고 내부에 Private IP를 부여하는 식으로 하나의 IP로 다수의 호스트를 구성할 수 있음을 의미한다.
기본적인 동작과정으로는 20.20.20.20을 가진 Public IP를 Router겸을 하는 NAT에 부여되고 192.168.0.X로 부여받은 호스트들이 존재한다고 할 때 192.168.0.1 호스트가 외부의 1.1.1.1 IP를 가진 호스트와 통신하고자 할 때 NAT는
(192.168.0.1, 6000) - (1.1.1.1, 80)의 튜플과
(20.20.20.20, 6000) - (1.1.1.1, 80) 튜플을 생성하여 매핑테이블을 만든다. 이때 사용하고자 하는 포트번호는 기본적으로 Port Preservation를 원칙으로 하지만 이미 다른호스트 및 어플리케이션에서 사용중인경우 다른 원칙을 사용한다. (자세한것은 UDP기준 RFC 4787를 참고)이런식으로 하나의 Public IP를 가지고도 동시에 여러 호스트들이 통신을 할 수 있게 하는것이다.
하지만 Private IP를 실제 존재하는 IP가 아니기에 NAT를 통해서 발신지 -> 수신지로의 패킷 전송은 가능하지만 그 역은 성립할 수 없다. 그렇기에 NAT는 통과하는 패킷들에 대해서 재작성이 필수로 요구된다. 그렇다면 ICMP패킷의 경우에는 전송계층이 아니기에 포트번호를 가질 수 없는데 어떤식으로 NAT내에 매핑테이블을 구성하고 어떻게 데이터그램의 페이로드를 재작성하고 매핑테이블의 값을 일치시킬까
먼저 ICMP프로토콜은 간단하게 설명하자면 종단 시스템간의 IP 패킷의 오류 및 정보를 제공하기 위해 만들어진 프로토콜이다.
ICMP에는 3가지의 종류가 존재하는데 2가지만 알아볼 예정이다.
RFC 5508을 참고하면 ICMP에는 Query Message와 Error Message가 있음을 알 수 있다. Query Message는 종단간의 정보를 제공하는 프로토콜이며 Error Message는 패킷의 전송간의 발생하는 오류를 포함하는 데이터그램을 제공하는 프로토콜이다.
Query Message의 경우 Query ID라는 것이 존재하여 이 Query ID를 이용하여 TCP/UDP의 포트번호처럼 NAT상에 매핑테이블을 활용한다. 이를 통해 발신지->수신지, 수신지->발신지간의 통신이 허용되게 된다.
Error Message에는 Query ID가 없기때문에 위같은 방법은 이용할 수 없다. 하지만 Error Message의 Datagram에는 오류를 일으킨 IP Datagram의 전체 혹은 일부가 들어있다. 이 IP Datagram에는 IP해더에 있는 source ip, destination ip, TCP/UDP헤더에 존재하는 source port, destination port가 존재하기 때문에 이를 통해 기존에 존재하는 매핑테이블을 활용할 수 있다. 만약에 존재하지 않는다면 NAT는 해당 패킷을 DROP할 수 있다.
그리고 Error Message의 경우 오류를 포함하고 있는 데이터그램(IP Header의 IP주소)가 포함되어 있기 때문에 NAT는 이를 매핑티에블에 있는 IP로 재작성을 진행해야 한다. 그래야 종단 호스트들이 메시지를 명확히 이해 할 수 있다.
'Network' 카테고리의 다른 글
Nginx Event Loop Architecture (0) | 2023.07.21 |
---|---|
NIC에서 수신한 패킷이 USERSPACE로 전송되는 과정 (0) | 2023.07.11 |
BPF(BSD Packet FIlter) 자세히 알기 (0) | 2023.07.11 |
epoll 관련 깨알 지식 (0) | 2023.03.16 |