본문으로 건너뛰기

· 약 11분
누누

어떤 문제가 있었나요?

우아한테크코스에서 private 서브넷에 db 인스턴스를 두고, 보안을 위해 외부에서 접속을 차단하려고 했습니다.

이 과정에서 총 2가지의 문제점이 있었습니다.

  1. private 서브넷에 인스턴스가 인터넷에서 mysql을 설치할 수 없었습니다.
  2. public 서브넷에 있는 인스턴스에서 private 서브넷에 있는 인스턴스에 접속이 안되었습니다.

이 부분을 어떻게 해결했는지 알아보도록 하겠습니다.

아래의 모든 설명은 AWS 를 기준으로 합니다.

private 서브넷에 인스턴스가 인터넷에서 mysql을 설치할 수 없었다.

해결 방법

public ip 자동할당을 해주지 않아서, 인터넷에 연결이 안 되었습니다.

이를 해결하기 위해 public ip 자동할당을 해주었습니다.

왜 public ip를 할당했더니 문제가 해결되었을까요?

private 서브넷이란?

정말 간단하게 설명했을 때

private 서브넷은 인터넷에 연결되지 않은 서브넷입니다.

조금 자세하게 들어가 보도록 하겠습니다

private 서브넷은 인터넷 게이트웨이가 연결되지 않은 서브넷입니다.

aws 공식문서에서 사진을 통해 보면 아래와 같이 되어있습니다

private subnet

public 서브넷에만 인터넷 게이트웨이가 연결되어 있고, private 서브넷에는 인터넷 게이트웨이가 연결되어있지 않습니다.

private 서브넷에 인터넷 게이트웨이가 연결되어 있지 않다고 했을 때, 기본적으로 인터넷에 접속이 안됩니다.

mysql을 설치할 때도, 인터넷에 접속을 해야하는데, 인터넷에 접속이 안되니 설치가 안되는 것입니다.

어? 인터넷 자체가 접근이 안되면 어떻게 설치하나요?

정말 원시적으로 해결하기 위해서는 public 서브넷에 인스턴스를 하나 더 만들어서, mysql 을 압축해서 scp를 통해 private 서브넷에 있는 인스턴스에 전송하고, 압축을 풀어서 설치하는 방법이 있습니다.

하지만 이 방법은 너무 원시적이고, 비효율적입니다.

그래서 인터넷으로 요청을 보낼 수 있도록 만드는 과정이 필요합니다.

인터넷으로 요청을 보낼 수 있도록 만드는 과정

인터넷으로 요청을 보낼 수 있도록 만드는 과정은 크게 2가지가 있습니다.

private 서브넷을 public 서브넷으로 바꾸기

보안을 위해서 private 서브넷에 두려고 했던 것을 public 서브넷으로 바꾼다는 부분은 매우 위험합니다.

그래서 이 방법은 보통 사용하지 않습니다.

NAT 인스턴스(Gateway) 만들기

NAT 인스턴스는 private 서브넷에 있는 인스턴스가 인터넷에 접속할 수 있도록 만들어주는 인스턴스입니다.

인터넷에 접속을 하기 위해서는 public ip 가 필요합니다.

따라서 NAT 인스턴스, NAT 게이트웨이는 public 서브넷에 존재해야 합니다.

어? NAT 인스턴스를 통해서 바로 통신이 가능하면 왜 private 서브넷이 필요한가요? 그냥 다 public 서브넷에 두면 되지 않나요?

NAT 인스턴스, NAT Gateway는 내부에서 출발한 트래픽만 통과할 수 있도록 설정이 되어있습니다.

예를 들면 private 서브넷에 인스턴스에 접속해서 직접 mysql download 요청을 했을 때만 허용이 됩니다.

외부에서 바로 private 인스턴스로 접근할 수는 없습니다.

NAT 인스턴스만 설정을 하면 바로 연결이 되나요?

public ip도 자동 할당을 해줘야 합니다

public ip 가 필요한 이유

