Hi, I have an IPv6 only host arrowhead.ip6.centroid.eu, that has very noisy: Oct 29 09:12:48 arrowhead ntpd[18744]: DNS lookup tempfail Oct 29 09:21:45 arrowhead last message repeated 2 times
in fact: arrowhead# grep 'DNS lookup tempfail' /var/log/daemon | wc -l 1354 This is because the pool.ntp.org servers as configured don't give back AAAA answers. I'm trying to streamline this a little and only ask for AAAA queries if there is no v4 connectivity. With change of the 'stdio dns' pledge to 'stdio inet dns' this is possible, when using another constraint from google. There is no network traffic, just a route lookup if IPv4 is possible at all. Here is my patch, under my sig. -peter Index: config.c =================================================================== RCS file: /cvs/src/usr.sbin/ntpd/config.c,v retrieving revision 1.32 diff -u -p -u -r1.32 config.c --- config.c 7 Jul 2019 07:14:57 -0000 1.32 +++ config.c 6 Nov 2019 07:36:07 -0000 @@ -30,8 +30,9 @@ #include "ntpd.h" -struct ntp_addr *host_ip(const char *); -int host_dns1(const char *, struct ntp_addr **, int); +struct ntp_addr *host_ip(const char *); +int host_dns1(const char *, struct ntp_addr **, int); +static int test_v4_gw(void); static u_int32_t maxid = 0; static u_int32_t constraint_maxid = 0; @@ -59,7 +60,7 @@ host_ip(const char *s) struct ntp_addr *h = NULL; memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; + hints.ai_family = (test_v4_gw() == 0) ? AF_UNSPEC : AF_INET6; hints.ai_socktype = SOCK_DGRAM; /*dummy*/ hints.ai_flags = AI_NUMERICHOST; if (getaddrinfo(s, "0", &hints, &res) == 0) { @@ -94,7 +95,7 @@ host_dns1(const char *s, struct ntp_addr struct ntp_addr *h, *hh = NULL; memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; + hints.ai_family = (test_v4_gw() == 0) ? AF_UNSPEC : AF_INET6; hints.ai_socktype = SOCK_DGRAM; /* DUMMY */ hints.ai_flags = AI_ADDRCONFIG; error = getaddrinfo(s, NULL, &hints, &res0); @@ -181,3 +182,28 @@ new_constraint(void) return (p); } +static int +test_v4_gw(void) +{ + struct sockaddr_in sin; + socklen_t st = sizeof(struct sockaddr_in); + int so; + + so = socket(AF_INET, SOCK_DGRAM, 0); + if (so < 0) { + return 0; + } + + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = inet_addr(CONN_CONSTRAINT); + sin.sin_port = htons(53); + + if (connect(so, (struct sockaddr *)&sin, st) < 0) { + close(so); + return 0; + } + + close(so); + return 1; +} Index: ntp_dns.c =================================================================== RCS file: /cvs/src/usr.sbin/ntpd/ntp_dns.c,v retrieving revision 1.24 diff -u -p -u -r1.24 ntp_dns.c --- ntp_dns.c 27 Jun 2019 15:18:42 -0000 1.24 +++ ntp_dns.c 6 Nov 2019 07:36:07 -0000 @@ -98,7 +98,7 @@ ntp_dns(struct ntpd_conf *nconf, struct fatal(NULL); imsg_init(ibuf_dns, PARENT_SOCK_FILENO); - if (pledge("stdio dns", NULL) == -1) + if (pledge("stdio inet dns", NULL) == -1) err(1, "pledge"); probe_root(); @@ -170,7 +170,7 @@ dns_dispatch_imsg(struct ntpd_conf *ncon strlen(name) != len) fatalx("invalid %s received", str); if ((cnt = host_dns(name, nconf->status.synced, - &hn)) == -1) + &hn)) <= 0) break; buf = imsg_create(ibuf_dns, imsg.hdr.type, imsg.hdr.peerid, 0, Index: ntpd.h =================================================================== RCS file: /cvs/src/usr.sbin/ntpd/ntpd.h,v retrieving revision 1.146 diff -u -p -u -r1.146 ntpd.h --- ntpd.h 16 Jul 2019 14:15:40 -0000 1.146 +++ ntpd.h 6 Nov 2019 07:36:07 -0000 @@ -40,6 +40,7 @@ #define CONFFILE "/etc/ntpd.conf" #define DRIFTFILE "/var/db/ntpd.drift" #define CTLSOCKET "/var/run/ntpd.sock" +#define CONN_CONSTRAINT "8.8.8.8" /* to test connectivity */ #define INTERVAL_QUERY_NORMAL 30 /* sync to peers every n secs */ #define INTERVAL_QUERY_PATHETIC 60