# NAT

## 개념

* Network Address Translation / Port Address Translation
* 네트워크 주소를 변환하는 기술
* 하나의 네트워크 주소를 다른 하나의 네트워크로 1:1 변환할 수 있다.
* PAT(=NAPT) 기술은 여러 IP를 하나의 IP로 변환한다. 단, 내부에서 외부로 출발하는 경우에만 가능하다.
* 공인 IP ↔ 사설 IP, 공인 IP ↔ 공인 IP, 사설 IP ↔ 사설 IP 변환 모두 NAT로 정의될 수 있다.
* IPv4 ↔ IPv6 변환하는 기술인 AFT도 NAT의 일종이다.

## 필요성

* IPv4 주소를 장비마다 할당할 경우 IP가 고갈되는 문제가 발생한다. 따라서 NAT을 이용해 외부에 공개해야 하는 서비스의 경우 공인 IP를 사용하고 외부에 공개할 필요가 없는 일반 사용자 PC나 종단 장비에는 사설 IP를 사용하도록 할 수 있다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FYrSrwwM1TfE67HsJp8XE%2Fimage.png?alt=media&#x26;token=ed9d8151-ac08-491b-b93d-3a593093fe16" alt=""><figcaption></figcaption></figure>

* 외부와 통신할 때 내부 IP를 다른 IP로 변환해 통신하면 외부에 사내 IP 주소 체계를 숨길 수 있다.
* 내부 네트워크에서 외부로 나가는 방향 통신은 허용하고, 외부에서 내부로 들어오는 통신을 방어하여 보안을 강화할 수 있다.
* IP 주소 체계가 같은 두 네트워크 간 통신을 가능하게 해준다. 즉, 사설 IP가 각 네트워크에서 중복되더라도 서로 다른 공인 IP로 변환되면 통신이 가능하다.
  * 카드, 금융 대외사와 서비스를 연동할 때 별도 전용 회선이나 암호화된 별도 네트워크를 사용하는데, 이 때 Double NAT 기술을 이용해 출발지와 도착지를 한 번에 변환해 IP 대역이 같더라도 통신이 가능하도록 해준다.
* 서버의 내부 IP 주소 변경 없이 회선과 IDC 사업자 이전이 가능하다. 단, 공인 IP 주소가 변경되므로 DNS 서비스나 NAT을 수행하는 네트워크 장비 설정은 변경해야 한다. 특정 사업자에 종속되지 않는 유연한 인프라를 구축할 수 있다.
* 네트워크 운영자 입장에서는 NAT으로 인해 직접적인 연결 관계를 파악하기 어려워 장애 탐지가 쉽지 않아졌다.

## NAT 동작 방식

* 사용자가 패킷을 전송할 때 출발지의 IP가 담기며, 출발지의 서비스 포트는 임의로 할당된다.
* NAT 장비는 NAT 정책에 따라 외부 네트워크와 통신 가능한 주소로 패킷에 있는 IP를 변경하고, 변경 전후의 IP 주소는 NAT 테이블에 저장한다.
* 패킷이 NAT 장비를 처음 통과할 때 NAT 테이블이 생성된다. 따라서 요청을 보낼 때에 대해서만 NAT 설정을 추가하면 응답을 받을 때에는 자동으로 NAT 테이블에 의해 NAT 과정이 수행된다.&#x20;
* NAT이 정상적으로 수행되려면 역 NAT과정이 함께 수행되어야 한다.
* 아래 예시의 경우 내부 IP인 10.10.10.10을 외부와 통신할 때 11.11.11.11로 변경해준다. 반대로 11.11.11.11로 요청이 들어왔다면 내부 IP인 10.10.10.10으로 변경해준다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FybBXD5InGHtJ9BTeCcWH%2Fimage.png?alt=media&#x26;token=1732f9d4-d8a7-4b61-b246-96dc57d08021" alt=""><figcaption></figcaption></figure>

## PAT 동작 방식

* 출발지에 있는 다수의 사용자가 동일한 공인 IP로 변환되어야 한다. 따라서 주소 변환 시 출발지의 IP와 포트가 변경된다. 다수의 사용자는 동일한 IP를 갖지만 서로 다른 포트로 구분될 수 있다.
* 변경된 정보는 NAT 테이블에 저장된다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FT5y3nfyw2iPKgt4hqGHm%2Fimage.png?alt=media&#x26;token=cbd93806-810c-43d3-b4ef-1ca2be4843b2" alt=""><figcaption></figcaption></figure>

