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 이 되니 주의가 필요하다.