이번 포스팅에서는 GCP의 Cloud DNS를 이용해서 원격지의 DNS 서버에 질의할 수 있는 Forwarding zone을 만들어 보겠습니다.
Forwarding zone은 Google cloud의 Network가 가지고 있는 Internal DNS Server가 아닌 On-premise나 다른 VPC의 DNS Server를 이용하고자 DNS query를 forwarding하고 싶을때 사용할 수 있습니다.
이 DNS query를 다른 곳으로 Forwarding하는 것을 DNS Forwarding이라고 하며, 이 기능 덕분에 여러 환경의 Network를 연결해 구성하더라도 원하는 DNS Server를 이용할 수 있습니다.
DNS Forwarding은 다른 네트워크와의 연결을 전제로 하기 때문에 On-prem 역할을 하는 AWS VPC와의 연결을 예제로 들어보겠습니다.
1. DNS Forwarding?
DNS Forwarding을 구성해보기 전에 무엇인지부터 자세히 알아보고 가겠습니다.
본래 GCP의 DNS 리졸버는 메타데이터 서버라고 불리는 Internal DNS 서버가 담당하고 있습니다.
즉 GCP 네트워크 내의 모든 VM은 메타데이터 서버가 DNS 쿼리를 수행하고 있습니다.
우리가 GCP의 VPC Network으로만 구성되어 있는 환경을 이용한다면 이로 충분하겠지만 많은 경우 On-prem, 혹은 다른 VPC와의 연결로 구성된 환경을 이용해야 할 경우도 존재합니다.
이 경우에 GCP의 VPC Network가 아닌 원격지의(다른 Network의) DNS 서버를 DNS 리졸버로 이용해야 할 경우도 발생합니다.
하지만 GCP의 모든 VM들은 언급했다시피 메타데이터 서버를 DNS 리졸버로 이용하고 있기 때문에, 원격의 다른 어딘가를 DNS 서버로 지정하는 행위가 필요할 것입니다.
이 때 DNS서버를 메타데이터 서버가 아닌 다른 곳으로 지정해 VM의 특정 DNS 쿼리를 보내는 위치를 지정하는 것이 DNS Forwarding입니다.
GCP에서 DNS Forwarding은 Cloud DNS에서 설정할 수 있습니다.
2. Architecture
DNS Forwarding을 이용하는 대략적인 구성은 위와 같습니다.
GCP의 VPC Network와 On-prem을 VPN으로 연결한 환경에서 On-prem 네트워크 내부의 DNS Server를 GCP VPC Network의 VM이 이용하도록 하고 싶은 상황입니다.
원하는 GCP VPC Network에서 Cloud DNS의 Forwarding zone을 생성하는 것으로 지정된 곳으로 DNS 쿼리를 포워딩할 수 있습니다.
위 아키텍쳐에서 Forwarding zone을 생성한 VPC Network A는 On-pre datacenter Network의 DNS Servers로 DNS 쿼리를 보내게 됩니다.
3. Hands-on
실제 DNS Forwarding의 동작을 알아보기 위해 Network 환경을 구성하겠습니다.
우선 On-prem 역할을 할 AWS VPC Network를 구성합니다.
3-1. AWS Inbound endpoint
우선 GCP에서 포워딩을 통해 사용할 Private DNS Record를 AWS 환경에서 생성합니다.
AWS는 Route53을 통해 DNS 관련 서비스를 제공하고 있습니다.
Route53에서 Private DNS Record를 생성합니다.
특정 EC2 인스턴스로 향하는 DNS Record를 아래와 같이 생성했습니다.
AWS도 GCP와 같이 내부의 DNS서버를 통해 DNS resolution을 수행하고 있습니다. 이번 포스팅에서 포워딩하고자 하는 DNS 서버가 AWS의 내부 DNS 서버입니다.
기본적으로 AWS의 내부 DNS 서버는 AWS VPC Network 내의 VM만 이용할 수 있지만 Inbound endpoint를 생성하는 것으로 외부에서 접근하도록 IP를 노출할 수 있습니다. Inbound endpoint를 생성해 DNS서버를 GCP에서 접근할 수 있도록 설정합니다.
마찬가지로 Route53에서 Inbound endpoint를 생성할 수 있습니다. 2개의 IP가 DNS서버에 할당된 것을 볼 수 있습니다.
3-2. Forwarding zone 생성
이제 GCP 측으로 넘어와서 Forwarding zone을 생성해 DNS 쿼리를 AWS의 DNS서버로 보내도록 합니다.
Cloud DNS에서 Forwarding zone을 생성할 수 있습니다.
CREATE ZONE 페이지로 진입하면 아래와 같은 생성 창을 볼 수 있습니다.
Zone type : DNS레코드의 Private,Public 타입에 따라서 지정합니다.
Zone name : Zone을 식별하기 위한 값으로 원하는 값을 입력합니다.
DNS name : Forwarding에 사용할 DNS name을 입력합니다.
Options : DNS Forwarding을 사용하기 위해 "Forward quries to another server"를 지정합니다.
Networks : Forwarding을 이용할 VPC Network를 지정합니다.
아래 Destination DNS servers에서 AWS의 inbound endpoint에서 생성한 IP 주소 2개를 입력합니다. Private forwarding을 이용하기 위해 Enable에 체크합니다.
설정을 모두 마치고 Create 버튼을 눌러 Forwarding zone을 생성합니다.
주의사항
주의해야 할 점은 DNS Forwarding을 이용할시, GCP는 35.199.192.0/19 IP 주소 범위를 Source로 원격지 DNS Server에 쿼리문을 Forwarding한다는 것입니다.
그렇기 때문에 DNS Server가 위치한 네트워크는 위의 주소 범위를 허용하도록 Firewall을 설정해야 합니다.
추가적으로, 연결된 네트워크가 35.199.192.0/19 주소 범위를 인지하도록 Advertise하는 과정이 필요합니다.
GCP와 AWS 간의 VPN 연결 환경에서는 Cloud Router에서 이 과정을 수행할 수 있습니다.
Forwarding Zone을 생성하면 아래와 같이 Zone list에 생성한 Zone이 추가됩니다.
이후 Forwarding Zone을 생성한 Network에 있는 VM에서 지정된 도메인 네임을 호출하면 응답이 오는 것을 볼 수 있습니다.
+ DNS Peering
DNS 피어링을 사용하면 다른 GCP VPC Network에게 DNS 레코드 요청을 전달할 수 있습니다.
그럼으로써 GCP의 VPC Network들은 DNS Forwarding을 각각 구성할 필요 없이, 하나의 네트워크에만 Forwarding zone을 구성하고 나머지 VPC Network는 DNS 피어링을 통해 Forwarding Zone을 이용하게 할 수 있습니다.
주의해야 할 점은, DNS Peering은 단방향 관계를 맺는다는 것입니다. Peering에서 쿼리를 요청하는 네트워크는 DNS 레코드를 가진 네트워크에게 요청을 보낼 수는 있지만 반대는 성립하지 않습니다.
DNS Peering 또한 DNS Forwarding Zone과 같이 Cloud DNS의 생성 페이지에서 생성할 수 있습니다.
Options : DNS Peering을 사용하기 위해 "DNS Peering"을 지정합니다.
Networks : DNS Peering에서 DNS 레코드를 요청할 네트워크를 지정합니다.
Peer project : DNS 레코드를 가지고 있는 네트워크의 프로젝트를 지정합니다.
Peer network : DNS 레코드를 가지고 있는 네트워크를 지정합니다.
CREATE 버튼을 누르면 아래와 같이 Zone 리스트에 DNS Peering이 추가된 것을 볼 수 있습니다.
4. Conclusion
최종적으로 AWS VPC 네트워크와 Forwarding Zone을 구성한 GCP VPC 네트워크 A, 그리고 네트워크 B와 DNS
Peering을 맺은 GCP VPC 네트워크 B로 구성된 아키텍쳐를 구성할 수 있었습니다.
이로써 GCP VPC 네트워크 B는 AWS VPC 네트워크와 직접적인 연결이 없음에도 AWS의 DNS server를 이용할 수 있게 됩니다.
이렇게 DNS Forwarding와 DNS Peering을 사용하면 단일 DNS server 운영으로도 확장성 있는 네트워크를 구축할 수 있습니다.
'GCP' 카테고리의 다른 글
GCP Cloud armor의 DDoS protection 기능 사용 및 검증 (0) | 2021.10.07 |
---|---|
Function Framework를 이용해 local 환경에서 Cloud function을 사용해보자 (0) | 2021.07.24 |
GKE CNI Performance benchmark(2021-06-10) (0) | 2021.06.10 |
GCP Compute Engine에 Gitlab 서버 구축 + VS Code 연동하기 (0) | 2021.05.19 |
GCP Instance Metadata를 100% 활용하는 방법 (0) | 2021.04.27 |