VPC(Virtual Private Cloud) 구성
VPC
- 사용자 AWS 계정 전용 가상 네트워크. AWS 클라우드에서 다른 가상 네트워크와 논리적으로 분리되어 있다.
- VPC의 IPv4 주소 범위는 CIDR(Classless Inter-Domain Routing) 블록 형태로 지정해야 한다.
- VPC에 여러 개의 IPv4 CIDR 블록과 여러 개의 IPv6 CIDR 블록을 선택적으로 연결할 수 있다.
- 허용된 IPv4 CIDR 블록 크기는 /16 ~ /28 넷마스크이다.
- RFC 1918 규격에 따라 프라이빗 IPv4 주소 범위에 속하는 CIDR 블록을 지정하는 것이 좋다. 규격에 벗어나는 IP 주소를 사용하게 된다면 외부와 통신할 때 자신의 IP와 같은 IP에는 접근할 수 없기 때문이다.
- 10.0.0.0/16
- 172.31.0.0/16
- 192.168.0.0/20
- VPC는 리전의 모든 가용 영역(Availability Zone)에 적용된다. VPC를 생성한 후 각 가용 영역에 하나 이상의 서브넷을 추가할 수 있다.
서브넷 구성
서브넷
- VPC의 IP 주소 범위. EC2 인스턴스와 같은 AWS 리소스를 서브넷으로 실행할 수 있다.
- 라우팅 테이블에서 IGW로 라우팅이 되어 있는 서브넷을 Public 서브넷, 아닌 것을 Private 서브넷이라고 한다.
- Public과 Private 서브넷을 나누는 이유
- 보안의 기본 원칙인 “외부에 노출되는 면적 최소화”를 만족시키기 위함.
- 관리자가 네트워크 리소스와 트래픽을 보다 효과적으로 관리할 수 있으므로 네트워크 성능과 확장성이 향상될 수 있다.
- public 서브넷의 트래픽은 VPC의 IPv4 주소 범위(172.28.0.0/16)는 local로, 나머지 모든 트래픽(0.0.0.0/0)은 IGW(Internet GateWay)로 가도록 Route Table을 구성하고, private 서브넷의 트래픽은 오로지 VPC의 주소 범위(172.28.0.0/16)가 목적지인 트래픽만 가도록 Route Table을 구성한다.
IGW (Internet GateWay)
인터넷을 통해 public 인스턴스에 IGW를 통해 접근이 가능하게 된다.
- public IP 주소는 IGW에서 일대일 NAT(Network Address Translation)을 통해 해당 인스턴스의 private IP 주소로 변환이 되고 그 반대의 경우도 동일하다.
네트워크 ACL
- 네트워크 ACL은 서브넷 수준에서의 인바운드 또는 아웃바운드 트래픽을 허용하거나 거부할 수 있다.
- 명시적으로 선언하지 않을 경우, 기본 네트워크 ACL이 서브넷에 연결된다.
- Stateless이므로 인바운드 트래픽에 대한 응답은 아웃바운드 트래픽에 대한 규칙을 따르고 그 반대에도 마찬가지다.
- 하나의 서브넷이 여러 개의 네트워크 ACL을 갖는 것은 불가능하며, 하나의 네트워크 ACL에 여러 개의 서브넷을 연결할 수는 있다.
최종 AWS 네트워크 구성
Amazon EC2 인스턴스
AWS 클라우드에서 사용하는 확장 가능 컴퓨팅 리소스.
- 각각의 서브넷에 인스턴스를 생성하는데 public 서브넷의 인스턴스는 public IP 주소를 할당하여 외부에서도 접근 가능하도록 하고 private 서브넷은 private IP 주소만 사용하도록 구성한다.
- public IP 주소는 AWS의 public IP 주소 풀에서 가져오는 것이므로 인스턴스와 연결이 끊어지고 다시 연결한다면 같은 public IP 주소를 보장하지 않는다.
- 고정된 IP 주소를 사용하기 위해서는 EIP(Elastic IP)를 사용하여 IP를 생성하여 해당 인스턴스에 연결시켜야 한다.
- 인스턴스에 SSH로 접근하기 위해 생성 시 키 페어를 생성하거나 이미 생성한 키 페어를 해당 인스턴스에서 사용하겠다고 설정해야 한다.
- 인스턴스가 처음 부팅될 때 시작 시 지정한 퍼블릭 키가 Linux 인스턴스의 ~/.ssh/authorized_keys 위치에 배치된다.
- RSA or ED25519 방식의 암호화를 사용한 키 페어를 생성함.
- 로컬에서 .pem or .ppk 형식의 private key를 생성할 수 있다.
보안그룹
인스턴스 생성 시 보안그룹(Secure Groups)을 지정할 수 있는데, 보안그룹이란 일종의 방화벽의 역할을 하며, 인바운드, 아웃바운드 트래픽에 대해 Rule을 적용할 수 있다.
- 보안그룹은 Stateful 하기 때문에, 인바운드 트래픽에 대한 응답은 아웃바운드 트래픽 규칙과 상관없이 응답할 수 있고, 그 반대에도 마찬가지다.
- 소스 또는 대상을 보안그룹 ID로 지정할 시 해당 보안그룹과 연결된 리소스의 private IP 주소를 기반으로 하는 트래픽에 대해 허용하는 것을 의미.
NAT(Network Address Translation) 게이트웨이
- Private 호스트에서 인터넷을 사용할 일이 있다면 NAT 게이트웨이를 통해 인터넷과 연결할 수 있다.
- NAT 게이트웨이 연결 유형
- 퍼블릭 : 프라이빗 서브넷의 인스턴스는 퍼블릭 NAT 게이트웨이를 통해 인터넷에 연결할 수 있으며, 원치 않는 인바운드 연결을 수신할 수 없다. 다른 VPC 또는 On-premise 네트워크에 연결하는 것도 가능하다.
- 프라이빗 : 프라이빗 서브넷의 인스턴스는 프라이빗 NAT 게이트웨이를 통해 다른 VPC 또는 On-premise 네트워크에 연결할 수 있다. 프라이빗 NAT 게이트웨이를 사용하여 인터넷 게이트웨이에 연결할 수 있지만, NAT GW -> IGW으로 라우팅 하는 경우, IGW가 트래픽을 삭제한다.
- NAT 게이트웨이는 인스턴스의 소스 IP 주소를 NAT 게이트웨이의 IP 주소로 변환하고, 인스턴스에 응답 트래픽을 전송할 때, NAT 게이트웨이의 주소를 원래 소스 IP 주소로 다시 변환한다.
- NAT 게이트웨이는 사용할 수 있는 시간당 요금 + 처리하는 데이터 당 요금이 부과된다.
더보기
private 서브넷을 IGW랑 연결하면 인터넷을 할 수 있는데, 왜 굳이 NAT Gateway를 써야 할까?
- IGW는 private IP를 public IP로 또는 그 반대로 NAT하여 단순히 인터넷으로 송수신하는 역할밖에 없다.
- NAT 게이트웨이는 IGW의 역할을 수행하지만, 수신 트래픽에 대해 다른 인스턴스로의 전달을 제한할 수 있다는 차이점이 있다. 예를 들어, 프라이빗 서브넷의 라우팅 테이블을 NAT 게이트웨이로 라우팅하도록 설정하고 해당 서브넷의 인스턴스는 인터넷과 통신이 가능한데, 송신 트래픽에 대한 수신 트래픽은 받을 수 있지만, 원치 않는 수신 트래픽을 받는 경우 NAT 게이트웨이에서 트래픽을 제한하기 때문에 안전하게 해당 인스턴스를 보호할 수 있다.
DHCP 옵션 세트
VPC의 EC2 인스턴스가 가상 네트워크를 통해 통신하는 데 사용하는 네트워크 구성 그룹.
- DNS, 도메인 이름, NTP 서버, NetBIOS 이름 서버, NetBIOS 노드 유형을 설정할 수 있다.
- 기본 옵션으로 사용하면 Amazon에서 제공하는 DHCP 서버와 DNS 서버를 사용한다.
- Amazon DNS 서버는 Amazon Route 53 Resolver 서버이다.
- VPC의 특정 서브넷 또는 가용 영역 내에 상주하지 않고, VPC IPv4 네트워크 범위를 기초로 2를 더해 예약된 IP 주소에 위치한다. 예를 들어, 10.0.0.0/16 네트워크 상의 Amazon DNS 서버는 10.0.0.2에 위치.
- VPC에서 예약된 주소 (ex. 10.0.0.0/16)
- 10.0.0.0 : 네트워크 주소
- 10.0.0.1 : VPC의 라우터 주소
- 10.0.0.2 : VPC의 DNS 서버 주소
- 10.0.0.3 : AWS에서 앞으로 사용하려고 예약한 주소
- 10.0.255.255 : VPC의 브로드캐스트 주소
- VPC에서 예약된 주소 (ex. 10.0.0.0/16)
- IPv4 CIDR 블록이 여러 개인 VPC의 경우, 기본 CIDR 블록을 기준으로 한다.
- VPC의 특정 서브넷 또는 가용 영역 내에 상주하지 않고, VPC IPv4 네트워크 범위를 기초로 2를 더해 예약된 IP 주소에 위치한다. 예를 들어, 10.0.0.0/16 네트워크 상의 Amazon DNS 서버는 10.0.0.2에 위치.
AWS Transit Gateway
VPC, VPN 연결 및 AWS Direct Connect 연결 간에 트래픽을 라우팅 하는 중앙 허브 역할을 하는 전송 게이트웨이를 사용하여 Virtual Private Cloud(VPC)와 온프레미스 네트워크를 연결할 수 있습니다.
- 고도로 확장 가능한 클라우드 라우터 역할을 한다.
AWS VPN(Virtual Private Network)
AWS에서 제공하는 VPN 서비스.
- VPC와 On-premise 네트워크를 연결하는 데 사용될 수 있다. (Site-to-Site VPN)
- IPsec 프로토콜을 사용해 VPN 연결을 한다.
- IPsec(Internet Protocol security) 프로토콜
- 통신 세션의 각 IP패킷을 암호화하고 인증하는 안전한 인터넷 프로토콜(IP) 통신을 위한 인터넷 프로토콜 Suite.
- Internet Protocol 네트워크 사이에 통신을 지키기 위해 암호의 보안 서비스를 사용.
- VPN이란?
- 공개 네트워크를 통해 통신할 때 바깥사람들에게 드러내지 않고 통신할 목적으로 사용되는 사설 통신망.
- VPN Client를 통해 패킷이 암호화되어 VPN 서버에 도착하여 인터넷을 통해 패킷이 전달되는데 이때 소스 IP가 VPN서버가 된다.
SSH 구성
보안그룹 설정
Private 호스트는 외부에서 직접적인 접근이 불가능하기에 접근하기 위해서는 Bastion 호스트를 통해서 접근해야 한다.
- Bastion 호스트와 연결된 보안그룹
- 보안그룹의 인바운드 규칙으로 22번 포트로 오는 모든 TCP 트래픽을 허용하도록 설정.
- Private 호스트와 연결된 보안그룹
- 보안그룹의 인바운드 규칙의 소스 대상으로 Bation Host와 연결된 보안 그룹을 지정하고 22번 포트로 오는 모든 TCP 트래픽을 허용.
Jump Proxy를 이용한 Private 호스트 접근
ssh -i "mungiyo-bastion.pem" -J ec2-user@3.37.234.22 ec2-user@172.28.202.30
ssh config 설정
- ssh로 접속 시 매번 명령어를 직접 작성하여 접근하는 것은 불편하기 때문에 ssh_config 설정을 해준다.
# ~/.ssh/config
Host bastion
HostName <bastion_host>
User ec2-user
IdentityFile ~/.ssh/<ec2_pem_file>
Host test
HostName <private_host>
User ec2-user
ProxyJump bastion
IdentityFile ~/.ssh/<ec2_pem_file>
- ssh bastion ssh test를 통해 해당 Host로 접속할 수 있다.