[AWS] VPC Bastion Host 구성하기(Private Subnet 접근)
Bastion Host란?
AWS 리소스 구성 후 관리자가 VPC 외부에서 Private Subnet에 접근해야 하는 경우 직접 접근할 수 있는 방법이 없는데, 이 때 Bastion Host를 거쳐서 Private Subnet에 접근할 수 있습니다.
즉, Bastion Host란 Public Subnet에 위치하며, Private Subnet과의 통신을 도와주는 대리인이라고 할 수 있습니다. 좀 더 전문적으로 표현하면 내부와 외부 네트워크 사이에서 일종의 게이트 역할을 수행하는 호스트입니다.
관리자가 Bastion Host으로 SSH 연결을 한 후 Bastion Host에서 Private Subnet의 Host에 SSH 연결을 하는 형태로 Private Subnet에 접근할 수 있습니다. SSH 연결을 수행해야 하기 때문에 Bastion Host 또한 Public Subnet에 위치하는 EC2 Insatnce 입니다.
Bastion Host 구성하기(실습)
다음 그림과 같이 AWS 리소스를 구성해보도록 하겠습니다. 예시이기때문에 최대한 간단한 형태로 구성하도록 하겠습니다.
Bastion Host를 구성하기 위한 구성 순서는 다음과 같습니다.
- VPC 및 Public/Private Subnet 구성
- Public EC2(Bastion Host) 생성
- Private EC2 생성
- Bastion Host를 통해 Private EC2 접근
1. VPC 및 Public/Private Subnet 구성
Bastion Host 구성을 위해서 우선 VPC와 Subnet을 구성하도록 하겠습니다.
먼저 VPC서비스에 접속하여 통해 VPC를 생성합니다. 실제 서비스 구성에서는 라우팅 테이블, Network ACL 등을 설정하는 것이 좋지만 본 포스팅에서는 생략하겠습니다.
다음과 같이 설정합니다.
설정 내용 | 값 |
생성할 리소스 | VPC, 서브넷 등 |
이름태그 | tmpVPC |
IPv4 CIDR 블록 | 10.0.0.0/16(중복 시 10.0.0.1/16, 10.0.0.2/16 등 다른 값도 무관) |
IPv6 CIDR 블록 | IPv6 CIDR 블록 없음 |
테넌시 | 기본값 |
가용 영역(AZ) | 1(그 이상의 값도 상관없음) |
퍼블릭 서브넷 수 | 1 |
프라이빗 서브넷 수 | 1 |
NAT 게이트웨이 | 없음 |
VPC 엔드포인트 | 없음 |
2. Public EC2(Bastion Host) 생성
이제 위의 VPC 리소스를 바탕으로 AWS Management Console에 접속하여 EC2 인스턴스를 생성하겠습니다.
우선 Bastion Host의 역할을 수행할 Public Subnet의 EC2 인스턴스를 생성합니다. 구성은 다음 내용을 참고합니다.
설정 내용 | 값 |
AMI | 원하는 AMI 사용 (본 포스팅에서는 Amazon Linux 2 AMI) |
인스턴스 유형 | 원하는 유형 사용 (본 포스팅에서는 t2.micro) |
네트워크 | tmpVPC |
서브넷 | subnet-public (실제 이름에서는 tmpVPC-subnet-public) |
퍼블릭 IP 자동 할당 | 비활성화 |
스토리지 | 원하는 형태 |
태그 | 키 : Name 값 : public-ec2(혹은 bastion-host) |
보안그룹(새 보안 그룹 생성) | 보안 그룹 이름 : public-sg 보안 그룹 구성 : 하단 그림 참고 |
Public Subnet이기 때문에 보안 그룹의 경우 SSH와 모든 ICMP(IPv4)를 추가합니다.
인스턴스 검토 후 시작 단계에서 새 키페어를 생성합니다. 이름은 public-ec2-keypair라고 하겠습니다. 키 페어 다운로드를 통해 현재 사용하고 있는 컴퓨터에 잘 보관해 두셔야 합니다.
Bastion Host를 위한 Public EC2의 구성은 완료되었습니다.
3. Private EC2 생성
Private EC2는 다음과 같이 구성합니다.
설정 내용 | 값 |
AMI | 원하는 AMI 사용 (본 포스팅에서는 Amazon Linux 2 AMI) |
인스턴스 유형 | 원하는 유형 사용 (본 포스팅에서는 t2.micro) |
네트워크 | tmpVPC |
서브넷 | subnet-private(실제 이름에서는 tmpVPC-subnet-private) |
퍼블릭 IP 자동 할당 | 활성화 |
스토리지 | 원하는 형태 |
태그 | 키 : Name 값 : private-ec2 |
보안그룹(새 보안 그룹 생성) | 보안 그룹 이름 : private-sg 보안 그룹 구성 : 하단 그림 참고 |
Private Subnet이기 때문에 SSH와 ICMP 포트를 Public EC2의 보안 그룹으로 부터만 허용 가능하도록 다음과 같이 구성합니다.
(소스의 값에 해당하는 것이 위에서 생성한 보안 그룹의 ID)
마찬가지로 인스턴스 검토 후 시작 단계에서 새 키페어를 생성합니다. 이름은 private-ec2-keypair라고 하겠습니다. 키 페어 다운로드를 통해 현재 사용하고 있는 컴퓨터에 잘 보관해 두셔야 합니다.
이제 위 그림과 같이 구성을 완료하였습니다.
4. Bastion Host를 통해 Private EC2 접근
제대로 구성했다면 두 개의 인스턴스가 실행중일 것이고 public-ec2(Bastion Host 역할)에만 퍼블릭 IPv4 주소가 할당되어 있을 것입니다.
Private EC2에 접근하고 싶어도 Public IP 주소가 없기 때문에 방법이 없습니다.
이 때 Bastion Host로 SSH 접속을 한 후 다시 Bastion Host에서 Private EC2로 SSH 접속을 하면 Private EC2에 접속이 가능합니다.
키 파일 복사 및 Bastion Host(Public EC2) 접속
우선 private-ec2-keypair.pem 파일을 public-ec2로 복사해야합니다. Private-ec2에 SSH 접속하기 위해서는 private-ec2의 키페어가 필요하기 때문입니다.
$ scp -i public-ec2-keypair.pem ./private-ec2-keypair.pem ec2-user@<public-ec2의 퍼블릭 IPv4 주소>:~/
|
cs |
그 후 public-ec2-keypair.pem 파일의 권한을 600으로 바꿔줍니다. (바꾸지 않으면 키페어의 퍼미션이 너무 공개되어 있다는 오류가 나타납니다.)
$ chmod 600 public-ec2-keypair.pem
|
cs |
그 후 pem 파일을 이용하여 public-ec2의 퍼블릭 ip주소로 다음과 같이 접속해봅니다.
$ ssh -i public-ec2-keypair.pem ec2-user@<public-ec2의 퍼블릭 IPv4 주소>
|
cs |
원할하게 접속된 것을 확인할 수 있습니다. 그리고 ls 명령어를 통해 파일 리스트를 확인하면 private-ec2-keypair.pem 파일이 있을것입니다.
Bastion Host에서 Private EC2로 접속
Bastion Host에서도 마찬가지로 private-ec2-keypair.pem 파일의 권한을 600으로 바꿔줍니다.
$ chmod 600 private-ec2-keypair.pem
|
cs |
그 후 pem 파일을 이용하여 private-ec2의 프라이빗 ip주소로 다음과 같이 접속해봅니다. Private IP 주소는 AWS 콘솔에서 확인 가능합니다.
$ ssh -i private-ec2-keypair.pem ec2-user@<private-ec2의 프라이빗 IPv4 주소>
|
cs |
정상적으로 구성된 경우 Bastion Host에서 Private EC2로 접속되어 터미널 상에서 마치 Private EC2로 직접 연결된 것 처럼 보이게 될 것입니다.
Host PC -> Bastion Host -> Private EC2로 SSH 연결된 것이지만 터미널 상에서는 Private EC2의 Bash 출력되기 때문에 직접 연결한 것 처럼 Private Subnet의 EC2를 사용하면 됩니다.
이처럼 Bastion Host를 이용하면 Private Subnet의 인스턴스에 관리자가 접속할 수 있습니다.
AWS에서 Bastion Host를 구성하고 이를 이용하여 Private Subnet의 인스턴스에 접속해보았습니다.