mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-11-18 02:16:10 -05:00
afb8385a7e
Turn off fake DNS for request sent from Routing and Freedom outbound. Fake DNS now only apply to DNS outbound. This is important for Android, where VPN service take over all system DNS traffic and pass it to core. "UseIp" option can be used in Freedom outbound to avoid getting fake IP and fail connection. Co-authored-by: loyalsoldier <10487845+Loyalsoldier@users.noreply.github.com>
49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package dns
|
|
|
|
//go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen
|
|
|
|
import (
|
|
"github.com/v2fly/v2ray-core/v4/common/net"
|
|
"github.com/v2fly/v2ray-core/v4/features/dns"
|
|
"github.com/v2fly/v2ray-core/v4/features/routing"
|
|
)
|
|
|
|
// ResolvableContext is an implementation of routing.Context, with domain resolving capability.
|
|
type ResolvableContext struct {
|
|
routing.Context
|
|
dnsClient dns.Client
|
|
resolvedIPs []net.IP
|
|
}
|
|
|
|
// GetTargetIPs overrides original routing.Context's implementation.
|
|
func (ctx *ResolvableContext) GetTargetIPs() []net.IP {
|
|
if ips := ctx.Context.GetTargetIPs(); len(ips) != 0 {
|
|
return ips
|
|
}
|
|
|
|
if len(ctx.resolvedIPs) > 0 {
|
|
return ctx.resolvedIPs
|
|
}
|
|
|
|
if domain := ctx.GetTargetDomain(); len(domain) != 0 {
|
|
ips, err := ctx.dnsClient.LookupIP(domain, dns.IPOption{
|
|
IPv4Enable: true,
|
|
IPv6Enable: true,
|
|
FakeEnable: false,
|
|
})
|
|
if err == nil {
|
|
ctx.resolvedIPs = ips
|
|
return ips
|
|
}
|
|
newError("resolve ip for ", domain).Base(err).WriteToLog()
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ContextWithDNSClient creates a new routing context with domain resolving capability.
|
|
// Resolved domain IPs can be retrieved by GetTargetIPs().
|
|
func ContextWithDNSClient(ctx routing.Context, client dns.Client) routing.Context {
|
|
return &ResolvableContext{Context: ctx, dnsClient: client}
|
|
}
|