Skip to main content

로컬 DNS 구성하기 (Route 53 Resolver)

아키텍처 개요

LocalDNS2

아이피 대역이 다른 서로 다른 VPC를 생성하고 하나는 Cloud-vpc, 다른 하나는 Onprem-vpc로 동일하게 클라우드 위에 올라가지만 On-Premise로 가정하여 진행합니다. 클라우드와 온프레미스를 연결하기 위해서 Site-to-Site VPN으로 연결합니다.

가상 게이트웨이(VGW)와 Customer Gateway를 연결 후 VPN 연결 구성을 다운받아 온프레미스 VPC의 퍼블릭 서브넷에 위치한 Onprem-VPN 인스턴스에 적용하여 Customer Gateway VPN 라우터로 사용합니다.

다음 아래 핸즈온에서는 크게 두 가지 시나리오로 구분되며 하나는 Cloud-vpc에 Route 53 Resolver 인바운드 엔드포인트와 Route 53 Resolver 아웃바운드 엔드포인트를 사용하여 온프레미스 VPC에 위치한 인스턴스에서 Cloud VPC의 프라이빗 호스팅 영역 도메인을 쿼리하거나 Cloud-EC2 인스턴스에서 Onprem-DNS에서 설정한 도메인을 쿼리합니다.

다른 하나는 Onprem-DNS 인스턴스를 DNS 서버로 사용하며 Onprem-APP 서버에서 onprem.com에 대한 질의를 Onprem-DNS 인스턴스로 보내게 되며 응답으로 onprem.com의 A 레코드인 IP 정보를 응답받게 됩니다.


Cloud 서버 구성

  1. 10.0.0.0/16 VPC 생성
  • 이름: Cloud-vpc
  • 10.0.0.0/24 퍼블릭 서브넷 - rt: loca, igw, vgw
  • 10.0.10.0/24 프라이빗 서브넷 - rt: local, vgw
  • 10.0.11.0/24 프라이빗 서브넷 - rt: local, vgw
  1. 인스턴스 생성
  • 이름: Cloud-EC2
  • 이미지: 아마존 리눅스2 AMI (HVM)
  • 서브넷: 10.0.0.0/24 퍼블릭 서브넷
  • 보안그룹
    • SSH 내 IP
    • ALL ICMP 192.168.0.0/16

On-Premise 서버 구성

  1. 192.168.0.0/16 VPC 생성
  • 이름: Onprem-vpc
  • 192.168.0.0/24 퍼블릭 서브넷 - rt: local, igw
  • 192.168.10.0/24 프라이빗 서브넷 - rt: local, 10.0.0.0/16 -> eni (DNS서버), 0.0.0.0/0 -> NAT
  • 192.168.11.0/24 프라이빗 서브넷 - rt: local, 10.0.0.0/16 -> eni (DNS서버), 0.0.0.0/0 -> NAT
  1. 퍼블릭 서브넷에 NAT Gateway 생성
  2. 퍼블릭 서브넷에 VPN Server 생성
  • 이름: Onprem-VPN
  • 이미지: 아마존 리눅스2 AMI (HVM)
  • 보안그룹
    • SSH 내 IP
    • ALL ICMP 192.168.0.0/16
    • UDP 53 192.168.0.0/16
    • 소스 / 데스티네이션 비활성화
  1. Elastic IP 생성 - VPN 서버에 부착
  2. Virtual Private Gateway 생성 및 Cloud VPC 부착
  3. Customer Gateway 생성
  • Name: Onprem-cgw
  • BGP ASN: 65000
  • IP Address: VPN 서버 인스턴스 elastic IP
  1. Site-to-Site VPN 생성
  • cloud-onprem-vpn-connection
  • Customer Gateway ID: 위에서 생성한 onprem-cgw
  • 라우팅 옵션
    • Static IP prefixes: 192.168.0.0/16
    • Local IPv4 network CIDR: 192.168.0.0/16
    • Remote IPv4 network CIDR: 10.0.0.0/16
  1. cloud 프라이빗 서브넷, cloud 퍼블릭 서브넷 Route Propagation vgw Enable 설정 (라우팅 테이블 - 라우팅 전파)
  2. on-premise VPC의 프라이빗 서브넷의 라우팅 테이블에서 VPN 서버로 향하는 VPN 트래픽을 VPN 서버로 향하도록 지정 (즉 10.0.0.0/16으로 나가는 트래픽을 VPN-SERVER의 ENI로 지정)
  • 기존 local과 0.0.0.0 -> nat gateway
  1. on-premise VPN 서버 셋팅
