Post

[AWS][계정 분산 관리] 4. NAT Server & Port Forwarding: NAT Server를 사용해 프로젝트별 Private Subnet 접근

AWS|계정 분산 관리|NAT Server & Port Forwarding|프로젝트별 Private Subnet 접근

[AWS][계정 분산 관리] 4. NAT Server & Port Forwarding: NAT Server를 사용해 프로젝트별 Private Subnet 접근

1. NAT Server & Port Forwarding

  • NAT(Network Address Translation) Server는 내부 네트워크의 사설 IP 주소외부 네트워크에서 사용할 수 있는 공인 IP 주소로 변환하거나, 그 반대로 변환하는 역할을 합니다.
  • 프로젝트별로 NAT Server를 구축하고 Port Forwarding을 통해 각 프로젝트 VPC의 Private Subnet에 위치한 RDS 인스턴스나 ElastiCache 클러스터 등의 리소스에 접근할 수 있도록 구성합니다. 이러한 방식을 통해 얻을 수 있는 이점은 다음과 같습니다.

    1. 보안 강화
      Private Subnet에 위치한 인스턴스는 외부에서 직접 접근할 수 없으므로, 외부 공격으로부터 더 안전합니다.
      NAT Server를 통해 인터넷 접근은 허용되지만, 외부에서 Private Subnet으로 직접 연결은 불가능합니다.

    2. 인터넷 접근 허용
      NAT Server가 외부와의 연결을 대행하므로, Private Subnet의 인스턴스는 공인 IP 없이도 인터넷을 사용할 수 있습니다.

    3. 비용 효율성
      NAT Gateway는 관리가 간편하고 안정성이 높지만, 비용이 상대적으로 비쌉니다.
      직접 구축한 NAT Server를 사용하면 필요에 따라 크기를 조정하거나 커스터마이징하여 비용을 절감할 수 있습니다.

    4. 데이터 유출 방지
      Private Subnet 내 민감한 데이터를 외부로부터 보호하면서도, 필요한 외부 리소스에만 접근할 수 있도록 설정할 수 있습니다.

  • 이 글에서는 Bastion Host Server → NAT Server → Private Subnet의 RDS로 접근하는 방식을 설명합니다. 구조는 아래와 같습니다. Desktop View

2. 구성 방법

사전 조건:

  • 통합 관리 계정에 Bastion Host Server가 필요합니다.
  • 프로젝트 계정의 Public SubnetNAT Server로 사용할 EC2 인스턴스가 필요합니다. (이 글에서는 Ubuntu 사용)
  • 프로젝트 계정의 Private SubnetRDS 인스턴스가 필요합니다. (이 글에서는 MariaDB 사용)

1. RDS 인스턴스의 보안 그룹 설정

  1. NAT Server에서 RDS 인스턴스에 접근할 수 있도록 DB 포트(기본 3306)에 대해 NAT Server의 사설 IP를 소스로 추가합니다.

해당 글에서는 하나의 인스턴스만 사용합니다. 그러나 사용할 인스턴스가 다수가 될 것을 예상해, 외부에서 접근할 포트에 대한 전략을 수립하는 것도 좋습니다.

2. NAT Server의 보안 그룹 설정 및 Bastion Host Server → NAT Server로 접속

  1. NAT Server의 보안 그룹 인바운드 규칙에서 3306 포트에 대해 Bastion Host Server의 사설 IP를 소스로 추가합니다.
  2. NAT Server의 보안 그룹 인바운드 규칙에서 SSH 포트(기본 22)에 대해 Bastion Host Server의 사설 IP를 소스로 추가합니다.
    Desktop View
  3. SSH 터널링이나 직접 접속을 통해 Bastion Host Server → NAT Server로 연결합니다.

3. Port Forwarding 설정

  1. NAT Server에서 패킷 포워딩을 활성화하려면 /etc/sysctl.conf 파일에 아래 설정을 추가합니다.

    1
    
     net.ipv4.ip_forward = 1
    
  2. 설정을 적용하고 확인합니다.

    1
    2
    3
    4
    5
    
     # 즉시 적용
     sudo sysctl -p
     # 적용 확인
     sysctl net.ipv4.ip_forward
     # 출력: net.ipv4.ip_forward = 1
    
  3. RDS 인스턴스사설 IP는 아래 명령어로 확인할 수 있습니다. (AWS 콘솔에서는 사설 IP를 확인할 수 없습니다.)

    1
    
     dig <RDS 인스턴스의 엔드포인트>
    

    Desktop View

  4. 특정 포트로 외부 접근 시 RDS 인스턴스로 라우팅되도록 iptables NAT 테이블PREROUTINGPOSTROUTING Chain에 규칙을 설정합니다.

    1
    2
    3
    4
    
     # PREROUTING Chain
     sudo iptables -t nat -A PREROUTING -i <내부 네트워크 인터페이스> -p tcp --dport <외부 접근 포트> -j DNAT --to-destination <RDS 인스턴스의 사설 IP>:3306
     # POSTROUTING Chain
     sudo iptables -t nat -A POSTROUTING -o <내부 네트워크 인터페이스> -d <RDS 인스턴스의 사설 IP> -j MASQUERADE
    

    FORWARD Chain이 ACCEPT 상태여야 합니다. 기본적으로 모든 패킷이 ACCEPT 상태이지만, 보안을 위해 규칙을 추가로 설정하는 것이 좋습니다.

4. Bastion Host Server → NAT Server → Private Subnet의 RDS 접속

  1. SSH 터널링을 통해 로컬에서 RDS에 접근합니다. 아래와 같은 방법을 사용할 수 있습니다.
    1. SSH 명령어와 MySQL CLI를 사용
    2. Bastion Host에서 직접 MySQL CLI를 사용
    3. SSH 터널링을 지원하는 GUI 사용 (해당 글에서는 DBeaver 사용)
  2. SSH 터널링 정보 입력 후 연결을 테스트합니다.
    Desktop View

  3. NAT Server에서 RDS로의 Port Forwarding 정보를 입력 후 연결을 확인합니다.
    Desktop View

3. 주요 요약

  • NAT Server 활용: Private Subnet의 리소스에 대한 외부 접근을 NAT Server를 통해 안전하게 관리.
  • 포트 포워딩 설정: NAT Server에서 iptables를 이용해 특정 포트로의 외부 접근을 RDS로 라우팅하도록 설정.

다음 글: [AWS][계정 분산 관리] 5. Switch Role 활용: 통합 콘솔 관리(完)
이전 글: [AWS][계정 분산 관리] 3. Bastion Host Server: 중앙 집중형 인스턴스 접근

This post is licensed under CC BY 4.0 by the author.