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
766 stars 76 forks source link

Support for Podman? #475

Closed freelock closed 3 weeks ago

freelock commented 3 weeks ago

What is Happening

Hi,

I have DPS working in Nix with Docker, but was wanting to switch over to Podman. I made a bunch of changes in my configuration to swap Docker for Podman, and have things loading up and working, except for DPS -- and this is making it so DNS lookups inside any container fail.

I am seeing a java.lang.NullPointerException thrown over and over again in the logs, every 7 - 20 seconds or so. I am using the dfrietas/dns-proxy-server:latest container image for this, with Podman set with active Docker emulations enabled for the Docker socket and command.

Here's the exception:

Jun 16 12:15:41 mat01 dns-proxy-server[1488]: 19:15:41.779 [Thread-72      ] INF c.m.dnsproxyserver.server.dns.solver.SolverRemote l=112  m=testPing                        stats=pingTested, success=true, address=/8.8.8.8:53
Jun 16 12:15:47 mat01 dns-proxy-server[1488]: 19:15:47.694 [Thread-75      ] WAR c.m.d.server.dns.RequestHandlerDefault            l=93   m=solve0                          status=solverFailed, currentSolverTime=36, totalTime=36, >
Jun 16 12:15:47 mat01 dns-proxy-server[1488]: java.lang.NullPointerException: null
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.Objects.requireNonNull(Objects.java:233)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.Optional.of(Optional.java:113)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.stream.FindOps$FindSink$OfRef.get(FindOps.java:194)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.stream.FindOps$FindSink$OfRef.get(FindOps.java:191)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.docker.ContainerSolvingService.findBestMatch(ContainerSolvingService.java:50)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverDocker.lambda$handle$0(SolverDocker.java:40)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.HostnameMatcher.match(HostnameMatcher.java:22)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverDocker.handle(SolverDocker.java:39)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solve0(RequestHandlerDefault.java:75)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverCache.lambda$handleRes$0(SolverCache.java:38)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.commons.caching.LruTTLCache.lambda$computeIfAbsentWithTTL$1(LruTTLCache.java:94)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.commons.caching.LruTTLCache.lambda$computeIfAbsentWithTTL$2(LruTTLCache.java:88)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.commons.caching.LruTTLCache.computeIfAbsentWithTTL(LruTTLCache.java:86)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverCache.handleRes(SolverCache.java:36)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverCache.handle(SolverCache.java:31)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solve(RequestHandlerDefault.java:51)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.handle(RequestHandlerDefault.java:42)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.UDPServer.handle(UDPServer.java:54)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.UDPServer.lambda$start0$0(UDPServer.java:42)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.FutureTask.run(FutureTask.java:317)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.lang.Thread.run(Thread.java:1589)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]:         at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203)
Jun 16 12:15:47 mat01 dns-proxy-server[1488]: 19:15:47.704 [Thread-75      ] INF c.m.dnsproxyserver.server.dns.solver.SolverRemote l=112  m=testPing                        stats=pingTested, success=true, address=/8.8.8.8:53
Jun 16 12:15:47 mat01 dns-proxy-server[1488]: 19:15:47.714 [Thread-77      ] INF c.m.dnsproxyserver.server.dns.solver.SolverRemote l=112  m=testPing                        stats=pingTested, success=true, address=/8.8.8.8:53
Jun 16 12:16:04 mat01 dns-proxy-server[1488]: 19:16:04.487 [Thread-2       ] INF o.a.h.c.http.impl.classic.HttpRequestRetryExec    l=110  m=execute                         Recoverable I/O exception (java.io.IOException) caught wh>
Jun 16 12:16:04 mat01 dns-proxy-server[1488]: 19:16:04.488 [Thread-2       ] WAR c.m.d.dnsconfigurator.DnsConfigurators            l=58   m=lambda$configurationHook$0      status=failedToConfigureAsDefaultDns, path=/host/etc/syst>
Jun 16 12:16:04 mat01 dns-proxy-server[1488]: java.lang.RuntimeException: java.io.IOException: Broken pipe

... I am getting a similar exception using Docker in Nix, but just once and then everything seems to work. With Podman, this exception, and it looks like another saying Broken pipe repeat over and over again, and DNS inside the containers is not resolving (it does appear to be working mostly on the host):

Jun 16 12:16:54 mat01 dns-proxy-server[1488]: 19:16:54.975 [Thread-32      ] WAR c.m.d.server.dns.RequestHandlerDefault            l=93   m=solve0                          status=solverFailed, currentSolverTime=0, totalTime=0, so>
Jun 16 12:16:54 mat01 dns-proxy-server[1488]: java.lang.RuntimeException: java.io.IOException: Broken pipe
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.httpclient5.ApacheDockerHttpClientImpl.execute(ApacheDockerHttpClientImpl.java:195)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.httpclient5.ApacheDockerHttpClient.execute(ApacheDockerHttpClient.java:9)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:228)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.core.DefaultInvocationBuilder.get(DefaultInvocationBuilder.java:202)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.core.DefaultInvocationBuilder.get(DefaultInvocationBuilder.java:74)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.core.exec.ListContainersCmdExec.execute(ListContainersCmdExec.java:44)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.core.exec.ListContainersCmdExec.execute(ListContainersCmdExec.java:15)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.core.exec.AbstrSyncDockerCmdExec.exec(AbstrSyncDockerCmdExec.java:21)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.github.dockerjava.core.command.AbstrDockerCmd.exec(AbstrDockerCmd.java:33)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.docker.DockerDAODefault.findActiveContainers(DockerDAODefault.java:48)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.docker.ContainerSolvingService.findMatchingContainers(ContainerSolvingService.java:163)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.docker.ContainerSolvingService.findBestMatch(ContainerSolvingService.java:46)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverDocker.lambda$handle$0(SolverDocker.java:40)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.HostnameMatcher.match(HostnameMatcher.java:22)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverDocker.handle(SolverDocker.java:39)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solve0(RequestHandlerDefault.java:75)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverCache.lambda$handleRes$0(SolverCache.java:38)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.commons.caching.LruTTLCache.lambda$computeIfAbsentWithTTL$1(LruTTLCache.java:94)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.commons.caching.LruTTLCache.lambda$computeIfAbsentWithTTL$2(LruTTLCache.java:88)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.commons.caching.LruTTLCache.computeIfAbsentWithTTL(LruTTLCache.java:86)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverCache.handleRes(SolverCache.java:36)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.solver.SolverCache.handle(SolverCache.java:31)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.solve(RequestHandlerDefault.java:51)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.RequestHandlerDefault.handle(RequestHandlerDefault.java:42)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.UDPServer.handle(UDPServer.java:54)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at com.mageddo.dnsproxyserver.server.dns.UDPServer.lambda$start0$0(UDPServer.java:42)
Jun 16 12:16:54 mat01 dns-proxy-server[1488]:         at java.base@19.0.2/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577)

What is Expected

That DPS works when running Podman, at least with Docker compatibility set up.

Changes (Optional)

Steps to implement the desired feature.

freelock commented 3 weeks ago

User error, sorry! It's working fine.

The issue turned out to be that the Nix podman package needs a firewall rule to allow access to the DNS port, when using a custom network. After opening that, DPS is working fine.