Support multiple routes per destination
This commit is contained in:
parent
e9ec2aa801
commit
322447aa91
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -66,7 +66,7 @@ type Proxy struct {
|
|||
logMaxBackups int
|
||||
blockedQueryResponse string
|
||||
queryMeta []string
|
||||
routes *map[string]string
|
||||
routes *map[string][]string
|
||||
showCerts bool
|
||||
}
|
||||
|
||||
|
|
|
@ -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{
|
||||
|
|
Loading…
Reference in New Issue