본문 바로가기

Cloud/AWS

AWS Route 53 Global Resolver

today keys: route 53, global, resolver, 리졸버, anycast, dns, firewall, query, aws


Route 53 Global Resolver는 인터넷이나 지사, 온프레미스 같은 외부 환경의 클라이언트가 AWS의 전역 Anycast IP를 통해 DNS 질의를 보낼 수 있게 해주는 관리형 DNS Resolver입니다.
여러 위치의 사용자가 하나의 DNS 진입점을 사용하면서도, 접근 제어와 DNS 보안 정책을 중앙에서 적용할 수 있습니다.

이번 포스팅에서는 Route 53 Global Resolver를 생성한 뒤, 허용된 IP만 DNS 질의를 할 수 있는지DNS Firewall로 특정 도메인을 차단할 수 있는지를 실습으로 확인합니다.
또한 Query Type 조건을 이용해 AAAA 레코드만 차단하는 방식까지 함께 테스트해봅니다.


Route 53 Global Resolver 생성 시에는 

Resolver의 이름을 입력하고  2개 이상의  AWS 리전을 선택합니다.

 

 

Global Resolver를 생성하고 나면  anycast IP 주소가 바로 할당됩니다.

실제 동작을 위해서 Resolver가 생성되기 까지 약 10여분정도 소요됩니다.

 

정상적으로 Global Resolver가 생성이 완료되면, Status가 Operationl로 변경됩니다.

 

 

Global Resolver 생성이 완료되고 나면,

하단의 'Create DNS View'를 선택해서, DNS View 생성을 시작합니다.

 

DNS View는 Global Resolver를 사용하게 될 클라이언트 그룹에 서로 다른 DNS 정책을 적용할 수 있는 템플릿입니다. 

DNS View 생성 시에, View에 이름을 설정합니다. 

여기에서는 'ZIGI-View'라는 이름으로 설정했습니다.

DNSSEC 검증 및  EDNS 클라이언트 서브넷(ECS)을 활성화 할지, 비활성화 할지 선택합니다.

기본 값은 활성화이나, 본 포스팅에서는 사용하지 않기 때문에 Disable로 하고 넘어갑니다.

 

DNS View 생성을 위한 값을 모두 설정하고 나면,

다음과 같이 status가 Creating으로 되면서 DNS View 생성을 시작합니다.

 

본 포스팅에서는 지정된 사용자의 네트워크 주소 대역에서만  Global Rosolver를 사용하게 할 예정입니다.

이를 설정하기 위해서 DNS View에서 'Access sources' 탭을 선택해서,

'Create access source'를 클릭합니다.

 

Global Rosolver에 접근을 허용하는 사용자를 IP 주소로 설정합니다. 

본 포스팅에서 3.38.161.240 이라는 IP 주소에 대해서만 허용하려고 합니다. 

프로토콜은 기본 값인 Do53(DNS over port 53)을 그대로 사용합니다.

 

이제 DNS View에 접근 가능한 사용자를 IP 주소로 제어한 Access source details까지 만들어졌습니다.

 

이제 Route 53 Global Resolver를 사용하기 위한 기본 설정은 완료되었습니다.

 

그럼 이제, DNS View에서 접근을 허용한 사용자 IP과 허용되지 않은 사용자 IP에서

Route 53 Global Resolver를 통해서 도메인 질의를 해보겠습니다.

 

먼저 현재 가상 머신의 공인 IP 주소를 확인하여,

앞서 DNS View에서 설정한 Access Source의 IP 주소가 맞는지 봅니다.

Access Source로 포함된 가상 머신에서,  

Route 53 Global Resolver를 선택하여, 'zigispace.net' 도메인 질의를 하면 정상적으로 결과가 나옵니다.

 

반면, DNS View에서 Access Source에 포함되지 않은 가상 머신에서 동일하게

Route 53 Global Resolver를 선택하여, 'zigispace.net' 도메인 질의를 하면, timed out이 발생합니다.

 

 

다음은 DNS View에서 DNS Firewall rules를 적용해봅니다.

DNS Firewall rules에서 새로운 rule을 생성합니다.

 

 

'ZIGI-DNS-FW-Rules'라는 이름으로 설정하고, 

Rule 설정 Type은 Customer managed domain lists 로 하여 생성합니다.

이제 실제 Firewall rules에 적용될 Domain List를 지정해야 하는 데, 

아직 만든 Domain Lists가 없기 때문에 'Create Domain List'를 선택해서, 도메인 리스트를 먼저 만듭니다.

 

도메인 리스트도, 사용할 이름만 지정하고 바로 만듭니다.

 

도메인 리스트에서, 이제 실제 접근을 제어할 도메인을 추가합니다.

 

도메인을 추가하는 것은 기본적인 S3 버킷을 활용하셔도 되고, 

특정 도메인을 하단 Domains 항목에 작성 후에 도메인 생성을 진행합니다.

본 포스팅에서는 google.com과 zigispace.net을 예시로 넣었습니다.

 

도메인 리스트 항목 하단에 Domain 이란 곳에서 등록한 도메인 주소를 확인할 수 있습니다.

 

그럼 이제 다시 앞으로 돌아와서, 

Domain lists 에 방금까지 생성한 ZIGI-Deny-Domain-List를 추가합니다.

 

해당 도메인에 매칭되는 경우에 Rules 설정을 Block으로 차단 설정을 겁니다.

 

정상적으로 DNS Firewall rules가 생성된 것을 볼 수 있습니다.

 

먼저 DNS Firewall rules 설정이 완료되기 전에 

google.com 과 zigispace.net을 질의하면 정상적으로 나오는 것을 볼 수 있습니다.

 

 

하지만, 도메인 리스트에서 차단 옵션이 걸고 나면, 

zigispca.net과 google.com에 대한 레코드 조회가 안되는 것을 확인 할 수 있습니다.

 

 

반면, 차단 리스트 항목에 포함되지 않은 도메인은 동일한 가상서버 환경에서 정상적으로 도메인 질의가 되는 것을 볼 수 있습니다.

 

 

Rule configuration에서 차단하는 도메인에서 대해서

옵셔널한 설정으로 Query Type을 설정하면, 해당 쿼리에 대해서만도 제어가 가능합니다.

여기에서는  IPv6에서 사용되는 AAAA 레코드만 설정에 반영하였습니다.

 

이제 다시 동일하게 google.com으로 도메인 질의를 하면,

AAAA 레코드에 대해서만 Block 하도록 설정하였기 때문에

IPv6 주소(AAAA레코드)는 응답하지 않고, IPv4 주소(A 레코드)만 응답하는 것을 볼 수 있습니다.