Cloud/AWS

IPv6 전용 EC2에서 IPv4 주소와 통신하기 (NAT64)

Jinseung's Blog 2026. 11. 4. 20:08

이번 블로그에서는 AWS에서 IPv6 전용 EC2가 NAT Gateway를 통해 IPv4 주소와 통신하는 방법에 대한 글을 작성해 보겠습니다.

들어가며

퍼블릭 IPv4 주소에 비용이 붙으면서 IPv6 전용 서브넷으로 인프라를 구성하는 경우가 늘고 있습니다. 그런데 막상 IPv6 전용 EC2를 띄워 보면 금방 문제를 만나게 됩니다. 아직 인터넷의 많은 서비스가 IPv4 만 지원하기 때문에, IPv4 주소로는 통신이 되지 않는 것입니다.

 

이 글에서는 NAT Gateway의 NAT64 기능으로 이 문제를 해결하는 방법과, IPv4 주소를 IPv6 주소로 직접 변환해 통신하는 과정을 정리했습니다.

사전 지식: IPv6 EC2는 왜 IPv4와 통신할 수 없을까?

IPv4와 IPv6는 서로 호환되지 않는 별개의 프로토콜입니다. IPv6 주소만 가진 EC2는 IPv4 패킷 자체를 만들 수 없기 때문에, Internet Gateway를 연결하더라도 IPv4 주소를 가진 서버와는 직접 통신할 수 없습니다.

 

이 문제를 해결하는 방안이 바로 NAT Gateway입니다. NAT Gateway는 IPv6 패킷을 받아 IPv4 패킷으로 주소를 변환해 주고, 변환된 주소를 통해 IPv4 서버와 통신하게 됩니다. 이 기능을 NAT64라고 합니다.

64:ff9b::/96이란?

그냥 NAT Gateway를 연결한다고 해서 바로 동작하지는 않습니다. EC2 입장에서는 어떤 트래픽을 NAT Gateway로 보내야 하는지 알 수 없기 때문입니다. 그래서 라우팅 테이블에서 목적지가 64:ff9b::/96인 트래픽을 NAT Gateway로 보내도록 설정해야 합니다.

 

64:ff9b::/96은 IPv4 주소를 IPv6 주소 안에 담아 표현하기 위해 예약된 접두사(Well-Known Prefix)로, AWS VPC의 NAT64도 이 대역을 사용합니다. 구조는 아래와 같습니다.

64:ff9b::  +  IPv4 주소(32비트)
└─ 앞 96비트 ─┘  └─ 뒤 32비트 ─┘

 

즉 앞 96비트는 "이 주소는 IPv4로 변환해야 하는 주소"라는 표시이고, 뒤 32비트에 실제 IPv4 주소가 들어갑니다. NAT Gateway는 이 32비트를 꺼내 원래의 IPv4 주소로 변환해 통신합니다.

실습: NAT64 구성하기

1. NAT Gateway 생성

NAT Gateway는 IPv4로 인터넷에 나가야 하므로, IPv4 대역이 있는 퍼블릭 서브넷(듀얼 스택)에 퍼블릭 NAT Gateway를 생성하고 EIP를 연결합니다.

2. 라우팅 규칙 추가

IPv6 전용 EC2가 있는 서브넷의 라우팅 테이블에 64:ff9b::/96 목적지를 NAT Gateway로 보내는 규칙을 추가합니다.

aws ec2 create-route \
    --route-table-id <ROUTE_TABLE_ID> \
    --destination-ipv6-cidr-block 64:ff9b::/96 \
    --nat-gateway-id <NAT_GATEWAY_ID>
목적지 대상
::/0 Internet Gateway (또는 Egress-only IGW)
64:ff9b::/96 NAT Gateway

3. (선택) DNS64 활성화

도메인으로 통신하는 경우에는 서브넷에서 DNS64를 켜 두면 편리합니다. DNS64가 활성화되면 IPv4 주소(A 레코드)만 있는 도메인을 조회할 때, Route 53 Resolver가 자동으로 64:ff9b::로 시작하는 IPv6 주소를 만들어 응답해 줍니다.

