mageddo / dns-proxy-server

Solve your DNS hosts from your docker containers, then from your local configuration, then from internet
http://mageddo.github.io/dns-proxy-server/
Apache License 2.0
784 stars 78 forks source link

NullPointerException when queried for AAAA/IPv6 record #474

Closed sh3bang closed 3 months ago

sh3bang commented 3 months ago

If your docker host are reachable by IPv6 and IPv4 (Dual-Stack) then DPS will also be queried for AAAA and A record if configured as primary DNS proxy. But without IPv6 support within container environment DPS will fail with noisy NullPointerException.

Query A record only:

[paul@manjaro ~]$ nslookup > server 10.5.0.2 Default server: 10.5.0.2 Address: 10.5.0.2#53 > set type=A > nginx.docker Server: 10.5.0.2 Address: 10.5.0.2#53

Non-authoritative answer: Name: nginx.docker Address: 10.5.0.3

Query for A and AAAA

[paul@manjaro ~]$ nslookup > server 10.5.0.2 Default server: 10.5.0.2 Address: 10.5.0.2#53 > nginx.docker Server: 10.5.0.2 Address: 10.5.0.2#53

Non-authoritative answer: Name: nginx.docker Address: 10.5.0.3 ** server can't find nginx.docker: NXDOMAIN

Exception log:

