📌 Private Subnet 과 Public 과의 연결 : NAT Gateway / Instance

PRIVATE SUBNET 내 INSTANCE를 외부와 통신하게 하려면 어떻게 해야할까?

IGW+ ROUTE TABLE을 통해 PUBLIC SUBNET에 있는 PUBLIC EC2는 INBOUND, OUTBOUND요청을 설정했다.

반면 PRIVATE SUBNET 내에 있는 PRIVATE EC2는 INBOUND, OUTBOUND를 각각 따로 설정해줘야한다.

INBOUND: BASTION

BASTION을 통해 Private Instanc에 요청하는 경우는

보통 Private EC2 서버 log 확인할 때 많이 사용한다.

BASTION은 PUBLIC SUBNET에 존재하는 INSTANCE임

  • 외부에서 BASTION 에게 요청을 하면 server에 대신 요청을 날려준다.(즉 터널이 뚫린 것 처럼 보인다.)
  • 외부에서 BASTION에 PUBLIC IP 123.72.9.16에 요청하면 private subnet 내에 EC2(server)로 자동으로 요청된다.

즉 BASTION을 통해 터널을 여는 것인데 2가지로 동작한다. 이에 따른 명령어가 있다.

  • 터널을 열기 : ssh -i **"local-to-bastion.pem"** -N -L 33322:{target-private-ip}:22 ec2-user@{bastion-host-public-ip}
  • 열린 터널로 요청하기:ssh -i **"bastion-to-private.pem"** -p 33322 ec2-user@**localhost**

SSH를 통한 통신

SSH 터널링을 구현하기 위해 필요한 것은 PEM KEY 2개다.

  • 외부에 대한 요청을 내 Local 컴퓨터라고 가정했다.
  1. Local → Bastion(요청 시 필요한 ) Key Pair

  2. Bastion→ Server(요청 시 필요한 ) Key Pair

KEY 설정 대상

즉 Local Host와 Bastion을 SSH로 연결할 때 Key Pair 설정을 해줘야한다

Bastion과 Private Subnet 내에 EC2가 SSH로 연결될 때 Key Pair 설정을 해줘야한다.

EC2 생성시 키주입하기

AWS에서 Key Pair를 생성하면 PEM KEY를 줄 것인데 이것에 Private key다.

Pulbic Key는 AWS상에서 가지고 있게 된다.

  • 이후 Public Key는 Private Instance 생성 시 주입해주고
  • Bastion으로 Private Instance에 접근 시 PEM KEY 즉 Private 키로 함께 요청을하면 접근할 수 있다.

위 과정을 끝내면 Local에서 Private Instance에 바로 요청할 수 있다 이 모습이 마치 터널을 뚫린 것 처럼 보인다.

  • Public Key, Private Key : 키 페어 : RSA 알고리즘

OUTBOUND: NAT

NAT를 통해 Private Instance가 외부에 특정 요청을 하는 경우 보통 서버에서 라이브러리 다운 받을 때 많이 사용한다.

BASTION과 마찬가지로 Pirvate Instance와 연결 될 수 있는 NAT라는 이름의 Public Instance를 만들어주는 것이다.

NAT Gateway / Instance

Private EC2 로부터 온 네트워크 패킷을 재작성하여, 외부와 대신 통신을 해준다

  • “외부와 대신 통신을 해준다”는 관점에서 Proxy 와 NAT 가 같은것으로 오해할 수 있지만, 다른것이다.
    • NAT : Layer 3/4 기반 동작 + Private IP 를 Public IP 로 변환 (네트워크 패킷 재작성)
    • Proxy : Layer 7 기반 동작 + 다양한 보안 관련 기능들 제공

AWS 에서 NAT Instance 생성 시 주의

  • 주의 1 : Source / Destination Check 설정을 무조건(MUST) 꺼야한다

📌 전체적인 VPC내 서비스 구성

Private Ec2에 연결된 Route Table 보기

Private Ec2에 INBOUNDBATION→Private EC2 내부로 요청하는 것

Private Ec2에 OUTBOUND는 Private EC2 내부에서 → NAT로 외부요청하는 것

10.0.0.0/16 local의 의미(INBOUND요청)

Private Ec2(10.0.0.0/16)로 오는 요청은 Local(Private Ec2)로 가라는 의미

0.0.0.0/0 NAT EC2의 의미(OUTBOUND 요청)

밖으로 나가는 모든 요청은 Public Subnet에 있는 NAT EC2로 가라는 의미

BASTION에 연결된 Route Table 보기

BATION에 INBOUND는 외부에서 → BASTION 내부로 요청하는 것

BATION에 OUTBOUND는 BASTION 내부에서 → Private EC2로 요청하는 것

10.0.0.0/16/ local의 의미(INBOUND 요청)
10.0.0.0/16 인스탄스로 가려고 하는 내부로 들어온 요청은 Local(Bastion 인스탄스)로 가라!

OUTBOUND 요청- Private Ec2로 요청할 때

**ssh ec2-user@{target-private-ip} -i bastion-to-private.pem 명령어를 통해 Private Ec2에 요청한다.**

0.0.0.0/0 IGW의 의미(OUTBOUND 요청- 인터넷 외부에서 요청할 때)
BASTION에서 외부 Destination IP(카카오 혹은 구글같은 ) 나가는 모든 요청은 0.0.0.0/0으로 모두 허용해준다. 이후 IGW로 가서 PUBLIC IP 변환을 해서 요청해라!

profile
반복되는 실수를 기록을 통해 줄여가보자!

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN