RHEL을 설치하면 기본적으로 설치되는 dnsmasq를 이용해서 쉽게 사용할 수 있는 dns 및 dhcp 서버를 신속하게 구성할 수 있다.

그외에도 tftp서버나 dns caching서버로도 구성이 가능하다.

production으로 사용하기보다는 테스트 환경 구성이나 한개의 도메인을 사용하는 중소규모의 회사에서 활용할 수 있는 방법이다.

특히 dns서버의 경우 zone 파일을 생성하고 관리하는 것이 좀 번거로운 일인데 dnsmasq를 이용하면 /etc/hosts 파일을 이용해서 zone 파일의 관리를 쉽게 할 수 있다.

RHEL의 경우 KVM 하이퍼바이저 호스트로 설치를 하면 libvirtd 가 설치가 되면서 libvirtd에서 관리하는 가상화네트워크의 dhcp 서비스를 dnsmasq로 제공하고 있다.

그래서 dnsmasq 설정을 따로 해서 기동할 경우 dns 서비스를 제공하는 53포트가 사용 중이라고 기동 실패가 된다.

이런 부분을 우회해서 구성하는 방법에 대해서 얘기하자면,

/etc/dnsmasq.conf 설정 중에 서비스와 bind를 할 interface를 지정할 수 있게 되어 있는데 이것을 이용하면 libvirtd가 사용하는 dnsmasq 서비스와 별개로 자신만의 dnsmasq 서비스를 기동할 수 있다.

아래를 보면 libvirtd가 기동된 상태에서는 default 네트워크(virbr0, 192.168.122.0/24)에 대한 dhcp 서비스를 제공하는 dnsmasq 프로세스가 확인이 됩니다. netstat 명령으로 open된 포트도 확인이 가능하다.

[wchoi@wchoi2 ~]$ sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
    Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
      Active: active (running) since Thu 2020-01-09 09:33:59 KST; 36min ago
        Docs: man:libvirtd(8)
                  https://libvirt.org
Main PID: 5449 (libvirtd)
      Tasks: 19 (limit: 32768)
   Memory: 69.7M
         CPU: 2.134s
    CGroup: /system.slice/libvirtd.service
                 ├─1320 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/lib>
                 ├─1321 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/lib>
                 └─5449 /usr/sbin/libvirtd --timeout 120

Jan 09 09:33:59 wchoi2.usresys.redhat.com systemd[1]: Starting Virtualization daemon...
Jan 09 09:33:59 wchoi2.usresys.redhat.com systemd[1]: Started Virtualization daemon.
Jan 09 09:33:59 wchoi2.usresys.redhat.com dnsmasq[1320]: read /etc/hosts - 6 addresses
Jan 09 09:33:59 wchoi2.usresys.redhat.com dnsmasq[1320]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
Jan 09 09:33:59 wchoi2.usresys.redhat.com dnsmasq-dhcp[1320]: read /var/lib/libvirt/dnsmasq/default.hostsfile

 

[wchoi@wchoi2 ~]$ sudo netstat -natplu | grep dns
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1320/dnsmasq
udp 0 0 192.168.122.1:53 0.0.0.0:* 1320/dnsmasq
udp 0 0 0.0.0.0:67 0.0.0.0:* 1320/dnsmasq

dns와 달리 dhcp 서비스의 경우 0.0.0.0 주소로 binding해서 서비스를 하고 있는 것을 볼 수 있다.

 

virbr1 bridge를 통해서 연결되는 VM들에게 dns 및 dhcp서비스를 제공하기 위해서 아래와 같이 virbr0를 제외하고 virbr1으로 interface binding을 하게 설정하고 example.com 도메인 및 192.168.25.10 ~ 20까지의 ip대역을 dhcp 서비스를 할 수 있게 아래와 같이 설정해봤다.

[wchoi@wchoi2 ~]$ egrep -v '^#|^$' /etc/dnsmasq.conf
local=/example.com/
server=10.64.255.25                    --> 상위 dns 서버, /etc/resolv.conf에 등록되어 있지 않은 DNS서버 지정
server=10.68.5.26
user=dnsmasq
group=dnsmasq
interface=virbr1
except-interface=virbr0
listen-address=192.168.25.1              --> 서비스할 IP
no-dhcp-interface=virbr0
bind-interfaces

expand-hosts                                      --> 자동으로 아래 설정된 domain example.com을 호스트 이름 뒤에 연결
domain=example.com,192.168.25.20,192.168.25.50                            --> 192.168.25.20~50대역만 example.com 도메인 적용 
domain=openshift.example.com,192.168.25.10,192.168.25.19             --> 192.168.25.10~19까지는 openshift.example.com 도메인
dhcp-range=192.168.25.10,192.168.25.50,164h
dhcp-host=52:54:00:96:d4:61,192.168.25.10                                         --> MAC 
dhcp-host=52:54:00:4f:33:36,192.168.25.11

dhcp-host=aio                                                                                          --> hosts 파일에 등록된 호스트이름기준으로 서비스
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig

 

설정 후 dnsmasq 서비스를 기동하면 /etc/hosts 파일에서 6개의 등록된 호스트 정보를 읽어온다.

/etc/hosts 파일을 업데이트 한 경우 dnsmasq 서비스를 재시작해줘야 한다.

[wchoi@wchoi2 ~]$ sudo systemctl status dnsmasq
● dnsmasq.service - DNS caching server.
Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2020-01-09 10:19:36 KST; 5s ago
Main PID: 7310 (dnsmasq)
Tasks: 1 (limit: 37796)
Memory: 700.0K
CPU: 6ms
CGroup: /system.slice/dnsmasq.service
└─7310 /usr/sbin/dnsmasq -k

Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: using nameserver 10.64.255.25#53
Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: using local addresses only for domain example.com
Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: reading /etc/resolv.conf
Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: using nameserver 10.68.5.26#53
Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: using nameserver 10.64.255.25#53
Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: using local addresses only for domain example.com
Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: using nameserver 10.64.255.25#53
Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: using nameserver 10.68.5.26#53
Jan 09 10:19:36 wchoi2.usresys.redhat.com dnsmasq[7310]: read /etc/hosts - 6 addresses

 

[wchoi@wchoi2 ~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

10.64.168.116 host6

192.168.25.1 wchoi2.example.com
192.168.25.2 aio.example.com
192.168.25.10 master.example.com

 

dig 명령으로 dns 정보를 확인해보면,

[wchoi@wchoi2 ~]$ dig @192.168.25.1 master.example.com
; <<>> DiG 9.11.13-RedHat-9.11.13-3.fc31 <<>> @192.168.25.1 master.example.com; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13862;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;master.example.com. IN A
;; ANSWER SECTION:master.example.com. 0 IN A 192.168.25.10
;; Query time: 0 msec;; SERVER: 192.168.25.1#53(192.168.25.1);; WHEN: Thu Jan 09 13:42:29 KST 2020;; MSG SIZE  rcvd: 63

 

[wchoi@wchoi2 ~]$ dig @192.168.25.1 -x 192.168.25.10
; <<>> DiG 9.11.13-RedHat-9.11.13-3.fc31 <<>> @192.168.25.1 -x 192.168.25.10; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27413;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;10.25.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:10.25.168.192.in-addr.arpa. 0 IN PTR master.example.com.
;; Query time: 0 msec;; SERVER: 192.168.25.1#53(192.168.25.1);; WHEN: Thu Jan 09 13:42:48 KST 2020;; MSG SIZE  rcvd: 87 

 

libvirt KVM 환경에서는 dnsmasq 설정을 /var/lib/libvirt/dnsmasq/ 에 구성된 가상network이름으로 설정된 파일을 수정해서 사용할 수 있으니 참고하시기 바람.
대신 해당 네트워크에 대해서 virsh net-edit 와 같은 명령을 사용하면 reset 이 되니 주의가 필요하다.

dnsmasq를 이용한 간단 DNS+DHCP 서버 구성 (KVM 환경을 고려한)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다