Setup local wildcard DNS resolution on Ubuntu
Say you have a local nginx or traefik, routing traffic to multiple Vaadin apps
based on a hostname, and you want to resolve *.foo.fake
to 127.0.0.1
to test
http://app1.foo.fake routes to app1 and http://app2.foo.fake routes to app2.
The easiest way is to add entries to /etc/hosts
but
/etc/hosts does not support wildcard dns entries.
The simplest solution is to add both app1.foo.fake
and app2.foo.fake
to /etc/hosts
,
but that can be tedious when there are many such apps.
A better solution is to use dnsmasq:
$ sudo apt install dnsmasq
$ sudo vim /etc/dnsmasq.conf # add address=/foo.fake/127.0.0.1
$ systemctl reload dnsmasq
Unfortunately, this is not enough:
$ ping foo.fake
ping: foo.fake: Name or service not known
$ host foo.fake
Host foo.fake not found: 3(NXDOMAIN)
The reason is that systemd-resolved is in charge of DNS resolution and it
won’t use your local dnsmasq automatically, as can be seen via resolvectl status
.
Also see Linux DNS.
The solution is to force systemd-resolved
to use the local dnsmasq server.
Edit /etc/systemd/resolved.conf
and set DNS=127.0.0.1
.
Then, restart systemd-resolved
and check that your DNS server is now in effect:
$ sudo systemctl restart systemd-resolved
$ resolvectl status
$ host app1.foo.fake
app1.foo.fake has address 127.0.0.1