NAT 인스턴스를 통해서 private 서브넷에 있는 인스턴스가 인터넷에 접속할 수 있도록 만들었는데, 왜 public ip 가 필요할까요?

외부 인터넷과 통신을 할 때 public ip 가 필요합니다.

NAT 인스턴스 혹은 NAT 게이트웨이가 인터넷과 통신할 때, NAT 인스턴스의 public ip + private ip를 통해서 통신을 하지 않습니다.

내부 인스턴스의 public ip 를 통해서 통신을 하게 되어있습니다.

따라서 NAT 인스턴스와 내부 인스턴스 모두 public ip 가 필요합니다.

이 과정을 통해서 1번 문제를 해결할 수 있었습니다.

이제 2번째 문제를 해결해 보도록 하겠습니다.

public 서브넷에 있는 인스턴스에서 private 서브넷에 있는 인스턴스에 접속이 안 되는 문제

public 서브넷에 있는 서버가 private 서브넷에 있는 서버에 접속을 하려고 했는데, 접속이 안 되는 문제가 있었습니다.

해결 방법

해결 방법에는 2가지 과정이 있습니다.

public 서브넷에 있는 인스턴스의 보안 그룹에 private 서브넷에 있는 인스턴스의 보안 그룹을 추가해 주기

기본적으로 public 서브넷에 있는 인스턴스의 보안 그룹에는 private 서브넷에 있는 인스턴스의 보안 그룹이 추가되어있지 않습니다.

따라서 public 서브넷에 있는 인스턴스의 보안 그룹에 private 서브넷에 있는 인스턴스의 보안 그룹을 추가해주어야 합니다.

private ip를 통해서 접속하기

public 서브넷에 있는 인스턴스가 private 서브넷에 있는 인스턴스에 접속할 때, public ip 를 통해서 접속을 하면 안 됩니다.

public ip를 통해서 접속하는 과정을 자세하게 알아보겠습니다.

  1. public 서브넷에 있는 인스턴스가 public ip 를 통해서 private 서브넷에 있는 인스턴스에 접속을 시도합니다.
  2. 라우팅 테이블에서 public ip 일 경우에 어떻게 처리할지에 대한 정보를 찾습니다.
  3. 라우터를 통해서 외부 인터넷으로 나가게 됩니다.
  4. 트래픽이 NAT 인스턴스에 도착합니다.
  5. NAT 인스턴스는 내부에서 출발한 트래픽이 아니기 때문에, 트래픽을 거부합니다.

이 과정이 일어나기에, public ip 를 통해서 접속을 하면 안 됩니다.

private ip를 통해서 접근하면 어떻게 되는지 알아보겠습니다

  1. public 서브넷에 있는 인스턴스가 private ip 를 통해서 private 서브넷에 있는 인스턴스에 접속을 시도합니다.
  2. 라우팅 테이블에서 private ip 일 경우에 어떻게 처리할지에 대한 정보를 찾습니다.
  3. 라우터를 거쳐서 private 서브넷의 라우터로 이동합니다.
  4. private 서브넷의 라우터는 private 서브넷에 있는 인스턴스에게 트래픽을 전달합니다.
  5. private 서브넷에 있는 인스턴스는 트래픽을 받아서 처리합니다.

이 과정을 통해서 2번 문제를 해결할 수 있었습니다.

요약

  1. private 서브넷에 있는 인스턴스가 인터넷에 접속을 하려면 NAT 인스턴스 혹은 NAT 게이트웨이가 필요합니다.
  2. private 서브넷에 있는 인스턴스도 public ip 가 필요합니다.
  3. public 서브넷에 있는 인스턴스가 private 서브넷에 있는 인스턴스에 접속을 하려면 private 서브넷에 있는 인스턴스의 보안 그룹을 추가해주어야 합니다.
  4. public 서브넷에 있는 인스턴스가 private 서브넷에 있는 인스턴스에 접속을 할 때, private ip 를 통해서 접속을 해야 합니다.