|
|
|
@ -49,25 +49,20 @@ func New(ctx context.Context, config *Config) (*Handler, error) {
|
|
|
|
|
return f, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (v *Handler) ResolveIP(destination net.Destination) net.Destination { |
|
|
|
|
if !destination.Address.Family().IsDomain() { |
|
|
|
|
return destination |
|
|
|
|
func (v *Handler) ResolveIP(ctx context.Context, domain string) net.Address { |
|
|
|
|
if resolver, ok := proxy.ResolvedIPsFromContext(ctx); ok { |
|
|
|
|
ips := resolver.Resolve() |
|
|
|
|
if len(ips) == 0 { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
return ips[dice.Roll(len(ips))] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ips := v.dns.Get(destination.Address.Domain()) |
|
|
|
|
ips := v.dns.Get(domain) |
|
|
|
|
if len(ips) == 0 { |
|
|
|
|
log.Trace(newError("DNS returns nil answer. Keep domain as is.")) |
|
|
|
|
return destination |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ip := ips[dice.Roll(len(ips))] |
|
|
|
|
newDest := net.Destination{ |
|
|
|
|
Network: destination.Network, |
|
|
|
|
Address: net.IPAddress(ip), |
|
|
|
|
Port: destination.Port, |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
log.Trace(newError("changing destination from ", destination, " to ", newDest)) |
|
|
|
|
return newDest |
|
|
|
|
return net.IPAddress(ips[dice.Roll(len(ips))]) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dialer proxy.Dialer) error { |
|
|
|
@ -87,7 +82,15 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial
|
|
|
|
|
|
|
|
|
|
var conn internet.Connection |
|
|
|
|
if v.domainStrategy == Config_USE_IP && destination.Address.Family().IsDomain() { |
|
|
|
|
destination = v.ResolveIP(destination) |
|
|
|
|
ip := v.ResolveIP(ctx, destination.Address.Domain()) |
|
|
|
|
if ip != nil { |
|
|
|
|
destination = net.Destination{ |
|
|
|
|
Network: destination.Network, |
|
|
|
|
Address: ip, |
|
|
|
|
Port: destination.Port, |
|
|
|
|
} |
|
|
|
|
log.Trace(newError("changing destination to ", destination)) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err := retry.ExponentialBackoff(5, 100).On(func() error { |
|
|
|
|