# VPC

VPC 란, 클라우드 환경에서의 "가상사설망" 이라고 생각할 수 있다.

공인 IP 를 사용해 내부망을 구성하게 되는데, VPC 내부에서 다시 서브넷으로 분리된다. 이 서브넷은 공개/비공개 서브넷으로 분류할 수 있다.

서브"넷" 이기 때문에 각자에게 IP 를 부여해야 한다. 원천 IP 는 하나이고 이것을 **CIDR** 라는 기준으로 **서브넷 마스킹을 해서 프라이빗 IP 를 부여**하게 된다. 예를 들면 134.25.35.17 이라는 공인 IP 를 가지고 있다고 하면, CIDR 이 134.25.35.0/24 일 경우 서브넷 A 는 134.25.35.3 이런 식으로 부여받는다.

{% hint style="info" %}

#### &#x20;CIDR 규칙

IPv4 클래스 주소를 클래스(Class A,B,C) 없이 표기하는 규칙이다.

마스킹 되지 않는 공인 IPv4 주소의 비트 수를 '/' 뒤에 붙인다.

ex) 134.25.35.0/24 (8\*3 bit = 24)
{% endhint %}

VPC 는 내부에 **가상 라우터**를 가지고 있고, 가상 라우터는 라우팅 테이블을 확인해서 **내부 서브넷의 통신을 처리**한다. 라우팅 테이블은 기본적으로 1개가 존재하고, 커스텀 라우팅 테이블을 각 서브넷에 붙일 수 있다.

AWS 는 리전에서 자체적으로 1개의 Default VPC 를 기본 자원과 함께 설치한다. 사용자 VPC 는 리전별 최대 5개 까지 사용이 가능하다.

서브넷은 리전 별 가용영역 하나에 속해있다. 예를 들어 서울 리전의 경우 ap-northease-2(a\~d) 중 하나에 서브넷이 속해 있어야 한다.

서브넷은 **네트워크 ACL** 을 통해 1차적으로 네트워크 트래픽 방화벽 역할을 수행하고, 인스턴스로 들어오는 트래픽은 **보안 그룹(Security Group)** 이 방화벽 역할을 수행한다. 네트워크 ACL 이나 보안 그룹이나, 인바운드(서버로 들어오는 방향) 및 아웃바운드(서버에서 인터넷으로 나가는 방향) 라는 트래픽 방향 정책을 설정할 수 있고, **각기 다르게 동작하므로** 적절한 설정이 필요하다.

VPC 가 통신하는 네트워크 트래픽 Log 를 확인하려면 **Amazon VPC Flow Logs** 서비스로 확인할 수 있다.

{% hint style="info" %}
**보안 그룹과 네트워크 ACL 의 상태**

**보안 그룹은 Stateful 방식으로 동작한다.** 이는 만약 인바운드로 Request 트래픽이 통과했다면, 아웃바운드로 Response 를 전달할 때는 인바운드 트래픽을 기억하고 있기 때문에 그냥 Bypass 한다.

**네트워크 ACL 은 Stateless 방식으로 동작한다.** 이는 인바운드, 아웃바운드 트래픽이 매번 정책을 확인한다는 뜻으로, 인바운드로 통과되었다고 하더라고 아웃바운드에서 허용되어 있지 않으면 반환이 막히게 된다.
{% endhint %}

{% hint style="info" %}
**보안 그룹과 네트워크 ACL 의 정책 테이블**

보안 그룹, 네트워크 ACL 은 모두 **위→아래 방향**으로 테이블에서 허용 여부를 확인한다는 공통점이 있다.

보안 그룹은 정책 테이블의 마지막 행 까지 일치하지 않으면 암묵적으로 트래픽을 거부한다.

네트워크 ACL 은 트래픽 거부 정책이 기본적으로 맨 아래에 명시적으로 정의되어 있고, 명시적으로 정의되어 있어야한다.
{% endhint %}

VPC 에서 서브넷이 외부 인터넷과 통신하려면 반드시 **인터넷 게이트웨이**를 거쳐야 한다. 여기서 IP 를 변환해서 통신하려면 **NAT 게이트웨이 라는 VPC 요소**를 거쳐 인터넷 게이트웨이를 통해 인터넷과 통신할 수 있다.

<details>

<summary>NAT 게이트웨이 (Network Address Translation Gateway) ***</summary>

프라이빗 서브넷 => 외부 인터넷으로 통신하기 위해, 프라이빗 IP 를 퍼블릭 IP 로 변환하는 장치

커스텀 라우팅 테이블에는 \[0.0.0.0/0, NAT Gateway] 로 등록하여 사용한다.

**주의할 사항은 NAT Gateway 는 Public Subnet 에 위치해야 한다.**

</details>

### **VPC 내에 속한 서브넷이 외부 인터넷에 데이터를 전송하는 흐름**

1. 서브넷이 데이터(IP, 즉 L3 계층 이기 때문에 **패킷을 의미**)를 가상 라우터에 전달
2. 가상 라우터는 **라우팅 테이블**을 확인하고 인터넷 게이트웨이에 데이터를 전달
3. 인터넷 게이트웨이는 인터넷 구간과 통신
4. **"프라이빗” 서브넷의 경우 가상 라우터에 데이터를 전달하여도 인터넷 게이트웨이로 전달하지 않는다.**

### VPC 설정 예시

{% @mermaid/diagram content="flowchart
A\[VPC 10.0.0.0/16]---B{가상 라우터}
B ---|네트워크 ACL| C1\[서브넷 A 10.0.1.0/24]
B ---|네트워크 ACL| C2\[서브넷 B 10.0.2.0/24]
J1(커스텀 라우팅 테이블) --> C1
J2(커스텀 라우팅 테이블) --> C2
C1 ---|보안 그룹| F\[인스턴스]
C2 ---|보안 그룹| G\[인스턴스]
B <-->H(인터넷 게이트웨이 0.0.0.0/0)<-->I(인터넷)
B <-->H1(NAT 게이트웨이 0.0.0.0/0)<-->H" %}

VPC 가 사용하는 IP 가 10.0.0.0/16 일때 이 내부에 서브넷 마스크는 3 Octet (x.x.0.0\~x.x.256.256) 부터 이므로 서브넷 IP 는 10.0.x.x/24 이상 이다.

0.0.0.0/0 으로 라우팅 테이블에 추가하면, 게이트웨이로 통신 한다는 뜻이다. (인터넷, NAT 공통, 타깃 설정)

10.0.0.0/16 으로 라우팅 테이블에 추가하면, VPC 로컬 통신이 가능하다는 뜻이다.

**프라이빗 서브넷은 인터넷과 직접 통신을 할 수 없기 때문에, 통신 타겟을 인터넷 게이트웨이가 아닌, NAT 게이트웨이로 설정해야 한다.**
