diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-10-03 15:14:02 +1000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-10-04 19:04:29 +0200 |
commit | ff63ac922a4017de8a5d384b1c0be36433436ed8 (patch) | |
tree | 3aefa92d8c802acc2116f2136158c05efdc964cb /conf.c | |
parent | 9d66df9a9a45b9305a2daff8a3c09a28f2c78d83 (diff) | |
download | passt-ff63ac922a4017de8a5d384b1c0be36433436ed8.tar passt-ff63ac922a4017de8a5d384b1c0be36433436ed8.tar.gz passt-ff63ac922a4017de8a5d384b1c0be36433436ed8.tar.bz2 passt-ff63ac922a4017de8a5d384b1c0be36433436ed8.tar.lz passt-ff63ac922a4017de8a5d384b1c0be36433436ed8.tar.xz passt-ff63ac922a4017de8a5d384b1c0be36433436ed8.tar.zst passt-ff63ac922a4017de8a5d384b1c0be36433436ed8.zip |
conf: Add --dns-host option to configure host side nameserver
When redirecting DNS queries with the --dns-forward option, passt/pasta
needs a host side nameserver to redirect the queries to. This is
controlled by the c->ip[46].dns_host variables. This is set to the first
first nameserver listed in the host's /etc/resolv.conf, and there isn't
currently a way to override it from the command line.
Prior to 0b25cac9 ("conf: Treat --dns addresses as guest visible
addresses") it was possible to alter this with the -D/--dns option.
However, doing so was confusing and had some nonsensical edge cases because
-D generally takes guest side addresses, rather than host side addresses.
Add a new --dns-host option to restore this functionality in a more
sensible way.
Link: https://bugs.passt.top/show_bug.cgi?id=102
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'conf.c')
-rw-r--r-- | conf.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -829,6 +829,9 @@ static void usage(const char *name, FILE *f, int status) " --dns-forward ADDR Forward DNS queries sent to ADDR\n" " can be specified zero to two times (for IPv4 and IPv6)\n" " default: don't forward DNS queries\n" + " --dns-host ADDR Host nameserver to direct queries to\n" + " can be specified zero to two times (for IPv4 and IPv6)\n" + " default: first nameserver from host's /etc/resolv.conf\n" " --no-tcp Disable TCP protocol handler\n" " --no-udp Disable UDP protocol handler\n" " --no-icmp Disable ICMP/ICMPv6 protocol handler\n" @@ -1286,6 +1289,7 @@ void conf(struct ctx *c, int argc, char **argv) {"netns-only", no_argument, NULL, 20 }, {"map-host-loopback", required_argument, NULL, 21 }, {"map-guest-addr", required_argument, NULL, 22 }, + {"dns-host", required_argument, NULL, 24 }, { 0 }, }; const char *logname = (c->mode == MODE_PASTA) ? "pasta" : "passt"; @@ -1463,6 +1467,18 @@ void conf(struct ctx *c, int argc, char **argv) conf_nat(optarg, &c->ip4.map_guest_addr, &c->ip6.map_guest_addr, NULL); break; + case 24: + if (inet_pton(AF_INET6, optarg, &c->ip6.dns_host) && + !IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns_host)) + break; + + if (inet_pton(AF_INET, optarg, &c->ip4.dns_host) && + !IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns_host) && + !IN4_IS_ADDR_BROADCAST(&c->ip4.dns_host)) + break; + + die("Invalid host nameserver address: %s", optarg); + break; case 'd': c->debug = 1; c->quiet = 0; |