mirror of
https://github.com/fumiama/terasu-cloudflared.git
synced 2026-06-05 09:00:23 +08:00
TUN-9473: Add --dns-resolver-addrs flag
To help support users with environments that don't work well with the DNS local resolver's automatic resolution process for local resolver addresses, we introduce a flag to provide them statically to the runtime. When providing the resolver addresses, cloudflared will no longer lookup the DNS resolver addresses and use the user input directly. When provided with a list of DNS resolvers larger than one, the resolver service will randomly select one at random for each incoming request. Closes TUN-9473
This commit is contained in:
@@ -157,4 +157,7 @@ const (
|
||||
|
||||
// ApiURL is the command line flag used to define the base URL of the API
|
||||
ApiURL = "api-url"
|
||||
|
||||
// Virtual DNS resolver service resolver addresses to use instead of dynamically fetching them from the OS.
|
||||
VirtualDNSServiceResolverAddresses = "dns-resolver-addrs"
|
||||
)
|
||||
|
||||
@@ -227,7 +227,17 @@ func prepareTunnelConfig(
|
||||
DefaultDialer: ingress.NewDialer(warpRoutingConfig),
|
||||
TCPWriteTimeout: c.Duration(flags.WriteStreamTimeout),
|
||||
}, log)
|
||||
|
||||
// Setup DNS Resolver Service
|
||||
dnsResolverAddrs := c.StringSlice(flags.VirtualDNSServiceResolverAddresses)
|
||||
dnsService := origins.NewDNSResolverService(origins.NewDNSDialer(), log)
|
||||
if len(dnsResolverAddrs) > 0 {
|
||||
addrs, err := parseResolverAddrPorts(dnsResolverAddrs)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("invalid %s provided: %w", flags.VirtualDNSServiceResolverAddresses, err)
|
||||
}
|
||||
dnsService = origins.NewStaticDNSResolverService(addrs, origins.NewDNSDialer(), log)
|
||||
}
|
||||
originDialerService.AddReservedService(dnsService, []netip.AddrPort{origins.VirtualDNSServiceAddr})
|
||||
|
||||
tunnelConfig := &supervisor.TunnelConfig{
|
||||
@@ -507,3 +517,19 @@ func findLocalAddr(dst net.IP, port int) (netip.Addr, error) {
|
||||
localAddr := localAddrPort.Addr()
|
||||
return localAddr, nil
|
||||
}
|
||||
|
||||
func parseResolverAddrPorts(input []string) ([]netip.AddrPort, error) {
|
||||
// We don't allow more than 10 resolvers to be provided statically for the resolver service.
|
||||
if len(input) > 10 {
|
||||
return nil, errors.New("too many addresses provided, max: 10")
|
||||
}
|
||||
addrs := make([]netip.AddrPort, 0, len(input))
|
||||
for _, val := range input {
|
||||
addr, err := netip.ParseAddrPort(val)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
addrs = append(addrs, addr)
|
||||
}
|
||||
return addrs, nil
|
||||
}
|
||||
|
||||
@@ -241,6 +241,11 @@ var (
|
||||
Usage: "Overrides the remote configuration for max active private network flows (TCP/UDP) that this cloudflared instance supports",
|
||||
EnvVars: []string{"TUNNEL_MAX_ACTIVE_FLOWS"},
|
||||
}
|
||||
dnsResolverAddrsFlag = &cli.StringSliceFlag{
|
||||
Name: flags.VirtualDNSServiceResolverAddresses,
|
||||
Usage: "Overrides the dynamic DNS resolver resolution to use these address:port's instead.",
|
||||
EnvVars: []string{"TUNNEL_DNS_RESOLVER_ADDRS"},
|
||||
}
|
||||
)
|
||||
|
||||
func buildCreateCommand() *cli.Command {
|
||||
@@ -718,6 +723,7 @@ func buildRunCommand() *cli.Command {
|
||||
icmpv4SrcFlag,
|
||||
icmpv6SrcFlag,
|
||||
maxActiveFlowsFlag,
|
||||
dnsResolverAddrsFlag,
|
||||
}
|
||||
flags = append(flags, configureProxyFlags(false)...)
|
||||
return &cli.Command{
|
||||
|
||||
Reference in New Issue
Block a user