Skip to content

Commit e6785a6

Browse files
authored
DNS Server: Option to customize the DNS host (#667)
1 parent bfbc859 commit e6785a6

File tree

24 files changed

+209
-116
lines changed

24 files changed

+209
-116
lines changed

RELEASE-NOTES.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
## 5.5.1
1+
## 5.6.0
22
* Releasing JRE Docker Image Version
33
* Enabling DPS to run on any JRE 21+
44
* Fixing IPV6 query answers which could fail in some cases by UDP interface issues
5+
* UDP Server: Stopped trying to bind to link local interfaces
6+
* Defining `0.0.0.0` as the default host for DNS server
7+
* Option to customize the DNS host, see the [docs][5521]
8+
9+
[5521]: https://mageddo.github.io/dns-proxy-server/5.5/en/3-configuration/#server
510

611
## 5.3.0
712
* Docker Solver: Specify Preferred Networks to use when solving container IP #662

docs/content/3-configuration/_index.en.md

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@ Current Version: `3`. See [how to set the configurations][5].
88

99
### Server
1010

11-
| Name | Description | Default Value |
12-
|-------------------|-----------------------------------|---------------|
13-
| `server.protocol` | Protocol to start the DNS server. | `UDP_TCP` |
11+
| Name | Description | Default Value |
12+
|---------------|-------------------------|---------------|
13+
| `server.host` | Host to bind the ports. | `0.0.0.0` |
1414

1515
---
1616

1717
### DNS Server
1818

1919
| Name | Description | Default Value |
2020
|------------------------------------|--------------------------------------------------------------------|---------------|
21+
| `server.dns.protocol` | Protocol to start the DNS server. | `UDP_TCP` |
2122
| `server.dns.port` | Port where the DNS server listens. | `53` |
2223
| `server.dns.noEntriesResponseCode` | Response code returned when no entries are resolved by any solver. | `3` |
2324

@@ -48,23 +49,23 @@ Common DNS resolution mechanisms used by DPS. Solvers are evaluated according to
4849

4950
### Docker Solver
5051

51-
| Name | Description | Default Value |
52-
|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------|
53-
| `solver.docker.registerContainerNames` | Whether container or service names should be registered as DNS hostnames. | `false` |
54-
| `solver.docker.domain` | Domain suffix used when registering Docker containers and services. | `docker` |
55-
| `solver.docker.hostMachineFallback` | Whether the host machine IP should be returned when a container is found but has no IP. | `true` |
56-
| `solver.docker.dockerDaemonUri` | Docker daemon URI used to connect to Docker. | OS dependent |
52+
| Name | Description | Default Value |
53+
|----------------------------------------|-----------------------------------------------------------------------------------------|---------------|
54+
| `solver.docker.registerContainerNames` | Whether container or service names should be registered as DNS hostnames. | `false` |
55+
| `solver.docker.domain` | Domain suffix used when registering Docker containers and services. | `docker` |
56+
| `solver.docker.hostMachineFallback` | Whether the host machine IP should be returned when a container is found but has no IP. | `true` |
57+
| `solver.docker.dockerDaemonUri` | Docker daemon URI used to connect to Docker. | OS dependent |
5758

5859
#### DPS Network
59-
| Name | Description | Default Value |
60-
|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------|
61-
| `solver.docker.dpsNetwork.autoCreate` | Whether DPS should automatically create a Docker bridge network. | `false` |
62-
| `solver.docker.dpsNetwork.autoConnect` | Whether all containers should be auto-connected to the DPS network. | `false` |
63-
| `solver.docker.dpsNetwork.configs` | Docker network IP configuration | |
64-
| `solver.docker.dpsNetwork.configs[].subNet` | Subnet | `172.20.0.0/16` |
65-
| `solver.docker.dpsNetwork.configs[].ipRange` | Ip Range | `172.20.5.0/24` |
66-
| `solver.docker.dpsNetwork.configs[].gateway` | Gateway | `172.20.5.1` |
6760

61+
| Name | Description | Default Value |
62+
|----------------------------------------------|---------------------------------------------------------------------|-----------------|
63+
| `solver.docker.dpsNetwork.autoCreate` | Whether DPS should automatically create a Docker bridge network. | `false` |
64+
| `solver.docker.dpsNetwork.autoConnect` | Whether all containers should be auto-connected to the DPS network. | `false` |
65+
| `solver.docker.dpsNetwork.configs` | Docker network IP configuration | |
66+
| `solver.docker.dpsNetwork.configs[].subNet` | Subnet | `172.20.0.0/16` |
67+
| `solver.docker.dpsNetwork.configs[].ipRange` | Ip Range | `172.20.5.0/24` |
68+
| `solver.docker.dpsNetwork.configs[].gateway` | Gateway | `172.20.5.1` |
6869

6970
Default DPS network settings
7071

@@ -77,14 +78,14 @@ Default DPS network settings
7778
gateway: fc00:5c6f:db50::1
7879
```
7980
80-
#### Network Priority when Solving Container IP
81-
| Name | Description | Default Value |
82-
|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------|
83-
| `solver.docker.networks.preferred.names` | Which networks DPS must prioritize when discovering container IP | |
84-
| `solver.docker.networks.preferred.overrideDefault` | If will disable DPS and BRIDGE default networks when solving | false |
81+
#### Network Priority when Solving Container IP
8582
86-
See more on [specify from which network solve container][6].
83+
| Name | Description | Default Value |
84+
|----------------------------------------------------|------------------------------------------------------------------|---------------|
85+
| `solver.docker.networks.preferred.names` | Which networks DPS must prioritize when discovering container IP | |
86+
| `solver.docker.networks.preferred.overrideDefault` | If will disable DPS and BRIDGE default networks when solving | false |
8787

88+
See more on [specify from which network solve container][6].
8889

8990
### System Solver
9091

@@ -134,12 +135,13 @@ See more on [specify from which network solve container][6].
134135
```yaml
135136
version: 3
136137
server:
138+
host: "0.0.0.0"
137139
dns:
138140
port: 53
139141
noEntriesResponseCode: 3
142+
protocol: UDP_TCP
140143
web:
141144
port: 5380
142-
protocol: UDP_TCP
143145
solver:
144146
remote:
145147
active: true

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=5.5.1-snapshot
1+
version=5.6.0-snapshot

src/main/java/com/mageddo/dnsproxyserver/config/Config.java

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.util.stream.Stream;
1212

1313
import com.fasterxml.jackson.annotation.JsonIgnore;
14-
import com.mageddo.dnsserver.SimpleServer;
14+
import com.mageddo.dnsserver.SimpleServer.Protocol;
1515
import com.mageddo.net.IP;
1616
import com.mageddo.net.IpAddr;
1717

@@ -162,17 +162,19 @@ public String getHostMachineHostname() {
162162
}
163163

164164
public Integer getNoEntriesResponseCode() {
165-
if (this.server == null) {
165+
if (this.getDnsServer() == null) {
166166
return null;
167167
}
168-
return this.server.getDnsServerNoEntriesResponseCode();
168+
return this.getDnsServer()
169+
.getNoEntriesResponseCode();
169170
}
170171

171172
public Integer getDnsServerPort() {
172-
if (this.server == null) {
173+
if (this.getDnsServer() == null) {
173174
return null;
174175
}
175-
return this.server.getDnsServerPort();
176+
return this.getDnsServer()
177+
.getPort();
176178
}
177179

178180
public Integer getWebServerPort() {
@@ -182,11 +184,11 @@ public Integer getWebServerPort() {
182184
return this.server.getWebServerPort();
183185
}
184186

185-
public SimpleServer.Protocol getServerProtocol() {
187+
public Protocol getServerProtocol() {
186188
if (this.server == null) {
187189
return null;
188190
}
189-
return this.server.getServerProtocol();
191+
return this.server.dns.protocol;
190192
}
191193

192194
@JsonIgnore
@@ -227,6 +229,13 @@ public SolverDocker.Networks getDockerSolverNetworks() {
227229
return this.solverDocker.networks;
228230
}
229231

232+
public Server.Dns getDnsServer() {
233+
if (this.server == null) {
234+
return null;
235+
}
236+
return this.server.dns;
237+
}
238+
230239
@Value
231240
@Builder(toBuilder = true)
232241
public static class DefaultDns {
@@ -470,14 +479,17 @@ public ch.qos.logback.classic.Level toLogbackLevel() {
470479
@Value
471480
@Builder
472481
public static class Server {
473-
482+
String host;
483+
Dns dns;
474484
Integer webServerPort;
475485

476-
Integer dnsServerPort;
477-
Integer dnsServerNoEntriesResponseCode;
478-
479-
SimpleServer.Protocol serverProtocol;
480-
486+
@Value
487+
@Builder
488+
public static class Dns {
489+
Protocol protocol;
490+
Integer port;
491+
Integer noEntriesResponseCode;
492+
}
481493
}
482494

483495
@Value

src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/cmdargs/mapper/ConfigFlagMapper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ public static Config toConfig(ConfigFlag config) {
1111
return Config.builder()
1212
.server(Config.Server
1313
.builder()
14-
.dnsServerNoEntriesResponseCode(config.getNoEntriesResponseCode())
14+
.dns(Config.Server.Dns.builder()
15+
.port(config.getDnsServerPort())
16+
.noEntriesResponseCode(config.getNoEntriesResponseCode())
17+
.build()
18+
)
1519
.webServerPort(config.getWebServerPort())
16-
.dnsServerPort(config.getDnsServerPort())
1720
.build()
1821
)
1922
.configPath(Files.pathOf(config.getConfigFilePath()))

src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/jsonv1v2/mapper/ConfigJsonV2Mapper.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@ public static Config toConfig(ConfigJson json, Path configFileAbsolutePath) {
2424
return Config.builder()
2525
.server(Config.Server
2626
.builder()
27-
.dnsServerNoEntriesResponseCode(json.getNoEntriesResponseCode())
27+
.dns(Config.Server.Dns.builder()
28+
.protocol(json.getServerProtocol())
29+
.port(json.getDnsServerPort())
30+
.noEntriesResponseCode(json.getNoEntriesResponseCode())
31+
.build()
32+
)
2833
.webServerPort(json.getWebServerPort())
29-
.dnsServerPort(json.getDnsServerPort())
30-
.serverProtocol(json.getServerProtocol())
3134
.build()
3235
)
3336
.defaultDns(Config.DefaultDns

src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v2/legacyenv/ConfigEnvMapper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ public static Config toConfig(ConfigEnv config) {
99
return Config.builder()
1010
.server(Config.Server
1111
.builder()
12-
.dnsServerNoEntriesResponseCode(config.getNoEntriesResponseCode())
12+
.dns(Config.Server.Dns.builder()
13+
.noEntriesResponseCode(config.getNoEntriesResponseCode())
14+
.build()
15+
)
1316
.build()
1417
)
1518
.log(Config.Log

src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/ConfigV3.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ static public class DefaultDns {
7575
static public class Dns {
7676
Integer port;
7777
Integer noEntriesResponseCode;
78+
String protocol;
7879
}
7980

8081
@Data
@@ -188,9 +189,9 @@ static public class ResolvConf {
188189
@Accessors(chain = true)
189190
@FieldDefaults(level = AccessLevel.PRIVATE)
190191
static public class Server {
192+
String host;
191193
Dns dns;
192194
Web web;
193-
String protocol;
194195
}
195196

196197
@Data

src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/mapper/ConfigMapper.java

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import com.mageddo.net.IP;
2020
import com.mageddo.net.IpAddr;
2121

22+
import org.apache.commons.lang3.EnumUtils;
23+
2224
import static java.util.Collections.emptyList;
2325
import static java.util.stream.Collectors.toList;
2426

@@ -65,20 +67,24 @@ private static Config.Server mapServer(final ConfigV3.Server s) {
6567
return null;
6668
}
6769

70+
final var web = s.getWeb();
6871
return Config.Server.builder()
69-
.dnsServerPort(s.getDns() != null ? s.getDns()
70-
.getPort() : null)
71-
.dnsServerNoEntriesResponseCode(
72-
s.getDns() != null ? s.getDns()
73-
.getNoEntriesResponseCode() : null
74-
)
75-
.webServerPort(s.getWeb() != null ? s.getWeb()
76-
.getPort() : null)
77-
.serverProtocol(
78-
s.getProtocol() != null
79-
? SimpleServer.Protocol.valueOf(s.getProtocol())
80-
: null
81-
)
72+
.host(s.getHost())
73+
.dns(mapDnsServer(s))
74+
.webServerPort(web != null ? web.getPort() : null)
75+
.build();
76+
}
77+
78+
private static Config.Server.Dns mapDnsServer(ConfigV3.Server server) {
79+
final var dns = server.getDns();
80+
if(dns == null) {
81+
return null;
82+
}
83+
return Config.Server.Dns
84+
.builder()
85+
.protocol(EnumUtils.getEnum(SimpleServer.Protocol.class, dns.getProtocol()))
86+
.port(dns.getPort())
87+
.noEntriesResponseCode(dns.getNoEntriesResponseCode())
8288
.build();
8389
}
8490

@@ -87,15 +93,17 @@ private static ConfigV3.Server mapServerV3(final Config config) {
8793
return null;
8894
}
8995

96+
final var server = config.getServer();
9097
return new ConfigV3.Server()
98+
.setHost(server.getHost())
9199
.setDns(new ConfigV3.Dns()
100+
.setProtocol(Objects.toString(config.getServerProtocol(), null))
92101
.setPort(config.getDnsServerPort())
93102
.setNoEntriesResponseCode(config.getNoEntriesResponseCode())
94103
)
95104
.setWeb(new ConfigV3.Web()
96105
.setPort(config.getWebServerPort())
97-
)
98-
.setProtocol(Objects.toString(config.getServerProtocol(), null));
106+
);
99107
}
100108

101109
/* ================= DEFAULT DNS ================= */

src/main/java/com/mageddo/dnsproxyserver/config/mapper/ConfigMapper.java

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616
import com.mageddo.dnsproxyserver.config.Config;
1717
import com.mageddo.dnsproxyserver.config.Config.DefaultDns;
1818
import com.mageddo.dnsproxyserver.config.Config.Env;
19+
import com.mageddo.dnsproxyserver.config.Config.Server;
1920
import com.mageddo.dnsproxyserver.config.Config.SolverDocker;
2021
import com.mageddo.dnsproxyserver.config.StaticThresholdCircuitBreakerStrategyConfig;
2122
import com.mageddo.dnsproxyserver.config.validator.ConfigValidator;
2223
import com.mageddo.dnsproxyserver.solver.docker.Network;
2324
import com.mageddo.dnsproxyserver.utils.Numbers;
2425
import com.mageddo.dnsproxyserver.version.VersionDAO;
25-
import com.mageddo.dnsserver.SimpleServer;
26+
import com.mageddo.dnsserver.SimpleServer.Protocol;
2627
import com.mageddo.net.IP;
2728
import com.mageddo.net.IpAddr;
2829

@@ -144,14 +145,31 @@ public Config mapFrom(List<Config> configs) {
144145
private Config mapFrom0(List<Config> configs) {
145146

146147
final var config = Config.builder()
147-
.server(Config.Server
148+
.server(Server
148149
.builder()
150+
.host(ValueResolver.findFirstOrThrow(
151+
configs,
152+
Config::getServer,
153+
Server::getHost
154+
))
149155
.webServerPort(Numbers.firstPositive(mapField(Config::getWebServerPort, configs)))
150-
.dnsServerPort(Numbers.firstPositive(mapField(Config::getDnsServerPort, configs)))
151-
.serverProtocol(firstNonNullRequiring(mapField(
152-
Config::getServerProtocol, configs)))
153-
.dnsServerNoEntriesResponseCode(
154-
firstNonNullRequiring(mapField(Config::getNoEntriesResponseCode, configs))
156+
.dns(Server.Dns.builder()
157+
.protocol(ValueResolver.findFirstOrThrow(
158+
configs,
159+
Config::getDnsServer,
160+
Server.Dns::getProtocol
161+
))
162+
.port(ValueResolver.findFirstOrThrow(
163+
configs,
164+
Config::getDnsServer,
165+
Server.Dns::getPort
166+
))
167+
.noEntriesResponseCode(ValueResolver.findFirstOrThrow(
168+
configs,
169+
Config::getDnsServer,
170+
Server.Dns::getNoEntriesResponseCode
171+
))
172+
.build()
155173
)
156174
.build()
157175
)
@@ -258,9 +276,15 @@ private Config mapFrom0(List<Config> configs) {
258276
static Config buildDefault() {
259277
return Config
260278
.builder()
261-
.server(Config.Server
262-
.builder()
263-
.serverProtocol(SimpleServer.Protocol.UDP_TCP)
279+
.server(Server.builder()
280+
.host("0.0.0.0")
281+
.dns(Server.Dns.builder()
282+
.protocol(Protocol.UDP_TCP)
283+
.port(53)
284+
.noEntriesResponseCode(3)
285+
.build()
286+
)
287+
.webServerPort(5380)
264288
.build()
265289
)
266290
.defaultDns(DefaultDns.builder()

0 commit comments

Comments
 (0)