mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-11-17 18:06:15 -05:00
50 lines
1.5 KiB
Go
50 lines
1.5 KiB
Go
package dispatcher
|
|
|
|
import (
|
|
"context"
|
|
|
|
"v2ray.com/core"
|
|
"v2ray.com/core/common"
|
|
"v2ray.com/core/common/net"
|
|
"v2ray.com/core/common/session"
|
|
"v2ray.com/core/features/dns"
|
|
)
|
|
|
|
// newFakeDNSSniffer Create a Fake DNS metadata sniffer
|
|
func newFakeDNSSniffer(ctx context.Context) (protocolSnifferWithMetadata, error) {
|
|
var fakeDNSEngine dns.FakeDNSEngine
|
|
err := core.RequireFeatures(ctx, func(fdns dns.FakeDNSEngine) {
|
|
fakeDNSEngine = fdns
|
|
})
|
|
if err != nil {
|
|
return protocolSnifferWithMetadata{}, err
|
|
}
|
|
if fakeDNSEngine == nil {
|
|
errNotInit := newError("FakeDNSEngine is not initialized, but such a sniffer is used").AtError()
|
|
return protocolSnifferWithMetadata{}, errNotInit
|
|
}
|
|
return protocolSnifferWithMetadata{protocolSniffer: func(ctx context.Context, bytes []byte) (SniffResult, error) {
|
|
Target := session.OutboundFromContext(ctx).Target
|
|
if Target.Network == net.Network_TCP || Target.Network == net.Network_UDP {
|
|
domainFromFakeDNS := fakeDNSEngine.GetDomainFromFakeDNS(Target.Address)
|
|
if domainFromFakeDNS != "" {
|
|
newError("fake dns got domain: ", domainFromFakeDNS, " for ip: ", Target.Address.String()).WriteToLog(session.ExportIDToError(ctx))
|
|
return &fakeDNSSniffResult{domainName: domainFromFakeDNS}, nil
|
|
}
|
|
}
|
|
return nil, common.ErrNoClue
|
|
}, metadataSniffer: true}, nil
|
|
}
|
|
|
|
type fakeDNSSniffResult struct {
|
|
domainName string
|
|
}
|
|
|
|
func (fakeDNSSniffResult) Protocol() string {
|
|
return "fakedns"
|
|
}
|
|
|
|
func (f fakeDNSSniffResult) Domain() string {
|
|
return f.domainName
|
|
}
|