Files
sing-box-extended-mirror/common/sniff/dns.go
T

58 lines
1.4 KiB
Go
Raw Normal View History

2022-07-06 12:39:44 +08:00
package sniff
import (
"context"
"encoding/binary"
"io"
"os"
2022-07-08 23:03:57 +08:00
"github.com/sagernet/sing-box/adapter"
C "github.com/sagernet/sing-box/constant"
2022-07-06 12:39:44 +08:00
"github.com/sagernet/sing/common/buf"
2025-04-04 16:21:50 +08:00
E "github.com/sagernet/sing/common/exceptions"
2022-07-06 15:01:09 +08:00
2022-09-13 16:18:39 +08:00
mDNS "github.com/miekg/dns"
2022-07-06 12:39:44 +08:00
)
2024-07-07 15:45:50 +08:00
func StreamDomainNameQuery(readCtx context.Context, metadata *adapter.InboundContext, reader io.Reader) error {
2022-07-06 12:39:44 +08:00
var length uint16
err := binary.Read(reader, binary.BigEndian, &length)
if err != nil {
2025-04-04 16:21:50 +08:00
return E.Cause1(ErrNeedMoreData, err)
2022-07-06 12:39:44 +08:00
}
2025-04-22 14:44:55 +08:00
if length < 12 {
2024-07-07 15:45:50 +08:00
return os.ErrInvalid
2022-07-06 12:39:44 +08:00
}
2023-07-02 16:38:38 +08:00
buffer := buf.NewSize(int(length))
2022-07-06 12:39:44 +08:00
defer buffer.Release()
2025-04-22 14:44:55 +08:00
var n int
n, err = buffer.ReadFullFrom(reader, buffer.FreeLen())
packet := buffer.Bytes()
if n > 2 && packet[2]&0x80 != 0 { // QR
return os.ErrInvalid
}
if n > 5 && packet[4] == 0 && packet[5] == 0 { // QDCOUNT
return os.ErrInvalid
}
for i := 6; i < 10; i++ {
// ANCOUNT, NSCOUNT
if n > i && packet[i] != 0 {
return os.ErrInvalid
}
}
2022-07-06 12:39:44 +08:00
if err != nil {
2025-04-04 16:21:50 +08:00
return E.Cause1(ErrNeedMoreData, err)
2022-07-06 12:39:44 +08:00
}
2025-04-22 14:44:55 +08:00
return DomainNameQuery(readCtx, metadata, packet)
2022-07-06 12:39:44 +08:00
}
2024-07-07 15:45:50 +08:00
func DomainNameQuery(ctx context.Context, metadata *adapter.InboundContext, packet []byte) error {
2022-09-13 16:18:39 +08:00
var msg mDNS.Msg
err := msg.Unpack(packet)
2025-04-22 14:44:55 +08:00
if err != nil || msg.Response || len(msg.Question) == 0 || len(msg.Answer) > 0 || len(msg.Ns) > 0 {
2024-07-07 15:45:50 +08:00
return err
2022-07-06 12:39:44 +08:00
}
2024-07-07 15:45:50 +08:00
metadata.Protocol = C.ProtocolDNS
return nil
2022-07-06 12:39:44 +08:00
}