로컬 DNS 구성하기 (Route 53 Resolver)
아키텍처 개요
아이피 대역이 다른 서로 다른 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 서버 구성
10.0.0.0/16
VPC 생성
- 이름: Cloud-vpc
10.0.0.0/24
퍼블릭 서브넷 - rt: loca, igw, vgw10.0.10.0/24
프라이빗 서브넷 - rt: local, vgw10.0.11.0/24
프라이빗 서브넷 - rt: local, vgw
- 인스턴스 생성
- 이름: Cloud-EC2
- 이미지: 아마존 리눅스2 AMI (HVM)
- 서브넷: 10.0.0.0/24 퍼블릭 서브넷
- 보안그룹
- SSH 내 IP
- ALL ICMP 192.168.0.0/16
On-Premise 서버 구성
192.168.0.0/16
VPC 생성
- 이름: Onprem-vpc
192.168.0.0/24
퍼블릭 서브넷 - rt: local, igw192.168.10.0/24
프라이빗 서브넷 - rt: local,10.0.0.0/16
-> eni (DNS서버),0.0.0.0/0
-> NAT192.168.11.0/24
프라이빗 서브넷 - rt: local,10.0.0.0/16
-> eni (DNS서버),0.0.0.0/0
-> NAT
- 퍼블릭 서브넷에 NAT Gateway 생성
- 퍼블릭 서브넷에 VPN Server 생성
- 이름: Onprem-VPN
- 이미지: 아마존 리눅스2 AMI (HVM)
- 보안그룹
- SSH 내 IP
- ALL ICMP
192.168.0.0/16
- UDP 53
192.168.0.0/16
- 소스 / 데스티네이션 비활성화
- Elastic IP 생성 - VPN 서버에 부착
- Virtual Private Gateway 생성 및 Cloud VPC 부착
- Customer Gateway 생성
- Name: Onprem-cgw
- BGP ASN: 65000
- IP Address: VPN 서버 인스턴스 elastic IP
- 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
- cloud 프라이빗 서브넷, cloud 퍼블릭 서브넷 Route Propagation vgw Enable 설정 (라우팅 테이블 - 라우팅 전파)
- on-premise VPC의 프라이빗 서브넷의 라우팅 테이블에서 VPN 서버로 향하는 VPN 트래픽을 VPN 서버로 향하도록 지정 (즉 10.0.0.0/16으로 나가는 트래픽을 VPN-SERVER의 ENI로 지정)
- 기존 local과 0.0.0.0 -> nat gateway
- 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
- VPN 터널 UP 확인
- 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
- Cloud-vpc에 DNS resolution and Enable DNS 호스트 네임 활성화
- Cloud-vpc에 Route 53 프라이빗 영역 생성 (cloud.com)
- A 레코드 생성
- 레코드 이름: app.cloud.com
- 레코드 값: cloud EC2 Private IP (10.0.0.222)
- TTL: 60
- 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
- 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
- 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
- 보안그룹 생성
- VPC: Cloud-vpc
- 이름: inbound-outbound-resolve
- 인바운드: UDP 53 192.168.0.0/16
- Route 53 Resolver 인바운드 엔드포인트 생성
- 인바운드 only
- 이름: inbound-endpoint
- 엔드포인트 유형: IPv4
- VPC: Cloud-vpc
- 보안그룹 (위에서 만든 보안그룹)
- 가용영역 A / 서브넷: 10.0.10.0/24
- 가용영역 B / 서브넷: 10.0.11.0/24
- DNS 서버 접속
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
- APP 서버 접속
[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
- 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
- 규칙 생성
- 이름: onprem-rule
- 규칙 유형: 전달
- 도메인 이름: onprem.com
- VPC: Cloud-vpc
- 아웃바운드 엔드포인트: 위에서 생성한 아웃바운드 엔드포인트
- Target IP Addresses:
192.168.10.122
(DNS 서버 IP) / Port: 53
- Cloud-EC2 서버 접속
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