sudo su -
sudo apt-get update
sudo apt-get install openswan -y

# Site-to-Site VPN 구성 다운로드
# Vendor: Openswan
# Platform: Openswan
# Software: Openswan 2.6.38+
# IKE version: ikev1

위 설정 파일대로 설정 진행 및
Tunnel1 수정
...
제거 auth=esp
수정 phase2alg=aes_gcm
수정 ike=aes256-sha1;modp1024
수정 leftsubnet=192.168.0.0/16
수정 rightsubnet=10.0.0.0/16

conn Tunnel1
authby=secret
auto=start
left=%defaultroute
leftid=15.152.187.230
right=15.152.0.10
type=tunnel
ikelifetime=8h
keylife=1h
phase2alg=aes_gcm
ike=aes256-sha1;modp1024
keyingtries=%forever
keyexchange=ike
leftsubnet=192.168.0.0/16
rightsubnet=10.0.0.0/16
dpddelay=10
dpdtimeout=30
dpdaction=restart_by_peer


sudo service ipsec start
[root@ip-192-168-0-62 ipsec.d]# service ipsec status
Redirecting to /bin/systemctl status ipsec.service
● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
Loaded: loaded (/usr/lib/systemd/system/ipsec.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2023-06-18 11:22:52 UTC; 3s ago
Docs: man:ipsec(8)
man:pluto(8)
man:ipsec.conf(5)
Process: 4142 ExecStartPre=/usr/sbin/ipsec --checknflog (code=exited, status=0/SUCCESS)
Process: 4136 ExecStartPre=/usr/sbin/ipsec --checknss (code=exited, status=0/SUCCESS)
Process: 3622 ExecStartPre=/usr/libexec/ipsec/_stackmanager start (code=exited, status=0/SUCCESS)
Process: 3620 ExecStartPre=/usr/libexec/ipsec/addconn --config /etc/ipsec.conf --checkconfig (code=exited, status=0/SUCCESS)
Main PID: 4160 (pluto)
Status: "Startup completed."
CGroup: /system.slice/ipsec.service
└─4160 /usr/libexec/ipsec/pluto --leak-detective --config /etc/ipsec.conf --nofork

Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: | setup callback for interface eth0:500 fd 15
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: loading secrets from "/etc/ipsec.secrets"
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: loading secrets from "/etc/ipsec.d/aws.secrets"
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: "Tunnel1" #1: initiating Main Mode
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: "Tunnel1" #1: STATE_MAIN_I2: sent MI2, expecting MR2
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: "Tunnel1" #1: STATE_MAIN_I3: sent MI3, expecting MR3
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: "Tunnel1" #1: Peer ID is ID_IPV4_ADDR: '15.152.0.10'
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: "Tunnel1" #1: STATE_MAIN_I4: ISAKMP SA established {a...24}
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: "Tunnel1" #2: initiating Quick Mode PSK+ENCRYPT+TUNNE...24}
Jun 18 11:22:52 ip-192-168-0-62.ap-northeast-3.compute.internal pluto[4160]: "Tunnel1" #2: STATE_QUICK_I2: sent QI2, IPsec SA esta...ve}
Hint: Some lines were ellipsized, use -l to show in full.


ping cloud서버-퍼블릭-ip 연결확인
ping 10.0.0.222
  1. VPN 터널 UP 확인

LocalDNS2

  1. on-premise APP 서버 설치 - 프라이빗 서브넷 (192.168.11.0/24)
  • 이름: Onprem-APP
  • 이미지: 아마존 리눅스2 AMI (HVM)
  • 보안그룹
    • 192.168.0.0./16 SSH
    • ALL IMCP 10.0.0.0/16
  1. Cloud-vpc에 DNS resolution and Enable DNS 호스트 네임 활성화
  2. Cloud-vpc에 Route 53 프라이빗 영역 생성 (cloud.com)

LocalDNS3

  1. A 레코드 생성
  • 레코드 이름: app.cloud.com
  • 레코드 값: cloud EC2 Private IP (10.0.0.222)
  • TTL: 60
  1. Cloud-EC2 접속 후 도메인 질의 확인 - app.cloud.com
[ec2-user@ip-10-0-0-222 ~]$ nslookup app.cloud.com
Server: 10.0.0.2
Address: 10.0.0.2#53

Non-authoritative answer:
Name: app.cloud.com
Address: 10.0.0.222
  1. Onprem-DNS 인스턴스 생성 - 프라이빗 서브넷 (192.168.10.0/24)
  • 이름: Onprem-DNS
  • 이미지: 아마존 리눅스2 AMI (HVM)
  • 보안그룹
    • SSH 192.168.0.0/16
    • DNS UDP 53 192.168.0.0/16
    • DNS UDP 53 10.0.0.0/16
sudo su
yum update -y
yum install bind bind-utils -y

vi /var/named/onprem.com.zone
...
$TTL 86400
@ IN SOA ns1.onprem.com. root.onprem.com. (
2013042201 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
; Specify our two nameservers
@ IN NS dnsA.onprem.com.
IN NS dnsB.onprem.com.
; Resolve nameserver hostnames to IP, replace with your two droplet IP addresses.
dnsA IN A 1.1.1.1
dnsB IN A 8.8.8.8
; Define hostname -> IP pairs which you wish to resolve
@ IN A 192.168.11.57
app IN A 192.168.11.57
# 앱 서버 프라이빗 아이피

vi /etc/named.conf
...
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
# DNS 인스턴스 private ip;
allow-transfer { localhost; 192.168.10.122; };
recursion yes;
forward first;
forwarders {
192.168.0.2;
};
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};

zone "onprem.com" IN {
type master;
file "/var/named/onprem.com.zone";
allow-update { none; };
};

service named restart
chkconfig named on
  1. APP 서버 접속
vi /etc/sysconfig/network-scripts/ifcfg-eth0
...
DNS1=dns서버 프라이빗 IP
sudo reboot

[ec2-user@ip-192-168-11-57 ~]$ ping app.onprem.com
...
PING app.onprem.com (192.168.11.57) 56(84) bytes of data.
64 bytes from ip-192-168-11-57.ap-northeast-3.compute.internal (192.168.11.57): icmp_seq=1 ttl=255 time=0.019 ms
64 bytes from ip-192-168-11-57.ap-northeast-3.compute.internal (192.168.11.57): icmp_seq=2 ttl=255 time=0.029 ms

[ec2-user@ip-192-168-11-57 ~]$ nslookup app.onprem.com
Server: 192.168.10.122
Address: 192.168.10.122#53

Name: app.onprem.com
Address: 192.168.11.57
  1. 보안그룹 생성
  • VPC: Cloud-vpc
  • 이름: inbound-outbound-resolve
  • 인바운드: UDP 53 192.168.0.0/16
  1. Route 53 Resolver 인바운드 엔드포인트 생성
  • 인바운드 only
  • 이름: inbound-endpoint
  • 엔드포인트 유형: IPv4
  • VPC: Cloud-vpc
  • 보안그룹 (위에서 만든 보안그룹)
  • 가용영역 A / 서브넷: 10.0.10.0/24
  • 가용영역 B / 서브넷: 10.0.11.0/24

LocalDNS4

  1. DNS 서버 접속

LocalDNS5

vi /etc/named.conf
...
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
allow-transfer { localhost; 192.168.10.122; };
recursion yes;
forward first;
forwarders {
192.168.0.2;
};
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};

