diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 348681159..723662a3e 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,7 +1,12 @@ -## 5.5.1 +## 5.6.0 * Releasing JRE Docker Image Version * Enabling DPS to run on any JRE 21+ * Fixing IPV6 query answers which could fail in some cases by UDP interface issues +* UDP Server: Stopped trying to bind to link local interfaces +* Defining `0.0.0.0` as the default host for DNS server +* Option to customize the DNS host, see the [docs][5521] + +[5521]: https://mageddo.github.io/dns-proxy-server/5.5/en/3-configuration/#server ## 5.3.0 * Docker Solver: Specify Preferred Networks to use when solving container IP #662 diff --git a/docs/content/3-configuration/_index.en.md b/docs/content/3-configuration/_index.en.md index 657de5a4d..c61ce6d6e 100644 --- a/docs/content/3-configuration/_index.en.md +++ b/docs/content/3-configuration/_index.en.md @@ -8,9 +8,9 @@ Current Version: `3`. See [how to set the configurations][5]. ### Server -| Name | Description | Default Value | -|-------------------|-----------------------------------|---------------| -| `server.protocol` | Protocol to start the DNS server. | `UDP_TCP` | +| Name | Description | Default Value | +|---------------|-------------------------|---------------| +| `server.host` | Host to bind the ports. | `0.0.0.0` | --- @@ -18,6 +18,7 @@ Current Version: `3`. See [how to set the configurations][5]. | Name | Description | Default Value | |------------------------------------|--------------------------------------------------------------------|---------------| +| `server.dns.protocol` | Protocol to start the DNS server. | `UDP_TCP` | | `server.dns.port` | Port where the DNS server listens. | `53` | | `server.dns.noEntriesResponseCode` | Response code returned when no entries are resolved by any solver. | `3` | @@ -48,23 +49,23 @@ Common DNS resolution mechanisms used by DPS. Solvers are evaluated according to ### Docker Solver -| Name | Description | Default Value | -|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------| -| `solver.docker.registerContainerNames` | Whether container or service names should be registered as DNS hostnames. | `false` | -| `solver.docker.domain` | Domain suffix used when registering Docker containers and services. | `docker` | -| `solver.docker.hostMachineFallback` | Whether the host machine IP should be returned when a container is found but has no IP. | `true` | -| `solver.docker.dockerDaemonUri` | Docker daemon URI used to connect to Docker. | OS dependent | +| Name | Description | Default Value | +|----------------------------------------|-----------------------------------------------------------------------------------------|---------------| +| `solver.docker.registerContainerNames` | Whether container or service names should be registered as DNS hostnames. | `false` | +| `solver.docker.domain` | Domain suffix used when registering Docker containers and services. | `docker` | +| `solver.docker.hostMachineFallback` | Whether the host machine IP should be returned when a container is found but has no IP. | `true` | +| `solver.docker.dockerDaemonUri` | Docker daemon URI used to connect to Docker. | OS dependent | #### DPS Network -| Name | Description | Default Value | -|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------| -| `solver.docker.dpsNetwork.autoCreate` | Whether DPS should automatically create a Docker bridge network. | `false` | -| `solver.docker.dpsNetwork.autoConnect` | Whether all containers should be auto-connected to the DPS network. | `false` | -| `solver.docker.dpsNetwork.configs` | Docker network IP configuration | | -| `solver.docker.dpsNetwork.configs[].subNet` | Subnet | `172.20.0.0/16` | -| `solver.docker.dpsNetwork.configs[].ipRange` | Ip Range | `172.20.5.0/24` | -| `solver.docker.dpsNetwork.configs[].gateway` | Gateway | `172.20.5.1` | +| Name | Description | Default Value | +|----------------------------------------------|---------------------------------------------------------------------|-----------------| +| `solver.docker.dpsNetwork.autoCreate` | Whether DPS should automatically create a Docker bridge network. | `false` | +| `solver.docker.dpsNetwork.autoConnect` | Whether all containers should be auto-connected to the DPS network. | `false` | +| `solver.docker.dpsNetwork.configs` | Docker network IP configuration | | +| `solver.docker.dpsNetwork.configs[].subNet` | Subnet | `172.20.0.0/16` | +| `solver.docker.dpsNetwork.configs[].ipRange` | Ip Range | `172.20.5.0/24` | +| `solver.docker.dpsNetwork.configs[].gateway` | Gateway | `172.20.5.1` | Default DPS network settings @@ -77,14 +78,14 @@ Default DPS network settings gateway: fc00:5c6f:db50::1 ``` -#### Network Priority when Solving Container IP -| Name | Description | Default Value | -|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------| -| `solver.docker.networks.preferred.names` | Which networks DPS must prioritize when discovering container IP | | -| `solver.docker.networks.preferred.overrideDefault` | If will disable DPS and BRIDGE default networks when solving | false | +#### Network Priority when Solving Container IP -See more on [specify from which network solve container][6]. +| Name | Description | Default Value | +|----------------------------------------------------|------------------------------------------------------------------|---------------| +| `solver.docker.networks.preferred.names` | Which networks DPS must prioritize when discovering container IP | | +| `solver.docker.networks.preferred.overrideDefault` | If will disable DPS and BRIDGE default networks when solving | false | +See more on [specify from which network solve container][6]. ### System Solver @@ -134,12 +135,13 @@ See more on [specify from which network solve container][6]. ```yaml version: 3 server: + host: "0.0.0.0" dns: port: 53 noEntriesResponseCode: 3 + protocol: UDP_TCP web: port: 5380 - protocol: UDP_TCP solver: remote: active: true diff --git a/gradle.properties b/gradle.properties index 974795168..24cdd9ce5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=5.5.1-snapshot +version=5.6.0-snapshot diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/Config.java b/src/main/java/com/mageddo/dnsproxyserver/config/Config.java index 9f6cf07b1..1606f8695 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/config/Config.java +++ b/src/main/java/com/mageddo/dnsproxyserver/config/Config.java @@ -11,7 +11,7 @@ import java.util.stream.Stream; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.mageddo.dnsserver.SimpleServer; +import com.mageddo.dnsserver.SimpleServer.Protocol; import com.mageddo.net.IP; import com.mageddo.net.IpAddr; @@ -162,17 +162,19 @@ public String getHostMachineHostname() { } public Integer getNoEntriesResponseCode() { - if (this.server == null) { + if (this.getDnsServer() == null) { return null; } - return this.server.getDnsServerNoEntriesResponseCode(); + return this.getDnsServer() + .getNoEntriesResponseCode(); } public Integer getDnsServerPort() { - if (this.server == null) { + if (this.getDnsServer() == null) { return null; } - return this.server.getDnsServerPort(); + return this.getDnsServer() + .getPort(); } public Integer getWebServerPort() { @@ -182,11 +184,11 @@ public Integer getWebServerPort() { return this.server.getWebServerPort(); } - public SimpleServer.Protocol getServerProtocol() { + public Protocol getServerProtocol() { if (this.server == null) { return null; } - return this.server.getServerProtocol(); + return this.server.dns.protocol; } @JsonIgnore @@ -227,6 +229,13 @@ public SolverDocker.Networks getDockerSolverNetworks() { return this.solverDocker.networks; } + public Server.Dns getDnsServer() { + if (this.server == null) { + return null; + } + return this.server.dns; + } + @Value @Builder(toBuilder = true) public static class DefaultDns { @@ -470,14 +479,17 @@ public ch.qos.logback.classic.Level toLogbackLevel() { @Value @Builder public static class Server { - + String host; + Dns dns; Integer webServerPort; - Integer dnsServerPort; - Integer dnsServerNoEntriesResponseCode; - - SimpleServer.Protocol serverProtocol; - + @Value + @Builder + public static class Dns { + Protocol protocol; + Integer port; + Integer noEntriesResponseCode; + } } @Value diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/cmdargs/mapper/ConfigFlagMapper.java b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/cmdargs/mapper/ConfigFlagMapper.java index a311054d0..75fb59ed2 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/cmdargs/mapper/ConfigFlagMapper.java +++ b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/cmdargs/mapper/ConfigFlagMapper.java @@ -11,9 +11,12 @@ public static Config toConfig(ConfigFlag config) { return Config.builder() .server(Config.Server .builder() - .dnsServerNoEntriesResponseCode(config.getNoEntriesResponseCode()) + .dns(Config.Server.Dns.builder() + .port(config.getDnsServerPort()) + .noEntriesResponseCode(config.getNoEntriesResponseCode()) + .build() + ) .webServerPort(config.getWebServerPort()) - .dnsServerPort(config.getDnsServerPort()) .build() ) .configPath(Files.pathOf(config.getConfigFilePath())) diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/jsonv1v2/mapper/ConfigJsonV2Mapper.java b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/jsonv1v2/mapper/ConfigJsonV2Mapper.java index cb7abc38e..226316d72 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/jsonv1v2/mapper/ConfigJsonV2Mapper.java +++ b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/jsonv1v2/mapper/ConfigJsonV2Mapper.java @@ -24,10 +24,13 @@ public static Config toConfig(ConfigJson json, Path configFileAbsolutePath) { return Config.builder() .server(Config.Server .builder() - .dnsServerNoEntriesResponseCode(json.getNoEntriesResponseCode()) + .dns(Config.Server.Dns.builder() + .protocol(json.getServerProtocol()) + .port(json.getDnsServerPort()) + .noEntriesResponseCode(json.getNoEntriesResponseCode()) + .build() + ) .webServerPort(json.getWebServerPort()) - .dnsServerPort(json.getDnsServerPort()) - .serverProtocol(json.getServerProtocol()) .build() ) .defaultDns(Config.DefaultDns diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/legacyenv/ConfigEnvMapper.java b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/legacyenv/ConfigEnvMapper.java index eb44886b2..78ccdad4f 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/legacyenv/ConfigEnvMapper.java +++ b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/legacyenv/ConfigEnvMapper.java @@ -9,7 +9,10 @@ public static Config toConfig(ConfigEnv config) { return Config.builder() .server(Config.Server .builder() - .dnsServerNoEntriesResponseCode(config.getNoEntriesResponseCode()) + .dns(Config.Server.Dns.builder() + .noEntriesResponseCode(config.getNoEntriesResponseCode()) + .build() + ) .build() ) .log(Config.Log diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/ConfigV3.java b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/ConfigV3.java index a6028b46f..6c7737969 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/ConfigV3.java +++ b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/ConfigV3.java @@ -75,6 +75,7 @@ static public class DefaultDns { static public class Dns { Integer port; Integer noEntriesResponseCode; + String protocol; } @Data @@ -188,9 +189,9 @@ static public class ResolvConf { @Accessors(chain = true) @FieldDefaults(level = AccessLevel.PRIVATE) static public class Server { + String host; Dns dns; Web web; - String protocol; } @Data diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/mapper/ConfigMapper.java b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/mapper/ConfigMapper.java index 5b62c930a..508ab858f 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/mapper/ConfigMapper.java +++ b/src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/mapper/ConfigMapper.java @@ -19,6 +19,8 @@ import com.mageddo.net.IP; import com.mageddo.net.IpAddr; +import org.apache.commons.lang3.EnumUtils; + import static java.util.Collections.emptyList; import static java.util.stream.Collectors.toList; @@ -65,20 +67,24 @@ private static Config.Server mapServer(final ConfigV3.Server s) { return null; } + final var web = s.getWeb(); return Config.Server.builder() - .dnsServerPort(s.getDns() != null ? s.getDns() - .getPort() : null) - .dnsServerNoEntriesResponseCode( - s.getDns() != null ? s.getDns() - .getNoEntriesResponseCode() : null - ) - .webServerPort(s.getWeb() != null ? s.getWeb() - .getPort() : null) - .serverProtocol( - s.getProtocol() != null - ? SimpleServer.Protocol.valueOf(s.getProtocol()) - : null - ) + .host(s.getHost()) + .dns(mapDnsServer(s)) + .webServerPort(web != null ? web.getPort() : null) + .build(); + } + + private static Config.Server.Dns mapDnsServer(ConfigV3.Server server) { + final var dns = server.getDns(); + if(dns == null) { + return null; + } + return Config.Server.Dns + .builder() + .protocol(EnumUtils.getEnum(SimpleServer.Protocol.class, dns.getProtocol())) + .port(dns.getPort()) + .noEntriesResponseCode(dns.getNoEntriesResponseCode()) .build(); } @@ -87,15 +93,17 @@ private static ConfigV3.Server mapServerV3(final Config config) { return null; } + final var server = config.getServer(); return new ConfigV3.Server() + .setHost(server.getHost()) .setDns(new ConfigV3.Dns() + .setProtocol(Objects.toString(config.getServerProtocol(), null)) .setPort(config.getDnsServerPort()) .setNoEntriesResponseCode(config.getNoEntriesResponseCode()) ) .setWeb(new ConfigV3.Web() .setPort(config.getWebServerPort()) - ) - .setProtocol(Objects.toString(config.getServerProtocol(), null)); + ); } /* ================= DEFAULT DNS ================= */ diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/mapper/ConfigMapper.java b/src/main/java/com/mageddo/dnsproxyserver/config/mapper/ConfigMapper.java index 907dfdfc1..c9b796499 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/config/mapper/ConfigMapper.java +++ b/src/main/java/com/mageddo/dnsproxyserver/config/mapper/ConfigMapper.java @@ -16,13 +16,14 @@ import com.mageddo.dnsproxyserver.config.Config; import com.mageddo.dnsproxyserver.config.Config.DefaultDns; import com.mageddo.dnsproxyserver.config.Config.Env; +import com.mageddo.dnsproxyserver.config.Config.Server; import com.mageddo.dnsproxyserver.config.Config.SolverDocker; import com.mageddo.dnsproxyserver.config.StaticThresholdCircuitBreakerStrategyConfig; import com.mageddo.dnsproxyserver.config.validator.ConfigValidator; import com.mageddo.dnsproxyserver.solver.docker.Network; import com.mageddo.dnsproxyserver.utils.Numbers; import com.mageddo.dnsproxyserver.version.VersionDAO; -import com.mageddo.dnsserver.SimpleServer; +import com.mageddo.dnsserver.SimpleServer.Protocol; import com.mageddo.net.IP; import com.mageddo.net.IpAddr; @@ -144,14 +145,31 @@ public Config mapFrom(List configs) { private Config mapFrom0(List configs) { final var config = Config.builder() - .server(Config.Server + .server(Server .builder() + .host(ValueResolver.findFirstOrThrow( + configs, + Config::getServer, + Server::getHost + )) .webServerPort(Numbers.firstPositive(mapField(Config::getWebServerPort, configs))) - .dnsServerPort(Numbers.firstPositive(mapField(Config::getDnsServerPort, configs))) - .serverProtocol(firstNonNullRequiring(mapField( - Config::getServerProtocol, configs))) - .dnsServerNoEntriesResponseCode( - firstNonNullRequiring(mapField(Config::getNoEntriesResponseCode, configs)) + .dns(Server.Dns.builder() + .protocol(ValueResolver.findFirstOrThrow( + configs, + Config::getDnsServer, + Server.Dns::getProtocol + )) + .port(ValueResolver.findFirstOrThrow( + configs, + Config::getDnsServer, + Server.Dns::getPort + )) + .noEntriesResponseCode(ValueResolver.findFirstOrThrow( + configs, + Config::getDnsServer, + Server.Dns::getNoEntriesResponseCode + )) + .build() ) .build() ) @@ -258,9 +276,15 @@ private Config mapFrom0(List configs) { static Config buildDefault() { return Config .builder() - .server(Config.Server - .builder() - .serverProtocol(SimpleServer.Protocol.UDP_TCP) + .server(Server.builder() + .host("0.0.0.0") + .dns(Server.Dns.builder() + .protocol(Protocol.UDP_TCP) + .port(53) + .noEntriesResponseCode(3) + .build() + ) + .webServerPort(5380) .build() ) .defaultDns(DefaultDns.builder() diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java index f33608254..c4493e561 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java @@ -4,6 +4,7 @@ import javax.inject.Singleton; import com.mageddo.dnsproxyserver.config.application.Configs; +import com.mageddo.dnsproxyserver.utils.Ips; import com.mageddo.dnsserver.SimpleServer; import lombok.Getter; @@ -23,12 +24,14 @@ public ServerStarter(SimpleServer server) { public ServerStarter start() { final var config = Configs.getInstance(); - final var port = config.getDnsServerPort(); + final var server = config.getServer(); + final var dns = server.getDns(); this.server.start( - port, - config.getServerProtocol() + dns.getProtocol(), + Ips.toAddress(server.getHost()), + dns.getPort() ); - log.info("status=startingDnsServer, protocol={}, port={}", config.getServerProtocol(), port); + log.info("status=startingDnsServer, protocol={}, port={}", dns.getProtocol(), dns.getPort()); return this; } diff --git a/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java b/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java index ff5b8d975..5bfd0a5af 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java +++ b/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java @@ -3,7 +3,6 @@ import java.io.UncheckedIOException; import java.net.InetAddress; import java.net.InetSocketAddress; -import java.net.SocketAddress; import java.net.UnknownHostException; import java.util.regex.Pattern; @@ -59,7 +58,7 @@ public static InetAddress toAddress(IP ip) { return toAddress(ip.toText()); } - public static SocketAddress toSocketAddress(String ip, int port) { + public static InetSocketAddress toSocketAddress(String ip, int port) { return new InetSocketAddress(Ips.toAddress(ip), port); } diff --git a/src/main/java/com/mageddo/dnsserver/Addresses.java b/src/main/java/com/mageddo/dnsserver/Addresses.java index 00287ad14..b9751eea5 100644 --- a/src/main/java/com/mageddo/dnsserver/Addresses.java +++ b/src/main/java/com/mageddo/dnsserver/Addresses.java @@ -1,6 +1,7 @@ package com.mageddo.dnsserver; import java.util.List; +import java.util.function.Predicate; import com.mageddo.commons.Collections; import com.mageddo.net.IP; @@ -28,11 +29,16 @@ private static List mustFindBindAddresses(IP address) { return Collections.singletonList(address); } if (address.versionIs(IP.Version.IPV6)) { - return Networks.findMachineIps(); + return Collections.filter(Networks.findMachineIps(), notLinkLocal()); } return Collections.filter( Networks.findMachineIps(), - ip -> ip.versionIs(address.version()) + ip -> ip.versionIs(address.version()), + notLinkLocal() ); } + + private static Predicate notLinkLocal() { + return ip -> !ip.isLinkLocal(); + } } diff --git a/src/main/java/com/mageddo/dnsserver/SimpleServer.java b/src/main/java/com/mageddo/dnsserver/SimpleServer.java index 63bc5d5d5..55cc3833e 100644 --- a/src/main/java/com/mageddo/dnsserver/SimpleServer.java +++ b/src/main/java/com/mageddo/dnsserver/SimpleServer.java @@ -1,9 +1,12 @@ package com.mageddo.dnsserver; +import java.net.InetAddress; + import javax.inject.Inject; import javax.inject.Singleton; import com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault; +import com.mageddo.dnsproxyserver.utils.Ips; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,19 +21,23 @@ public class SimpleServer { private final RequestHandlerDefault requestHandler; public void start(int port, Protocol protocol) { - this.start0(port, protocol); + this.start(protocol, Ips.getAnyLocalAddress(), port); + } + + public void start(Protocol protocol, InetAddress addr, int port) { + this.start0(protocol, addr, port); } - void start0(int port, Protocol protocol) { + void start0(Protocol protocol, InetAddress addr, int port) { final var tcpHandler = new DnsQueryTCPHandler(this.requestHandler); switch (protocol) { - case UDP -> this.udpServerPool.start(port); + case UDP -> this.udpServerPool.start(addr, port); case TCP -> { - this.tcpServer.start(port, null, tcpHandler); + this.tcpServer.start(port, addr, tcpHandler); } default -> { - this.udpServerPool.start(port); - this.tcpServer.start(port, null, tcpHandler); + this.udpServerPool.start(addr, port); + this.tcpServer.start(port, addr, tcpHandler); } } } diff --git a/src/main/java/com/mageddo/dnsserver/TCPServer.java b/src/main/java/com/mageddo/dnsserver/TCPServer.java index ff40ec257..3821d5c84 100644 --- a/src/main/java/com/mageddo/dnsserver/TCPServer.java +++ b/src/main/java/com/mageddo/dnsserver/TCPServer.java @@ -16,7 +16,6 @@ import com.mageddo.commons.concurrent.ThreadPool; import com.mageddo.commons.io.IoUtils; -import com.mageddo.dnsproxyserver.utils.Ips; import com.mageddo.utils.Executors; import org.slf4j.MDC; @@ -44,7 +43,7 @@ public TCPServer() { } public void start(int port, InetAddress address, SocketClientMessageHandler handler) { - log.debug("status=tcpServerStartScheduled, port={}", port); + log.debug("status=scheduled, port={}", port); this.serverThreadPool.submit(() -> this.start0(port, address, handler)); getGlobalScheduledThreadPool().scheduleWithFixedDelay( this::watchDog, WATCHDOG_DELAY_SECS, WATCHDOG_DELAY_SECS, TimeUnit.SECONDS @@ -56,10 +55,8 @@ private static ScheduledExecutorService getGlobalScheduledThreadPool() { } void start0(int port, InetAddress address, SocketClientMessageHandler handler) { - log.info("status=tcpServerStarting, port={}", port); - final var addr = Ips.getAnyLocalAddress(); // todo porque isso funciona e sem passar o - // endereço nao? - try (var server = this.server = new ServerSocket(port, 50, addr)) { + log.info("status=starting, port={}", port); + try (var server = this.server = new ServerSocket(port, 50, address)) { Socket socket; while (!server.isClosed() && (socket = server.accept()) != null) { @@ -69,10 +66,10 @@ void start0(int port, InetAddress address, SocketClientMessageHandler handler) { } } catch (Throwable e) { - log.warn("status=tcpServerGetError, msg={}", e.getMessage(), e); + log.warn("status=error, msg={}", e.getMessage(), e); throw new RuntimeException(e); } finally { - log.debug("status=tcpServerClosing..."); + log.debug("status=closing"); } } @@ -80,7 +77,7 @@ void watchDog() { try { final var itr = this.clients.iterator(); if (this.clients.isEmpty()) { - log.trace("status=no-clients"); + log.trace("status=noClients"); return; } final var clientsBefore = this.clients.size(); diff --git a/src/main/java/com/mageddo/dnsserver/UDPServer.java b/src/main/java/com/mageddo/dnsserver/UDPServer.java index 984eaf778..91632d3a5 100644 --- a/src/main/java/com/mageddo/dnsserver/UDPServer.java +++ b/src/main/java/com/mageddo/dnsserver/UDPServer.java @@ -32,7 +32,7 @@ public UDPServer(SocketAddress address, RequestHandler requestHandler) { public void start() { this.pool.submit(this::start0); - log.trace("status=startingUdpServer, address={}", this.address); + log.trace("status=starting, address={}", this.address); } private void start0() { @@ -47,7 +47,7 @@ private void start0() { } } catch (Exception e) { - log.error("status=dnsServerStartFailed, address={}, msg={}", this.address, e.getMessage(), e); + log.error("status=failed, address={}, msg={}", this.address, e.getMessage(), e); throw new RuntimeException(e); } } diff --git a/src/main/java/com/mageddo/dnsserver/UDPServerPool.java b/src/main/java/com/mageddo/dnsserver/UDPServerPool.java index d3b1248b9..4238ce73d 100644 --- a/src/main/java/com/mageddo/dnsserver/UDPServerPool.java +++ b/src/main/java/com/mageddo/dnsserver/UDPServerPool.java @@ -1,5 +1,6 @@ package com.mageddo.dnsserver; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; @@ -25,18 +26,18 @@ public class UDPServerPool { private final RequestHandler requestHandler; private List servers = new ArrayList<>(); - public void start(int port) { - final var addresses = this.buildAddressesToBind(port); + public void start(InetAddress addr, int port) { + final var addresses = this.buildAddressesToBind(port, addr); this.servers = Collections.map( addresses, address -> new UDPServer(address, this.requestHandler) ); this.servers.forEach(UDPServer::start); - log.info("Starting UDP server, addresses={}", this.toString(addresses)); + log.info("status=starting, addresses={}", this.toString(addresses)); } - private List buildAddressesToBind(int port) { - final var bindIp = Ips.from(Ips.getAnyLocalIpv6Address()); + private List buildAddressesToBind(int port, InetAddress addr) { + final var bindIp = Ips.from(addr); return this.buildAddressesToBind(bindIp, port); } diff --git a/src/main/java/com/mageddo/net/IP.java b/src/main/java/com/mageddo/net/IP.java index da75a77a1..3235d0947 100644 --- a/src/main/java/com/mageddo/net/IP.java +++ b/src/main/java/com/mageddo/net/IP.java @@ -44,6 +44,8 @@ default boolean versionIs(Version version) { .equals(version); } + boolean isLinkLocal(); + enum Version { IPV4, diff --git a/src/main/java/com/mageddo/net/IpImpl.java b/src/main/java/com/mageddo/net/IpImpl.java index 13b91a1bd..0c7da77a7 100644 --- a/src/main/java/com/mageddo/net/IpImpl.java +++ b/src/main/java/com/mageddo/net/IpImpl.java @@ -94,6 +94,11 @@ public boolean notEqualTo(String ip) { return !Objects.equals(this, IP.of(ip)); } + @Override + public boolean isLinkLocal() { + return this.ip.isLinkLocalAddress(); + } + private static InetAddress build(String ip) { try { return InetAddresses.forString(ip); diff --git a/src/test/java/com/mageddo/dnsproxyserver/AppIntTest.java b/src/test/java/com/mageddo/dnsproxyserver/AppIntTest.java index 2f3867dea..032aaa952 100644 --- a/src/test/java/com/mageddo/dnsproxyserver/AppIntTest.java +++ b/src/test/java/com/mageddo/dnsproxyserver/AppIntTest.java @@ -1,5 +1,7 @@ package com.mageddo.dnsproxyserver; +import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Path; import java.time.Duration; import java.util.Arrays; @@ -24,7 +26,6 @@ import org.junit.jupiter.api.Test; import org.xbill.DNS.Message; -import lombok.SneakyThrows; import lombok.Value; import lombok.extern.slf4j.Slf4j; import testing.templates.ConfigFlagArgsTemplates; @@ -99,7 +100,7 @@ private static App buildClientAppAndWait(ExecutorService executor, Integer serve private static Result buildAndStartServerApp(String hostToQuery) { final var configFile = ConfigJsonFileTemplates.withRandomPortsAndNotAsDefaultDnsAndCustomLocalDBEntry( - hostToQuery); + hostToQuery); final var instance = Sandbox.runFromGradleTests(configFile); return Result.of(configFile, instance); } @@ -112,11 +113,14 @@ private static App buildAppAndWait(ExecutorService executor, final String[] para return app; } - @SneakyThrows static Message queryStartedServer(Integer port, String host) { - final var dnsServerAddress = Ips.getAnyLocalAddress(port); - final var dnsClient = new SimpleResolver(dnsServerAddress); - return dnsClient.send(Messages.aQuestion(host)); + final var dnsServer = Ips.toSocketAddress("127.0.0.1", port); + final var dnsClient = new SimpleResolver(dnsServer); + try { + return dnsClient.send(Messages.aQuestion(host)); + } catch (IOException e) { + throw new UncheckedIOException(String.format("server=%s", dnsServer), e); + } } @Value diff --git a/src/test/java/com/mageddo/dnsproxyserver/config/provider/dataformatv3/templates/ConfigV3EnvTemplates.java b/src/test/java/com/mageddo/dnsproxyserver/config/provider/dataformatv3/templates/ConfigV3EnvTemplates.java index 135617ec1..6b5aae115 100644 --- a/src/test/java/com/mageddo/dnsproxyserver/config/provider/dataformatv3/templates/ConfigV3EnvTemplates.java +++ b/src/test/java/com/mageddo/dnsproxyserver/config/provider/dataformatv3/templates/ConfigV3EnvTemplates.java @@ -11,10 +11,10 @@ private ConfigV3EnvTemplates() { public static Map build() { final var env = new LinkedHashMap(); env.put("DPS_VERSION", "3"); + env.put("DPS_SERVER__DNS__PROTOCOL", "UDP_TCP"); env.put("DPS_SERVER__DNS__PORT", "53"); env.put("DPS_SERVER__DNS__NO_ENTRIES_RESPONSE_CODE", "3"); env.put("DPS_SERVER__WEB__PORT", "5380"); - env.put("DPS_SERVER__PROTOCOL", "UDP_TCP"); env.put("DPS_SOLVER__REMOTE__ACTIVE", "true"); env.put("DPS_SOLVER__REMOTE__DNS_SERVERS_0", "8.8.8.8"); env.put("DPS_SOLVER__REMOTE__DNS_SERVERS_1", "4.4.4.4:53"); diff --git a/src/test/java/com/mageddo/dnsproxyserver/config/provider/dataformatv3/templates/ConfigV3Templates.java b/src/test/java/com/mageddo/dnsproxyserver/config/provider/dataformatv3/templates/ConfigV3Templates.java index 6c09e5665..e5935caef 100644 --- a/src/test/java/com/mageddo/dnsproxyserver/config/provider/dataformatv3/templates/ConfigV3Templates.java +++ b/src/test/java/com/mageddo/dnsproxyserver/config/provider/dataformatv3/templates/ConfigV3Templates.java @@ -13,11 +13,11 @@ public static String buildYaml() { version: 3 server: dns: + protocol: UDP_TCP port: 53 noEntriesResponseCode: 3 web: port: 5380 - protocol: UDP_TCP solver: remote: active: true @@ -84,10 +84,10 @@ public static String defaultJson_2025_12() { }, "server" : { "dns" : { + "protocol" : "UDP_TCP", "noEntriesResponseCode" : 3, "port" : 53 }, - "protocol" : "UDP_TCP", "web" : { "port" : 5380 } @@ -145,13 +145,13 @@ public static String buildJson() { "version": 3, "server": { "dns": { + "protocol": "UDP_TCP", "port": 53, "noEntriesResponseCode": 3 }, "web": { "port": 5380 - }, - "protocol": "UDP_TCP" + } }, "solver": { "remote": { diff --git a/src/test/java/testing/templates/ConfigTemplates.java b/src/test/java/testing/templates/ConfigTemplates.java index ef0fd6516..883d545e5 100644 --- a/src/test/java/testing/templates/ConfigTemplates.java +++ b/src/test/java/testing/templates/ConfigTemplates.java @@ -20,10 +20,13 @@ private static Config.ConfigBuilder defaultBuilder() { .builder() .server(Config.Server .builder() - .serverProtocol(SimpleServer.Protocol.UDP_TCP) + .dns(Config.Server.Dns.builder() + .protocol(SimpleServer.Protocol.UDP_TCP) + .port(53) + .noEntriesResponseCode(3) + .build() + ) .webServerPort(8080) - .dnsServerPort(53) - .dnsServerNoEntriesResponseCode(3) .build() ) .log(Config.Log diff --git a/src/test/resources/configs-test/004.json b/src/test/resources/configs-test/004.json index aa33ef31d..e87155589 100644 --- a/src/test/resources/configs-test/004.json +++ b/src/test/resources/configs-test/004.json @@ -4,13 +4,18 @@ "active" : false, "resolvConf" : { } }, + "dnsServer" : { + "port" : 5391 + }, "dnsServerPort" : 5391, "log" : { "file" : "/var/log/dns-proxy-server.log", "level" : "DEBUG" }, "server" : { - "dnsServerPort" : 5391, + "dns" : { + "port": 5391 + }, "webServerPort" : 9393 }, "solverDocker" : {