Box

Allgemein

Profil

Local DNS on MacOS X for developers » Historie » Zyklus 1

Peter Pfläging, 12.04.2023 09:18

1 1 Peter Pfläging
# Local DNS on MacOS X for developers
2
3
Sometimes you have the need of local DNS names. Typical this is in local development of VM's or kubernetes services.
4
5
The common method we are all using is to make entries in `/etc/hosts`.
6
7
I don't like this for a couple of reasons:
8
9
- it's easy to blow up the file and get problems after your next reboot
10
- this file is `root` only, though you have to edit it with sudo :-(
11
12
There should be a better way!
13
14
## Solution 
15
16
- Mac OS X resolver is capable to use multiple DNS servers very easily.
17
- There's a very lightweight and easy to configure DNS server: [dnsmasq](https://thekelleys.org.uk/dnsmasq/doc.html)
18
19
## Implementation
20
21
1. Install dnsmasq with [homebrew](https://brew.sh): `brew install dnsmasq`
22
1. configure it:
23
  
24
     ```shell
25
     cp /opt/homebrew/etc/dnsmasq.conf  /opt/homebrew/etc/dnsmasq.conf.orig
26
     echo "conf-dir=/opt/homebrew/etc/dnsmasq.d/,*.conf" | tee /opt/homebrew/etc/dnsmasq.conf
27
     ```
28
29
1. generate at least one DNS file in `/opt/homebrew/etc/dnsmasq.d/`:
30
31
     local.conf:
32
33
     ```conf
34
     # 192.168.50 is my local WLAN
35
     # for Parlament VM's (macbook air)
36
     address=/testvm1.local/192.168.50.47
37
     address=/testvm2.local/192.168.50.152
38
     address=/testvm3.local/192.168.50.32
39
     # testvm has 3 addresses
40
     address=/testvm.local/192.168.50.47
41
     address=/testvm.local/192.168.50.152
42
     address=/testvm.local/192.168.50.32
43
     # 192.168.205 is UTM.app local
44
     # local machines here
45
     address=/alma-arm-vm.local/192.168.205.7
46
     address=/alma-intel-vm.local/192.168.205.8
47
     # 192.168.254 is VMWare Fusion local
48
     address=/almavm.local/192.168.254.129
49
     ```
50
51
     pflaeging.net.conf:
52
53
     ```conf
54
     # 192.168.254 is VMWare Fusion local
55
     address=/gubernat1.pflaeging.net/192.168.254.130
56
     address=/ms1.pflaeging.net/192.168.254.131
57
     # this is a wildcard
58
     address=/.gubernat1.pflaeging.net/192.168.254.130
59
     # 192.168.50 is my local WLAN
60
     # gubernat VM's on MacBook Air
61
     address=/rhel9-gubernat.pflaeging.net/192.168.50.173
62
     # this is a wildcard
63
     address=/.rg.pflaeging.net/192.168.50.173
64
     ```
65
66
1. start your dnsmasq service: `sudo brew services start dnsmasq``
67
68
1. make Mac OS ready for a custom resolver: `sudo mkdir -p /etc/resolver`
69
70
1. set a pointer to your new resolvers and make them in high priority:
71
72
     contents of `/etc/resolver/local` (filename equals domain!):
73
74
     ```conf
75
     nameserver 127.0.0.1
76
     search_order 1
77
     ````
78
79
     Then create a file for each domain you configured above with the same content.
80
     (in this use case it would be `/etc/resolver/pflaeging.net`)
81
82
1. to be sure everythings working kick the original resolver and clean the caches:
83
84
     ```shell
85
     sudo dscacheutil -flushcache
86
     sudo killall -HUP mDNSResponder
87
     ```
88
89
1. when I change or add things in my dnsmasq config I'm restarting the dnsmasq job. This is not required but the easiest way: `sudo pkill dnsmasq`
90
91
## Debugging
92
93
- Show resolver config: `scutil --dns`
94
- Query the DNS resolver from the commandline: ` dscacheutil -q host -a name myfunnyname.domain.net` 
95
- Query the local dnsmasq instance: `dig myfunnyname.domain.net @localhost`