* IP 주소 뿐만 아니라 서비스포트까지 함께 변경하는 형태로 NAT 테이블을 관리한다.
* 서비스 포트가 동시에 모두 사용중이거나 재사용 불가능한 경우 PAT이 동작하지 않으므로, 공인 IP 주소를 하나만 두는 게 아니라 풀(Pool)로 구성해야 한다.
* PAT IP가 출발지인 경우 NAT 테이블이 생성되고 응답에 대해 NAT 테이블을 참조할 수 있지만, PAT IP가 목적지인 경우 해당 IP가 어떤 IP에 바인딩되는지 NAT 테이블에 없으므로 알 수 없다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FO4pGZPeNjvovF4TEmtcM%2Fimage.png?alt=media&#x26;token=48029dc2-3b82-4d42-87d7-f04f6592fb6e" alt=""><figcaption></figcaption></figure>

## SNAT/DNAT

### S(source)NAT

* 출발지 주소를 변경하는 NAT
* 사설 네트워크에서 공인 네트워크로 통신할 때 많이 사용한다.
* 공인 네트워크에서 사설 네트워크로 응답을 보낼 때 어느 경로로 응답을 보낼 지 찾기 위해 사용된다. NAT 테이블을 통해 공인 네트워크 위치로 응답할 것이다.
* 공유기처럼 PAT을 사용하는 경우 해당된다.
  * 여러 랜선으로 연결된 사설 네트워크 단말에서 인터넷으로 요청을 보낼 때 PAT을 사용해 IP가 변환된다. 동일한 와이파이에 연결한 여러 단말에서 [https://whatismyipaddress.com/](https://whatismyipaddress.com/) 등 공인 IP Address를 쉽게 확인할 수 있는 사이트에 접근해보면 동일한 공인 IP가 나올 것이다.
* 사설 네트워크를 쓰는 경우에도, 동일한 대역폭을 사용하는 두 네트워크 간의 통신을 원활히 하기 위해 SNAT을 사용할 수 있다. 이 때에는 공인 네트워크 IP로 변환하지 않아도 된다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FnpKFqJz6TPoiaYRCvi6H%2Fimage.png?alt=media&#x26;token=72b1a6fe-18df-4562-b9ac-11fb536c5e09" alt=""><figcaption></figcaption></figure>

### D(destination)NAT

* 도착지 주소를 변경하는 NAT
* 로드밸런서의 Virtual IP에 사용자가 요청을 보내면, 로드밸런서에서는 요청을 서버의 실제 IP로 DNAT하여 내보낸다.
* 대외망과의 네트워크 구성에서 대외망에 NAT 장비를 두어 대외사의 IP를 특정 IP대역으로 변환한다. 따라서 사내에서는 어떤 대외사에 요청을 보내든 별도의 라우팅 설정이 필요없다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FPhN34cAzXyke3QzhnjAy%2Fimage.png?alt=media&#x26;token=c9d918d0-5c18-4c85-b73a-51df9cba8213" alt=""><figcaption></figcaption></figure>

## 동적/정적 NAT

### 정적 NAT

* 출발지와 목적지의 IP를 미리 매핑해 고정해둔 NAT
* 서비스 흐름에 따라 NAT 설정을 고려할 필요가 없다.
* 통신이 어느 방향에서 시작되더라도 같은 IP로 변환된다. 따라서 외부 -> 내부 통신인 경우 DNAT이 적용되고, 내부 -> 외부 통신인 경우 SNAT이 적용된다.

### 동적 NAT

* NAT을 수행할 때 IP를 동적으로 변경하는 것
* 출발지와 목적지가 미리 정의되지 않으므로 다수의 IP로 구성된 풀(pool) 또는 범위(range)에서 하나를 사용하게 된다.
* 이 때 NAT 테이블은 특정 시간동안만 유지되어 일정 시간 동안 통신이 없으면 다시 사라지므로(timeout), 서비스 흐름을 고려해 적용해야 한다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FmLdRVhVvwhqLjqoXj11i%2Fimage.png?alt=media&#x26;token=53d2c389-4dd6-4401-9072-ceb67aabc3ce" alt=""><figcaption></figcaption></figure>
