Support multiple routes per destination

This commit is contained in:
Frank Denis 2019-10-14 12:08:47 +02:00
parent e9ec2aa801
commit 322447aa91
4 changed files with 32 additions and 9 deletions

View File

@ -168,8 +168,8 @@ type BlockIPConfig struct {
}
type AnonymizedDNSRouteConfig struct {
ServerName string `toml:"server_name"`
RelayName string `toml:"via"`
ServerName string `toml:"server_name"`
RelayNames []string `toml:"via"`
}
type AnonymizedDNSConfig struct {
@ -433,10 +433,9 @@ func ConfigLoad(proxy *Proxy, svcFlag *string) error {
proxy.allWeeklyRanges = allWeeklyRanges
if configRoutes := config.AnonymizedDNS.Routes; configRoutes != nil {
routes := make(map[string]string)
routes := make(map[string][]string)
for _, configRoute := range configRoutes {
routes[configRoute.ServerName] = configRoute.RelayName
dlog.Debugf("Routing server [%s] via [%s]", configRoute.ServerName, configRoute.RelayName)
routes[configRoute.ServerName] = configRoute.RelayNames
}
proxy.routes = &routes
}
@ -491,7 +490,7 @@ func ConfigLoad(proxy *Proxy, svcFlag *string) error {
if proxy.routes != nil && len(*proxy.routes) > 0 {
for _, server := range proxy.registeredServers {
if via, ok := (*proxy.routes)[server.name]; ok {
dlog.Noticef("Anonymized DNS: routing [%v] via [%v]", server.name, via)
dlog.Noticef("Anonymized DNS: routing [%v] via %v", server.name, via)
}
}
}

View File

@ -546,6 +546,23 @@ cache_neg_max_ttl = 600
# minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
################################
# Anonymized DNS #
################################
[anonymized_dns]
## Define one or more routes, i.e. indirect ways to reach servers.
## A set of possible relay servers is assigned to each DNS resolver.
## A relay can be specified as a DNS Stamp (either a relay stamp, or a
## DNSCrypt stamp), an IP:port, a hostname:port, or a server name, if
## the server is in the servers_list.
# routes = [
# { server_name='comodo-02', via=['sdns://gRIxMzcuNzQuMjIzLjIzNDo0NDM'] },
# { server_name='quad9-dnscrypt-ip4-nofilter-pri', via=['sdns://gRIxMzcuNzQuMjIzLjIzNDo0NDM'] }
# ]
## Optional, local, static list of additional servers
## Mostly useful for testing your own servers.

View File

@ -66,7 +66,7 @@ type Proxy struct {
logMaxBackups int
blockedQueryResponse string
queryMeta []string
routes *map[string]string
routes *map[string][]string
showCerts bool
}

View File

@ -264,9 +264,16 @@ func (serversInfo *ServersInfo) fetchDNSCryptServerInfo(proxy *Proxy, name strin
var relayTCPAddr *net.TCPAddr
routes := proxy.routes
if routes != nil {
if relayName, ok := (*routes)[name]; ok {
if relayNames, ok := (*routes)[name]; ok {
var relayName string
if len(relayNames) > 0 {
candidate := rand.Intn(len(relayNames))
relayName = relayNames[candidate]
}
var relayCandidateStamp *stamps.ServerStamp
if stamp, err = stamps.NewServerStampFromString(relayName); err == nil {
if len(relayName) == 0 {
dlog.Errorf("Route declared for [%v] but an empty relay list", name)
} else if stamp, err = stamps.NewServerStampFromString(relayName); err == nil {
relayCandidateStamp = &stamp
} else if _, err := net.ResolveUDPAddr("udp", relayName); err == nil {
relayCandidateStamp = &stamps.ServerStamp{