AWS 월드의 통치자에게 외화 달러를 지불하고 나만의 사유지 (VPC)를 구성하였고, 구획을 나누고(subnet) 프라이빗한 깊숙한 곳(private subnet)에 소중한 보물(EC2, RDS)들을 가득 채워넣었다. 튼튼한 담장과 성벽(Security Group, NACL)을 구축하여 외부의 위협으로부터 보물을 지킬 수 있을 것 같다.
하지만, 예상치 못한 치명적인 문제가 발생했다. 성 안의 보물들을 점검하고 관리해야 하는 이 땅의 주인이자 설계자인 나 자신조차 이 프라이빗한 공간에 들어갈 방법이 없어진 것이다. 너무나 완벽하게 외부 도로(Internet Gateway)와의 연결을 차단한 나머지, 내가 들어갈 길마저 사라져 버렸다.
<aside>
Q. Public Subnet에 접근을 하면 같은 VPC 안에 있는 Private Subnet에 다 도달할 수 있는거 아니야? 그러면 igw를 통해서 Public Subnet에 들어오면은 Private Subnet으로 접근 가능하지 않아?
</aside>
→ “VPC 내부에 있는 서브넷끼리는 서로 통신할 수 있는 길이 뚫려 있는 것이 맞지만, 외부(인터넷)에서 들어온 해커나 트래픽이 퍼블릭 서브넷을 ‘통과’해서 프라이빗 서브넷으로 직행할 수는 없다.”
이유1: 목적지 주소 (공인 IP)가 아예 없다.
IGW를 통해 외부에서 트래픽이 들어오려면, 반드시 도착지점의 공인 IP를 알고 그 주소를 찾아와야 한다. Bastion Host는 공인 IP가 존재하지만, Bastion Host의 보안그룹이 특정 IP의 접근만 허용하도록 되어있다. 프라이빗 서브넷의 자원(RDS, EC2)은 공인 IP 자체가 아예 없다. 사설 IP의 존재 자체를 알 방법이 없기 때문에, 애초에 도착지를 프라이빗 서브넷의 RDS로 지정해서 뚫고 들어오는 것 자체가 물리적으로 불가능.
Q. VPC 내부 길이 다 연결되어있고, 내가 private subnet에 있는 인스턴스의 사설 IP주소를 알고 있으면 로드밸런서를 통해(public subnet에 존재하는) 해당 인스턴스에 접근할 수 있는거 아니야? 그렇다면 굳이 Bastion Host가 필요 없는거 아니야?
결론은 사설 IP를 알고 있어도 igw나 로드밸런서는 그 주소로 가는 길을 안내해주지 않는다.
로드밸런서는 ‘우체부’가 아니라 ‘대리인’이다.
로드밸런서는 리버스 프록시이다. 사용자는 로드밸런서에게 “야, 내가 사설 IP 주소 줄테니까 여기로 좀 전해줘”라고 부탁할 방법이 없다. 로드밸런서는 오직 미리 설정된 포트(80, 443 등)로 들어오는 ‘웹 요청’만 처리하도록 설계된 기계이기 때문이다.
인터넷 세상은 ‘사설 IP’를 읽을 줄 모른다.
내가 집에서 10.0.1.55같은 사설 IP를 보내도, 이 주소는 사설 대역이라 버려진다. igw는 ‘공인 IP’라는 명확한 명찰을 달고 온 녀석만 VPC 안으로 들여보내 준다.
이유2: 패킷을 알아서 흘러가지 않는다.
VPC의 내부의 모든 서브넷은 Local 라우팅 테이블을 공유하기 때문에 서로 길은 뚫려 있다. 하지만 네트워크 패킷은 물처럼 알아서 낮은 곳(Private Subnet)으로 스며들어 가지 않는다.
외부 인터넷 트래픽이 Public Subnet에 도착했다면, 그곳에 있는 어떤 컴퓨터(EC2, Nginx, Bastion Host)가 그 트래픽을 ‘직접 받아서’, 자기 자신의 사설 IP 이름으로 새로운 요청을 만들어 Private Subnet으로 다시 던져주어야만 통신이 이어진다. → 리버스 프록시.
Bastion HostSSH Key)를 가진 사람만이 이 요새의 문을 통과할 수 있다.Bastion Host는 Public Subnet에 만들어둔 아주 작은 규모의 EC2 인스턴스일 뿐.
22번 포트) 등으로 원격 접속할 수 있도록 공인 IP를 부여SSH 연결)0.0.0.0/0(모든 사람)을 허용하면 절대 안됨!!!! 반드시 개발자 본인의 IP에서만 22번 포트(SSH)로 들어올 수 있도록 아주 좁게 허용.Bastion Host의 보안 그룹 ID**와 **백엔드 서버의 보안 그룹 ID**에서 오는 트래픽만 허용.SSM): 22번 포트를 열지 않고도 AWS 콘솔 웹페이지를 통해 안전하게 내부망에 접근하기 해주는 서비스.