]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: start to listen on ::1 by default, but don't consider it an error if it fails
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 3 Jun 2025 14:56:38 +0000 (16:56 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 1 Jul 2025 09:31:25 +0000 (11:31 +0200)
pdns/recursordist/pdns_recursor.cc
pdns/recursordist/rec-rust-lib/table.py
pdns/recursordist/rec-tcp.cc

index 8df1a3bf47af03331838bb6c3348f8c75975aee2..22607c192de02d36db5bb41967364734e461b643 100644 (file)
@@ -2710,7 +2710,7 @@ unsigned int makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log,
     if (socketFd < 0) {
       throw PDNSException("Making a UDP server socket for resolver: " + stringerror());
     }
-    logVec.emplace_back(address.toStringWithPort());
+
     if (!setSocketTimestamps(socketFd)) {
       SLOG(g_log << Logger::Warning << "Unable to enable timestamp reporting for socket" << endl,
            log->info(Logr::Warning, "Unable to enable timestamp reporting for socket"));
@@ -2776,13 +2776,19 @@ unsigned int makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log,
 
     socklen_t socklen = address.getSocklen();
     if (::bind(socketFd, reinterpret_cast<struct sockaddr*>(&address), socklen) < 0) { // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
-      throw PDNSException("Resolver binding to server socket on " + address.toStringWithPort() + ": " + stringerror());
+      int err = errno;
+      if (address != ComboAddress{"::1", defaultLocalPort}) {
+        throw PDNSException("Resolver binding to server socket on " + address.toStringWithPort() + ": " + stringerror(err));
+      }
+      log->info(Logr::Warning, "Cannot listen on this address, skipping", "proto", Logging::Loggable("UDP"), "address", Logging::Loggable(address), "error", Logging::Loggable(stringerror(err)));
+      continue;
     }
 
     setNonBlocking(socketFd);
 
     deferredAdds.emplace_back(socketFd, handleNewUDPQuestion);
     g_listenSocketsAddresses[socketFd] = address; // this is written to only from the startup thread, not from the workers
+    logVec.emplace_back(address.toStringWithPort());
   }
   if (doLog) {
     log->info(Logr::Info, "Listening for queries", "proto", Logging::Loggable("UDP"), "addresses", Logging::IterLoggable(logVec.cbegin(), logVec.cend()), "socketInstances", Logging::Loggable(instances), "reuseport", Logging::Loggable(g_reusePort));
index 3dc1ee2730ae921874d98d741f2498d34abed009..71f67bde9bda43e35cf20b24f609fdadc8745d5a 100644 (file)
@@ -1265,8 +1265,9 @@ Indication of how many queries will be averaged to get the average latency repor
         'section' : 'incoming',
         'oldname' : 'local-address',
         'type' : LType.ListSocketAddresses,
-        'default' : '127.0.0.1',
+        'default' : '127.0.0.1, ::1',
         'help' : 'IP addresses to listen on, separated by spaces or commas. Also accepts ports.',
+        'versionchanged': ('5.3.0', '::1 was added to the list'),
         'doc' : '''
 Local IP addresses to which we bind. Each address specified can
 include a port number; if no port is included then the
index 2b164c21e18cf21f14ee6a18f6f584fd2d3bd6d2..6ea1bc740131caf3fde2a453e78138aed58b8b46 100644 (file)
@@ -1115,7 +1115,6 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& tc
     if (socketFd < 0) {
       throw PDNSException("Making a TCP server socket for resolver: " + stringerror());
     }
-    logVec.emplace_back(address.toStringWithPort());
     setCloseOnExec(socketFd);
 
     int tmp = 1;
@@ -1178,7 +1177,12 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& tc
 
     socklen_t socklen = address.sin4.sin_family == AF_INET ? sizeof(address.sin4) : sizeof(address.sin6);
     if (::bind(socketFd, reinterpret_cast<struct sockaddr*>(&address), socklen) < 0) { // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
-      throw PDNSException("Binding TCP server socket for " + address.toStringWithPort() + ": " + stringerror());
+      int err = errno;
+      if (address != ComboAddress{"::1", defaultLocalPort}) {
+        throw PDNSException("Binding TCP server socket for " + address.toStringWithPort() + ": " + stringerror(err));
+      }
+      log->info(Logr::Warning, "Cannot listen on this address, skipping", "proto", Logging::Loggable("TCP"), "address", Logging::Loggable(address), "error", Logging::Loggable(stringerror(err)));
+      continue;
     }
 
     setNonBlocking(socketFd);
@@ -1193,6 +1197,7 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& tc
     listen(socketFd, 128);
     deferredAdds.emplace_back(socketFd, handleNewTCPQuestion);
     tcpSockets.insert(socketFd);
+    logVec.emplace_back(address.toStringWithPort());
 
     // we don't need to update g_listenSocketsAddresses since it doesn't work for TCP/IP:
     //  - fd is not that which we know here, but returned from accept()