프로젝트에서 아키텍쳐를 설계할 일이 있는데 VPC를 사용할 일이 있어 사용하면서 정리해보고자 글을 남긴다.
VPC를 알기 전에 VPN에 대해 먼저 알아야 한다. VPN은 한국어로 가상 사설망이다. 실제 사설망이 아닌 가상의 사설망인 것이다. 실제로는 같은 네트워크상에 있지만, 논리적으로는 다른 네트워크인 것처럼 동작하게 하는 것이 가상 사설망이다.
이를 통해 회사 내부가 아니더라도 외부에서 VPN을 통해 회사 망에 접속할 수 있고, 한국 네트워크 망에서 다른 외국의 네트워크 망에도 접속이 가능해진다.
VPC가 없을 때를 가정해보자.
VPC가 없다면 EC2 인스턴스들이 서로 거미줄처럼 연결되고 인터넷과 연결된다. 이런 구조는 복잡도를 엄청 끌어올릴뿐만 아니라 인스턴스가 새로 추가되면 해당 인스턴스를 추가해주기 위해 모든 인스턴스를 수정해주어야 한다. 인터넷 전용선을 다시 까는 것과 같다.
VPC를 적용하면 위 그림과 같이 VPC별로 네트워크를 구성할 수 있고 각각의 VPC에 따라 다르게 네트워크 설정을 줄 수 있다. 또한 VPC별로 독립된 네트워크처럼 작동하기 때문에 설정해주기가 편하다
VPC를 구축하기 위해서는 VPC의 IP 범위를 RFC1918이라는 사설 IP 대역에 맞추어 구축해야 한다. 사설 IP는 인터넷을 위해 사용하는 것이 아니라 우리끼리 사용하는 IP 주소 대역이다. 외부에서 접근할 수 있는게 아니라 내부에서 본인들끼리 사용이 가능한 IP이다.
VPC에서 사용하는 사설 아이피 대역은 다음과 같다.
10.0.0.0 ~ 10.255.255.255 (10/8 prefix)
172.16.0.0 ~ 172.31.255.255 (182.16/12 prefix)
192.168.0.0 ~ 192.168.255.255(192.168/16 prefix)
위 대역으로 설정한 IP 대역은 수정할 수 없으며 각 VPC는 하나의 리전에 종속된다. 각각의 VPC는 완전히 독립적이기 때문에 VPC간 통신을 원한다면 VPC 피어링 서비스를 고려해볼 수 있다.
실제로 VPC를 생성할 때 위 사진과 같이 172.16.0.0/24를 수동으로 입력하여 IP를 세팅해줄 수 있다.
VPC를 만들어 주면 위와 같이 정보를 확인할 수 있다. DNS 설정을 해주자
VPC 설정 편집에 들어가서 아래와 같이 DNS 설정을 모두 체크해주면 된다.
VPC를 만들었다면 서브넷을 만들어 주어야 한다. 서브넷은 VPC를 잘개 쪼개는 과정이다. VPC안에 있는 VPC보다 더 작은 단위이기 때문에 서브넷 마스크가 위 처럼 IP 범위가 더 작은값을 갖게 된다.
서브넷을 나누는 이유는 하나의 VPC에서 더 많은 네트워크망을 만들기 위해서이다.
각각의 서브넷은 가용영역안에 존재하며 서브넷안에 RDS, EC2와 같은 리소스들을 위치시킬 수 있다.실제로 서브넷을 설정해주자 서브넷을 생성할 때 선택한 대역의 VPC를 선택해주고, 서브넷을 나누어주면 된다. VPC를 172.16.0.0/24로 설정했고, 서브넷을 4개로 나누고 싶다면 아래 4개의 대역이 된다.
172.16.0.0/26
172.16.0.64/26
172.16.0.128/26
172.16.0.192/26
위 세팅값처럼 설정을 완료하면 아래 화면과 같이 4개의 서브넷과 해당 서브넷들이 VPC와 연결되어 있음을 확인할 수 있다.
설정은 위 처럼 완료하면 된다.
전체적인 구조는 위와 같다. 저기서 네트워크 요청이 발생하면 데이터는 우선 라우터로 향한다. 네트워크 요청은 각각 정의된 라우팅 테이블에 따라 작동한다. 위 그림에서 서브넷 A의 라우팅 테이블은 172.31.0.0/16 즉 VPC안의 네트워크 범위를 갖는 네트워크 요청은 로컬에서 찾도록 되어있다. 하지만, VPC를 벗어나 외부로 통하는 트래픽을 처리할 때에는 인터넷 게이트웨이라는 것을 사용해야 한다.
인터넷 게이트웨이는 VPC와 인터넷을 연결해주는 관문이다. 서브넷 B의 라우팅 테이블을 잘보면 0.0.0.0/0으로 정의되어 있다. 이 뜻은 172.31.0.0/16에 매칭되는지를 확인한 후 매칭되지 않는다면 외부로 나가는 트래픽이기 때문에 IGA(Internet Gate wAy)로 보낸다는 뜻이다.
여기서
퍼블릭 서브넷은 인터넷과 연결되어있는 것
이고,인터넷과 연결되지 않는 서브넷을 프라이빗 서브넷
이라 한다.AWS에서 위와 같이 게이트웨이를 생성해주면 된다. 게이트웨이를 생성해주고 VPC를 할당해 주어야 한다.
생성해준 게이트웨이에서 작업 드롭박스를 클릭한다.
그리고 나서 VPC에 해당 게이트웨이를 연결해주면 된다.
위에서 언급했던 라우팅 테이블을 세팅해주자. 우선 아래 사진처럼 라우팅 테이블을 생성해준다. 생성과 동시에 VPC IP 주소를 설정해주면 된다.
라우팅 테이블에서 인터넷 게이트웨이를 설정해준다. 외부에서 접근해야 하기 때문에 0.0.0.0/0을 오픈시켜 주고 위에서 생성해둔 인터넷 게이트웨이를 붙여준다.
설정을 완료하면 인터넷 게이트가 라우팅 테이블에 붙은 것을 확인할 수 있다.
이제 private subnet과 public subnet을 설정해주자. AWS에서는 이를 명시적 서브넷 설정이라고 한다.
여기서 만들어 둔 서브넷들 중에 외부에 노출 시킬 서브넷을 선택해준다. 외부에서는 해당 서브넷을 통해서만 접근이 가능하며 인터넷이 필요없는 서브넷들은 명시적 서브넷에 등록하지 않는 것이 좋다.
네트워크 ACL과 보안 그룹은 방화벽과 같은 역할을 하며 인바운드 트래픽, 아웃바운드 트래픽 보안정책을 설정할 수 있다. 보안그룹은 Stateful한 방식으로 동작하는 보안그룹은 모든 허용을 차단하도록 기본설정 되어있으며 필요한 설정은 허용해주어야 한다. 또한, 네트워크 ACL과 다르게 각각의 보안 그룹별로도 별도의 트래픽을 설정할 수 있으며 서브넷에도 설정할 수 있고, 각각의 EC2 인스턴스에도 적용할 수 있다.
네트워크 ACL과 보안그룹이 충돌한다면 보안그룹이 더 높은 우선순위를 갖게 된다.
NAT 게이트웨이는 프라이빗 서브넷이 인터넷과 통신하기 위한 아웃바운드 인스턴스이다. 프라이빗 네트워크가 외부에서 요청되는 인바운드는 필요없더라도 인스턴스의 펌웨어나 주기적인 업데이트가 필요하여 아웃바운드 트래픽만 허용되어야 할 경우가 있다. 이 때 퍼블릭 서브넷상에서 동작하는 NAT 게이트웨이는 프라이빗 서브넷에서 외부로 요청하는 아웃바운드 트래픽을 받아 인터넷 게이트 웨이와 연결하는 역할을 한다.