Add skipFakeDNS to inbound session

This commit is contained in:
世界 2021-09-13 10:58:52 +08:00
parent e316cd4c66
commit 14aa152a8a
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
3 changed files with 19 additions and 4 deletions

View file

@ -53,6 +53,8 @@ type Inbound struct {
Uid uint32
// SagerNet private: AppStatus is the android app's status for the inbound connection
AppStatus []string
// SagerNet private
SkipFakeDNS bool
}
// Outbound is the metadata of an outbound connection.

View file

@ -137,6 +137,13 @@ func (ctx *Context) GetAppStatus() []string {
return ctx.Inbound.AppStatus
}
func (ctx Context) GetSkipFakeDNS() bool {
if ctx.Inbound == nil {
return false
}
return ctx.Inbound.SkipFakeDNS
}
// AsRoutingContext creates a context from context.context with session info.
func AsRoutingContext(ctx context.Context) routing.Context {
return &Context{

View file

@ -96,6 +96,12 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, d internet.
return newError("invalid outbound")
}
fakeDNS := true
inbound := session.InboundFromContext(ctx)
if inbound != nil && inbound.SkipFakeDNS {
fakeDNS = false
}
srcNetwork := outbound.Target.Network
dest := outbound.Target
@ -171,7 +177,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, d internet.
if !h.isOwnLink(ctx) {
isIPQuery, domain, id, qType := parseIPQuery(b.Bytes())
if isIPQuery {
go h.handleIPQuery(id, qType, domain, writer)
go h.handleIPQuery(id, qType, domain, writer, fakeDNS)
continue
}
}
@ -208,7 +214,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, d internet.
return nil
}
func (h *Handler) handleIPQuery(id uint16, qType dnsmessage.Type, domain string, writer dns_proto.MessageWriter) {
func (h *Handler) handleIPQuery(id uint16, qType dnsmessage.Type, domain string, writer dns_proto.MessageWriter, fakedns bool) {
var ips []net.IP
var err error
@ -219,13 +225,13 @@ func (h *Handler) handleIPQuery(id uint16, qType dnsmessage.Type, domain string,
ips, err = h.client.LookupIP(domain, dns.IPOption{
IPv4Enable: true,
IPv6Enable: false,
FakeEnable: true,
FakeEnable: fakedns,
})
case dnsmessage.TypeAAAA:
ips, err = h.client.LookupIP(domain, dns.IPOption{
IPv4Enable: false,
IPv6Enable: true,
FakeEnable: true,
FakeEnable: fakedns,
})
}