Cloud/AWS

AWS NAT64, DNS64를 이용한 IPv6 주소에서 IPv4 주소로 통신

지기(ZIGI) 2022. 2. 14. 17:41

Today Keys : DNS64, NAT64, IPv6, IPv4, NAT, 64:ff9b::/96, Well-Known Prefix, Route 53, Resolver, Gateway


이번 포스팅은 AWS에서 IPv6로 구성된 워크로드에서 IPv4 서비스와 통신을 할 수 있도록 지원하는 NAT64, DNS64 이용해서, IPv6 인스턴스가 VPC 외부의 IPv4 서비스와 통신하는 예제를 알아봅니다. NAT64와 DNS64를 사용하면, 단순히 서브넷의 옵션과 라우팅 조정만으로 AWS에 구축된 IPv6 워크로드가 IPv6는 물론 IPv4로 제공되는 서비스와 통신하도록 구성 할 수 있습니다.

 
오늘 포스팅에서 다뤄질 전체적인 구성입니다.
하단에 ZIGI-VPC에 IPv4와 IPv6를 모두 사용하도록 구성이 되어 있습니다.
ZIGI-VPC 내에 IPv6 전용 서브넷인 ZIGI-v6-Sub1과 IPv4 서브넷인 ZIGI-v4-Sub1이 있습니다.
DNS64와 NAT64를 기능 사용을 위해서 ZIGI-v6-Sub1의 서브넷 속성과 라우팅 테이블 수정을 진행하게 됩니다.
상단의 ZIGI-WEB-VPC(AWS), ZIGI-WEB-VNET(Azure)에는 실제 테스트를 위해서 IPv4 주소로 웹서비스를 올렸습니다.       
 
※ 참고로, IPv6 전용 서브넷, IPv6 전용 EC2 인스턴스는 22년 2월 현재, 자카르타 리전을 제외하고 모두 지원하지만,
NAT64, DNS64는  의 경우에는 버지니아 북부, 오레콘, 캘리포니아 북부 리전에서만 지원하고 합니다.    
 
 
사전 구성
 [ZIGI-VPC] IPv4/v6 주소 사용이 가능한 VPC 생성
 [ZIGI-VPC] IPv4 서브넷에 NAT Gateway 구성
 [ZIGI-WEB-VPC] / [ZIGI-WEB-VNET] 공인 IPv4 주소로 웹 서비스 중인 AWS와 Azure의 가상 머신
IPv6 전용의 서브넷을 생성을 위해서 서브넷 생성 시에, 서브넷 설정의 'IPv6 전용' 옵션을 체크 후, 생성합니다.   
        
 
 
IPv6 전용 서브넷에서 EC2 인스턴스를 생성합니다.
생성된 EC2의 IP 주소를 확인해 보면, 2600:1f18:~:9c8:1136 이라는 IPv6 주소를 갖는 것을 볼 수 있습니다.
IPv6 전용 서브넷에 생성된 EC2 인스턴스를 'AWS-v6-VM' 이라고 하겠습니다.
 
                  
 
미리 테스트를 위해서 AWS와 Azure에 IPv4 주소를 가진 가상 머신을 1개씩 생성해 두었습니다.
각 가상 머신을 'AWS-v4-VM', 'Azure-v4-VM' 이라고 하겠습니다.             
'AWS-v4-VM'와 'Azure-v4-VM'은 아래와 같은 도메인으로 연결되어 있습니다.
'AWS-v6-VM'에서 'AWS-v4-VM' 'Azure-v4-VM'으로 도메인 질의를 하면 두 가상 머신 모두 IPv4 주소만 갖고 있고
IPv4용 A레코드만 갖고 있기 때문에  아래와 같이 IPv4 주소만을 응답 받는 것을 볼 수 있습니다.
 
 
 
IPv6 전용 서브넷에 있는 'AWS-v6-VM'이 IPv4 주소를 가진 서비스와 통신하기 위해서는 서브넷 설정 중,  'DNS64 활성화' 옵션을 설정해야 합니다.               
 
 
 
DNS64 를 활성화하고 나면 Amazon Route 53 Resolver에서 DNS64 동작을 통해,
IPv4 주소를 포함하는 IPv6 주소의 Prefix로 사용되는 '64:ff9b::/96' 를 이용해, IPv6 주소의 AAAA레코드 응답을 합니다.
         
 
  

'64:ff9b::/96' 주소는 128bit로 구성된 IPv6 주소에서 32bit의 IPv4 주소를 삽입하여 IPv6 주소를 만들 수 있는

IPv6 주소 체계에서 Prefix로 미리 할당한 것이고, 이를 Well-Known Prefix라고 합니다.
 
가령, 위의 예시에서 'AWS-v4-VM'의 주소인 15.165.236.128을 16진수로 변환하면
15 → 0F
165 → A5
236 → EC
128 → 80
이 되고, 이를 Well-Known Prefix인 '64:ff9b::/96'에 매핑하여,
'64:ff9b::fa5:ec80'
이라는 IPv6 주소로 AAAA 레코드 값을 응답하는 것입니다.
 
 
 
그럼 이제 IPv4와 통신 할 수 있는 IPv6 주소에 대한 DNS 레코드를 응답 받았으니,
실제 접속을 시도해 보면 아래와 같이 정상적으로 통신이 되지 않는 것을 볼 수 있습니다.
실제 목적지가 IPv4로 서비스 되기 때문에, 'AWS-v6-VM'이 가진 IPv6 주소로는 통신 할 수 없기 때문입니다.
IPv4로 서비스하는 'AWS-v4-VM''Azure-v4-VM'과 통신하기 위해서
IPv6 주소를 IPv4로 변환해주는 NAT64 동작이 필요합니다.
NAT64의 기능은 기존 VPC NAT Gateway에서 동작하며, NAT64 동작을 위해서 추가로 설정이 필요하지는 않습니다.
단지 해당 목적지 트래픽이 NAT Gateway를 통과하도록 라우팅 설정을 합니다.
 

 

 
IPv4로 서비스 되는 'AWS-v4-VM''Azure-v4-VM'과 통신하기 위해,
IPv6 전용 서브넷의 라우팅 테이블에 '64:ff9b::/96' 주소에 대한 목적지를 NAT Gateway로 Target 경로를 설정합니다.  
 
 
 
라우팅 설정까지 완료되면, 다시 'AWS-v6-VM'에서 'AWS-v4-VM''Azure-v4-VM'으로 서비스 호출을 합니다.
정상적으로 서비스 응답을 받는 것을 볼 수 있습니다.            
 
 
 
'AWS-v6-VM'에서 'AWS-v4-VM'으로 서비스 호출 시, 패킷을 확인해 보면 아래와 같이 진행되는 것을 볼 수 있습니다.
목적지(AWS-v4-VM)의 도메인에 대해서 AWS Route 53 Resolver로 A/AAAA 레코드 질의를 하고,
'AWS-v4-VM'의 실제 IPv4 주소와 함께 IPv6가 IPv4와 통신하기 위한 '64:ff9b::fa5:ec80' IPv6 주소를 각각 응답 받게 됩니다.