aws ec2 modify-subnet-attribute \
    --subnet-id <SUBNET_ID> \
    --enable-dns64

 

다만 도메인 없이 IPv4 주소로 직접 통신해야 한다면, 아래처럼 주소를 직접 변환해야 합니다.

IPv4 주소를 IPv6 주소로 변환하기

변환 명령어는 아래와 같습니다.

curl [64:ff9b::<변환주소>];echo

 

IPv6 주소로 변환하려면 먼저 16진수를 알아야 합니다. 16진수 자체는 이 글에서는 다루지 않겠습니다. 예시를 들어 설명해 보겠습니다.

1. IPv4 주소의 각 자리를 16진수로 변환

IPv4 주소가 3.36.112.205라면, 점(.)으로 구분된 각 숫자를 2자리 16진수로 바꿉니다.

3   -> 0x03
36  -> 0x24
112 -> 0x70
205 -> 0xCD

2. 두 자리씩 묶어 IPv6 형식으로 만들기

IPv6는 4자리 16진수를 콜론(:)으로 구분하므로, 앞의 두 개와 뒤의 두 개를 각각 묶습니다.

03 24 70 CD  ->  0324:70cd  ->  324:70cd

 

IPv6에서는 각 블록의 앞자리 0을 생략할 수 있으므로 0324는 324로 표기합니다.

3. 64:ff9b:: 뒤에 붙이기

64:ff9b::324:70cd

 

매번 손으로 계산하기 번거롭다면 아래 명령어로 한 번에 변환할 수 있습니다.

printf "64:ff9b::%02x%02x:%02x%02x\n" 3 36 112 205
# 64:ff9b::0324:70cd

테스트: IPv6 EC2에서 IPv4 서버 호출하기

IPv6 전용 EC2에서 변환한 주소로 요청을 보냅니다.

curl [64:ff9b::324:70cd];echo

결과

13.209.254.55

 

요청을 받은 서버(3.36.112.205)가 접속한 클라이언트의 IP를 돌려주도록 되어 있다면, 응답으로 NAT Gateway의 EIP가 조회됩니다. IPv6 전용 EC2의 요청이 NAT Gateway에서 IPv4로 변환되어, NAT Gateway의 공인 IPv4 주소로 서버에 도달했다는 의미입니다.

주의할 점

  • 라우팅 규칙이 빠지면 동작하지 않습니다. NAT Gateway를 만들기만 하고 64:ff9b::/96 라우팅을 추가하지 않으면, 트래픽이 NAT Gateway로 전달되지 않습니다.
  • NAT Gateway는 IPv4가 있는 서브넷에 있어야 합니다. NAT Gateway가 IPv4로 인터넷에 나가야 하므로, 해당 서브넷에는 IPv4 대역과 0.0.0.0/0 → IGW 라우팅이 필요합니다.
  • NAT Gateway 비용이 발생합니다. 시간당 요금과 처리한 데이터양에 따른 요금이 함께 부과됩니다.
  • 내부 표기법도 사용할 수 있습니다. IPv6는 마지막 32비트를 IPv4 형식으로 쓰는 것도 허용하므로, 64:ff9b::3.36.112.205처럼 표기해도 같은 주소를 의미합니다.

마무리

IPv6 전용 EC2는 Internet Gateway만으로는 IPv4 서버와 통신할 수 없습니다. NAT Gateway를 만들고 64:ff9b::/96 목적지를 NAT Gateway로 보내는 라우팅 규칙을 추가하면, IPv4 주소를 IPv6 주소 안에 담아 NAT64로 변환된 통신이 가능해집니다. 도메인을 쓴다면 DNS64를, IP로 직접 통신한다면 이 글처럼 주소를 직접 변환해 사용하면 됩니다.

이것으로 IPv6 EC2에서 IPv4와 통신하는 방법에 대한 글을 마치겠습니다. 감사합니다!