VPC(Virtual Private Cloud) 구성
![](https://blog.kakaocdn.net/dn/WdyAw/btr1vrBDfQy/dF1VLFAZ9ExLboIYSakgJK/img.png)
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를 생성한 후 각 가용 영역에 하나 이상의 서브넷을 추가할 수 있다.
서브넷 구성
![](https://blog.kakaocdn.net/dn/lsDih/btr07z9wEQh/22meZzBdpkK8pxwjtWcVp0/img.png)
서브넷
- 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 네트워크 구성
![](https://blog.kakaocdn.net/dn/vcMtc/btr1nEhjKdk/K4RXr8kAGTRXXgfAqFHWVK/img.png)
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) 게이트웨이
![](https://blog.kakaocdn.net/dn/Sztpz/btr1bejJxP3/nvBKiSqSdWeadL6odH99j1/img.png)
- 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 옵션 세트
![](https://blog.kakaocdn.net/dn/dG184i/btr1dmV5FTW/QEdG7u4HolNcntaNr9LK1k/img.png)
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)와 온프레미스 네트워크를 연결할 수 있습니다.
![](https://blog.kakaocdn.net/dn/8Kiq0/btr1udwENvY/DxRZB1WGy21RQxgEqWe5T0/img.png)
- 고도로 확장 가능한 클라우드 라우터 역할을 한다.
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서버가 된다.
![](https://blog.kakaocdn.net/dn/lUSxW/btr1f2pubQf/A3Mnw3itXi6SFFCBXKchDk/img.png)
SSH 구성
![](https://blog.kakaocdn.net/dn/buybgr/btr1fPDJfmJ/FTssWQ7k5tkTuVwrzyHy6k/img.png)
보안그룹 설정
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로 접속할 수 있다.