today keys : conditional forward, 조건부 전달, dns, dnsmasq, rhel, 레드햇, redhat, split, 도메인, 질의, domain
리눅스 서버를 운영하다 보면,
일반적인 도메인 조회는 기본 DNS 서버로 보내되,
특정 도메인만 별도의 DNS 서버로 조회해야 하는 경우가 있습니다.
예를 들면 이런 경우입니다.
사내 서비스 도메인만 내부 DNS로 조회해야 하는 경우
특정 사설 존(example.local, corp.internal)만 별도 DNS로 보내야 하는 경우
특정 퍼블릭 도메인에 대해 별도의 네임서버 정책을 적용해야 하는 경우
이런 요구사항을 만족시키기 위해 흔히 떠올리는 방법이 systemd-resolved 기반 split DNS 구성인데,
실제로 NIC가 1개뿐인 단순 서버 환경에서는 이 방식이 기대만큼 직관적으로 동작하지 않는 경우가 많습니다.
이럴 때 더 단순하고 명확하게 적용할 수 있는 방법이 바로
dnsmasq 를 단독 로컬 DNS 포워더로 구성하는 방식입니다.
이번 포스팅에서는 RHEL 계열 리눅스 환경에서 dnsmasq 를 사용해
Conditional Forward(조건부 포워딩) 를 구성하는 방법에 대해서 알아봅니다.
본 포스팅의 구성 목표
- 일반 DNS 조회는 10.1.0.2 로 전송
- zigispace.net만 지정한 별도 DNS 서버로 전송
- 지정 DNS 10.2.0.61, 10.2.0.73
- 서버 내 모든 로컬 프로세스는 127.0.0.1 로 DNS 질의
- 로컬의 dnsmasq 가 실제 upstream DNS 서버를 선택해 포워딩
dnsmasq 설치 및 버전 확인
- RHEL 계열에서 dnf를 이용해서 dnsmasq 패키지를 다음과 같이 설치합니다.
sudo dnf install -y dnsmasq
dnsmasq --version

dnsmasq 설정 파일 생성
- dnsmasq의 설정 파일을 다음과 같이 생성합니다.
listen-address=127.0.0.1 # localhost에서만 DNS 요청을 받음.
bind-interfaces # dnsmasq가 지정한 주소(listen-address)에서만 동작
no-resolv # /etc/resolv.conf를 대신에 이 파일에서 server 값만 사용
server=10.1.0.2 # 일반 도메인에 대한 기본 DNS 정보
server=/zigispace.net/10.2.0.61 # Conditional forward로 사용할 도메인과 DNS 정보
server=/zigispace.net/10.2.0.73
log-queries # 로그 기록
log-facility=/var/log/dnsmasq.log # 로그 파일 위치 지정
cache-size=1000 # 로컬 DNS 캐시 크기

dnsmasq 설정 파일 문법 검사
- dnsmasq의 설정 파일이 문법적으로 이상 없는지 확인합니다.

dnsmasq 서비스 구동 및 구동 상태 확인
- dnsmasq의

- 53번 Port가 정상적으로 Listening 상태인지 확인

NetworkManager의 DNS 관리 비활성화
- NetworkManager가 /etc/resolv.conf 를 갱신하지 않도록 DNS 관리를 Off 합니다.
- 설정을 적용하고 나면, 마지막 확인 명령어에서 dns=none으로 표기되야 합니다.
$ sudo tee /etc/NetworkManager/conf.d/90-dns-none.conf > /dev/null <<'EOF'
[main]
dns=none
EOF
$ sudo systemctl reload NetworkManager
$ NetworkManager --print-config | grep -i '^dns='

/etc/resolv.conf를 로컬 dnsmasq로 변경
- 시스템이 DNS 질의를 로컬 dnsmasq로 보내도록 /etc/resolv.conf 에서 nameesrver 설정을 '127.0.0.1'로 수정합니다.

dnsmasq로 conditional forward 동작 점검
- dnsmasq 설정 파일에 없는 일반 도메인의 경우, 원래 DNS를 통해서 일반 결과 값을 받아옵니다.
- dnsmasq 설정 파일에서 별도 dns를 바라보도록 설정한 'zigispace.net' 도메인은 지정한 dns를 통해서 결과 값을 받아옵니다.
- 실제 설정한 도메인으로 서비스를 호출하면, 별도로 설정한 IP를 통해서 서비스 접속을 하게 됩니다.

- dnsmasq. 로그를 통하면, 실제 질의한 dns 정보까지 함께 확인이 가능합니다.
- 아래 결과를 보면, 'zigispace.net'의 경우, 지정한 dns인 10.2.0.61 / 10.2.0.73으로 forward되어서, 결과를 받아오는 것을 볼 수 있습니다.

- 지정되지 않은 일반 도메인은 원래 서버에서 바라보던 dns로 forward되어서 결과 값을 받아옵니다.