[paul@manjaro ~]$ docker logs dps -f 13:49:55.808 [main ] DEB c.m.d.config.dataprovider.ConfigDAOJson l=38 m=find configPath=/app/conf/config.json 13:49:55.825 [main ] INF c.m.d.s.d.a.DpsDockerEnvironmentSetupService l=32 m=setup status=binding-docker-events, connectedToDocker=true 13:49:55.825 [main ] INF c.m.d.s.d.a.DpsDockerEnvironmentSetupService l=44 m=setupNetwork status=dpsNetwork, active=false 13:49:55.825 [main ] INF c.m.d.s.docker.application.DpsContainerService l=102 m=tRunningContainersToDpsNetwork status=autoConnectDpsNetworkDisabled, dpsNetwork=false, dpsNetworkAutoConnect=false 13:49:55.825 [main ] INF c.m.d.solver.docker.entrypoint.EventListener l=32 m=onStart status=containerAutoConnectToDpsNetworkDisabled 13:49:55.825 [main ] INF com.mageddo.dnsserver.UDPServerPool l=31 m=start Starting UDP server, addresses=/0.0.0.0:53 13:49:55.825 [main ] INF c.mageddo.dnsproxyserver.server.dns.ServerStarter l=30 m=start status=startingDnsServer, protocol=UDP_TCP, port=53 13:49:55.825 [Thread-4 ] INF com.mageddo.dnsserver.TCPServer l=50 m=start0 status=tcpServerStarting, port=53 13:49:55.826 [main ] INF com.mageddo.http.WebServer l=134 m=start status=startingWebServer, port=5380 13:50:00.877 [Thread-1 ] INF c.m.d.dnsconfigurator.DnsConfigurators l=113 m=getInstance0 usingDnsConfigurator=DnsConfiguratorLinux 13:50:00.877 [Thread-1 ] INF c.m.d.dnsconfigurator.linux.DnsConfiguratorLinux l=91 m=lambda$findBestConfFile$0 status=noValidConfFile, file=/host/etc/systemd/resolved.conf 13:50:00.877 [Thread-1 ] INF c.m.d.dnsconfigurator.linux.DnsConfiguratorLinux l=91 m=lambda$findBestConfFile$0 status=noValidConfFile, file=/host/etc/resolv.conf 13:50:00.877 [Thread-1 ] INF c.m.d.dnsconfigurator.linux.DnsConfiguratorLinux l=91 m=lambda$findBestConfFile$0 status=noValidConfFile, file=/etc/systemd/resolved.conf 13:50:00.877 [Thread-1 ] INF c.m.d.dnsconfigurator.linux.DnsConfiguratorLinux l=122 m=init status=using, configFile=ResolvFile(path=/etc/resolv.conf, type=RESOLVCONF) 13:53:55.373 [Thread-17 ] WAR c.m.d.server.dns.RequestHandlerDefault l=101 m=solveAndSummarizeHandlingError status=solverFailed, currentSolverTime=8, totalTime=8, solver=SolverDocker, query=query=AAAA:nginx.docker, eClass=NullPointerException, msg=null java.lang.NullPointerException: null at com.mageddo.dnsproxyserver.solver.docker.dataprovider.mapper.NetworkMapper.findGatewayIp(NetworkMapper.java:39) at com.mageddo.dnsproxyserver.solver.docker.dataprovider.mapper.NetworkMapper.of(NetworkMapper.java:17) at java.base@19.0.2/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base@19.0.2/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base@19.0.2/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base@19.0.2/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base@19.0.2/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) at java.base@19.0.2/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) at java.base@19.0.2/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) at java.base@19.0.2/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) at java.base@19.0.2/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) at com.mageddo.dnsproxyserver.solver.docker.dataprovider.DockerDAODefault.findNetworks(DockerDAODefault.java:53) at com.mageddo.dnsproxyserver.solver.docker.dataprovider.DockerDAODefault.findBestNetwork(DockerDAODefault.java:39) at com.mageddo.dnsproxyserver.solver.docker.dataprovider.DockerDAODefault.findHostMachineIp(DockerDAODefault.java:35) at com.mageddo.dnsproxyserver.solver.docker.application.ContainerSolvingService.lambda$buildHostMachineIpWhenActive$6(ContainerSolvingService.java:131) at com.mageddo.dnsproxyserver.solver.docker.application.ContainerSolvingService.buildHostMachineIpWhenActive(ContainerSolvingService.java:132) at com.mageddo.dnsproxyserver.solver.docker.application.ContainerSolvingService.lambda$findSecondaryIp$5(ContainerSolvingService.java:114) at java.base@19.0.2/java.util.Optional.orElseGet(Optional.java:364) at com.mageddo.dnsproxyserver.solver.docker.application.ContainerSolvingService.findSecondaryIp(ContainerSolvingService.java:114) at com.mageddo.dnsproxyserver.solver.docker.application.ContainerSolvingService.lambda$findBestIpMatch$2(ContainerSolvingService.java:66) at java.base@19.0.2/java.util.Optional.orElseGet(Optional.java:364) at com.mageddo.dnsproxyserver.solver.docker.application.ContainerSolvingService.findBestIpMatch(ContainerSolvingService.java:66) at com.mageddo.dnsproxyserver.solver.docker.application.ContainerSolvingService.lambda$findBestMatch$0(ContainerSolvingService.java:42) at java.base@19.0.2/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base@19.0.2/java.util.AbstractList$RandomAccessSpliterator.tryAdvance(AbstractList.java:708) at java.base@19.0.2/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) at java.base@19.0.2/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) at java.base@19.0.2/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.base@19.0.2/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base@19.0.2/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) at java.base@19.0.2/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base@19.0.2/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) at com.mageddo.dnsproxyserver.solver.docker.application.ContainerSolvingService.findBestMatch(ContainerSolvingService.java:44) at com.mageddo.dnsproxyserver.solver.SolverDocker.lambda$handle$0(SolverDocker.java:40) at com.mageddo.dnsproxyserver.solver.HostnameMatcher.match(HostnameMatcher.java:22) at com.mageddo.dnsproxyserver.solver.SolverDocker.handle(SolverDocker.java:39) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solveAndSummarize(RequestHandlerDefault.java:115) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solveAndSummarizeHandlingError(RequestHandlerDefault.java:99) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solve(RequestHandlerDefault.java:82) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solveFixingCacheTTL(RequestHandlerDefault.java:73) at com.mageddo.dnsproxyserver.solver.SolverCache.lambda$handleRes$0(SolverCache.java:38) at com.mageddo.commons.caching.LruTTLCache.lambda$computeIfAbsentWithTTL$1(LruTTLCache.java:94) at java.base@19.0.2/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916) at com.mageddo.commons.caching.LruTTLCache.lambda$computeIfAbsentWithTTL$2(LruTTLCache.java:88) at java.base@19.0.2/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916) at com.mageddo.commons.caching.LruTTLCache.computeIfAbsentWithTTL(LruTTLCache.java:86) at com.mageddo.dnsproxyserver.solver.SolverCache.handleRes(SolverCache.java:36) at com.mageddo.dnsproxyserver.solver.SolverCache.handle(SolverCache.java:31) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solveCaching(RequestHandlerDefault.java:66) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.handle(RequestHandlerDefault.java:54) at com.mageddo.dnsserver.UDPServer.handle(UDPServer.java:55) at com.mageddo.dnsserver.UDPServer.lambda$start0$0(UDPServer.java:43) at java.base@19.0.2/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base@19.0.2/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base@19.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base@19.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base@19.0.2/java.lang.Thread.run(Thread.java:1589) at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775) at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203) 13:53:55.373 [Thread-17 ] WAR c.m.d.server.dns.RequestHandlerDefault l=56 m=handle status=solverFailed, totalTime=8, eClass=NullPointerException, msg=null java.lang.NullPointerException: null at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solve(RequestHandlerDefault.java:83) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solveFixingCacheTTL(RequestHandlerDefault.java:73) at com.mageddo.dnsproxyserver.solver.SolverCache.lambda$handleRes$0(SolverCache.java:38) at com.mageddo.commons.caching.LruTTLCache.lambda$computeIfAbsentWithTTL$1(LruTTLCache.java:94) at java.base@19.0.2/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916) at com.mageddo.commons.caching.LruTTLCache.lambda$computeIfAbsentWithTTL$2(LruTTLCache.java:88) at java.base@19.0.2/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916) at com.mageddo.commons.caching.LruTTLCache.computeIfAbsentWithTTL(LruTTLCache.java:86) at com.mageddo.dnsproxyserver.solver.SolverCache.handleRes(SolverCache.java:36) at com.mageddo.dnsproxyserver.solver.SolverCache.handle(SolverCache.java:31) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solveCaching(RequestHandlerDefault.java:66) at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.handle(RequestHandlerDefault.java:54) at com.mageddo.dnsserver.UDPServer.handle(UDPServer.java:55) at com.mageddo.dnsserver.UDPServer.lambda$start0$0(UDPServer.java:43) at java.base@19.0.2/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base@19.0.2/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base@19.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base@19.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base@19.0.2/java.lang.Thread.run(Thread.java:1589) at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775) at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203)

mageddo commented 3 months ago

Hey @sh3bang , thanks for your report, a fix was submmited, see the summary:

Fixing error when fallback to host machine IP, Network mapper fails when the mapped networks hasn't an IPAM config, it has more chances to happen on IPV6 query solving.

I will release it in the next minutes, I will be glad if you can check if it fixes your usecase.

sh3bang commented 3 months ago

@mageddo with 3.19.5-snapshot exception is gone :+1: