diff --git a/app/dispatcher/fakednssniffer.go b/app/dispatcher/fakednssniffer.go index 17d7811f1..56e65f5e8 100644 --- a/app/dispatcher/fakednssniffer.go +++ b/app/dispatcher/fakednssniffer.go @@ -34,6 +34,15 @@ func newFakeDNSSniffer(ctx context.Context) (protocolSnifferWithMetadata, error) return &fakeDNSSniffResult{domainName: domainFromFakeDNS}, nil } } + + if ipAddressInRangeValueI := ctx.Value(ipAddressInRange); ipAddressInRangeValueI != nil { + ipAddressInRangeValue := ipAddressInRangeValueI.(*ipAddressInRangeOpt) + if fkr0, ok := fakeDNSEngine.(dns.FakeDNSEngineRev0); ok { + inPool := fkr0.IsIPInIPPool(Target.Address) + ipAddressInRangeValue.addressInRange = &inPool + } + } + return nil, common.ErrNoClue }, metadataSniffer: true}, nil } @@ -49,3 +58,55 @@ func (fakeDNSSniffResult) Protocol() string { func (f fakeDNSSniffResult) Domain() string { return f.domainName } + +type fakeDnsExtraOpts int + +const ipAddressInRange fakeDnsExtraOpts = 1 + +type ipAddressInRangeOpt struct { + addressInRange *bool +} + +type DNSThenOthersSniffResult struct { + domainName string +} + +func (DNSThenOthersSniffResult) Protocol() string { + return "fakedns+others" +} + +func (f DNSThenOthersSniffResult) Domain() string { + return f.domainName +} + +func newFakeDNSThenOthers(ctx context.Context, fakeDNSSniffer protocolSnifferWithMetadata, others []protocolSnifferWithMetadata) (protocolSnifferWithMetadata, error) { + return protocolSnifferWithMetadata{ + protocolSniffer: func(ctx context.Context, bytes []byte) (SniffResult, error) { + ipAddressInRangeValue := &ipAddressInRangeOpt{} + ctx = context.WithValue(ctx, ipAddressInRange, ipAddressInRangeValue) + result, err := fakeDNSSniffer.protocolSniffer(ctx, bytes) + if err == nil { + return result, nil + } + if ipAddressInRangeValue.addressInRange != nil { + if *ipAddressInRangeValue.addressInRange == true { + for _, v := range others { + if v.metadataSniffer || bytes != nil { + if result, err := v.protocolSniffer(ctx, bytes); err == nil { + return DNSThenOthersSniffResult{result.Domain()}, nil + } + } + } + return nil, common.ErrNoClue + } else { + newError("ip address not in fake dns range, return as is").AtDebug().WriteToLog() + return nil, common.ErrNoClue + } + } else { + newError("fake dns sniffer did not set address in range option, assume false.").AtWarning().WriteToLog() + return nil, common.ErrNoClue + } + }, + metadataSniffer: true, + }, nil +} diff --git a/app/dispatcher/sniffer.go b/app/dispatcher/sniffer.go index 92f0d5beb..57fcae063 100644 --- a/app/dispatcher/sniffer.go +++ b/app/dispatcher/sniffer.go @@ -39,7 +39,12 @@ func NewSniffer(ctx context.Context) *Sniffer { }, } if sniffer, err := newFakeDNSSniffer(ctx); err == nil { + others := ret.sniffer ret.sniffer = append(ret.sniffer, sniffer) + fakeDNSThenOthers, err := newFakeDNSThenOthers(ctx, sniffer, others) + if err != nil { + ret.sniffer = append(ret.sniffer, fakeDNSThenOthers) + } } return ret }