zone "onprem.com" IN {
type master;
file "/var/named/onprem.com.zone";
allow-update { none; };
};

# cloud.com 추가
# 인바운드 엔드포인트 추가
zone "cloud.com" {
type forward;
forward only;
forwarders { 10.0.10.129; 10.0.11.53; };
};

sudo service named restart
  1. APP 서버 접속

LocalDNS6

[ec2-user@ip-192-168-11-57 ~]$ nslookup app.cloud.com
Server: 192.168.10.122
Address: 192.168.10.122#53

Non-authoritative answer:
Name: app.cloud.com
Address: 10.0.0.222
  1. Route 53 Resolver 아웃바운드 엔드포인트 생성
  • 보안그룹 생성
  • 이름: outbound-endpoint
  • 아웃바운드 룰: UDP 53 192.168.0.0/16
  • VPC: Cloud-vpc
  • 엔드포인트 유형: IPv4
  • 2개 프라이빗 서브넷 선택
  • 가용영역 A / 서브넷 10.0.10.0/24
  • 가용영역 B / 서브넷 10.0.11.0/24

LocalDNS7

  1. 규칙 생성
  • 이름: onprem-rule
  • 규칙 유형: 전달
  • 도메인 이름: onprem.com
  • VPC: Cloud-vpc
  • 아웃바운드 엔드포인트: 위에서 생성한 아웃바운드 엔드포인트
  • Target IP Addresses: 192.168.10.122 (DNS 서버 IP) / Port: 53
  1. Cloud-EC2 서버 접속

LocalDNS8

nslookup app.onprem.com
...
Server: 192.168.10.122
Address: 192.168.10.122#53

Name: app.onprem.com
Address: 192.168.11.57

ping app.onprem.com