新增dnst隧道

This commit is contained in:
wenyifan
2026-07-04 13:48:22 +08:00
parent 74fef8838e
commit 5b1e38e2c0
3 changed files with 107 additions and 0 deletions
+34
View File
@@ -21,6 +21,7 @@ const (
var (
ErrInvalidPacket = errors.New("dns: invalid packet")
ErrShortBuffer = errors.New("dns: short buffer")
ErrUnsupported = errors.New("dns: unsupported operation")
)
type options struct {
@@ -28,6 +29,11 @@ type options struct {
udpSize uint16
}
type setBuffer interface {
SetReadBuffer(int) error
SetWriteBuffer(int) error
}
// Option configures a DNS packet wrapper.
type Option func(*options)
@@ -117,6 +123,20 @@ func (c *clientConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
return len(b), nil
}
func (c *clientConn) SetReadBuffer(n int) error {
if pc, ok := c.PacketConn.(setBuffer); ok {
return pc.SetReadBuffer(n)
}
return ErrUnsupported
}
func (c *clientConn) SetWriteBuffer(n int) error {
if pc, ok := c.PacketConn.(setBuffer); ok {
return pc.SetWriteBuffer(n)
}
return ErrUnsupported
}
type queryState struct {
id uint16
question []mdns.Question
@@ -184,6 +204,20 @@ func (c *serverConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
return len(b), nil
}
func (c *serverConn) SetReadBuffer(n int) error {
if pc, ok := c.PacketConn.(setBuffer); ok {
return pc.SetReadBuffer(n)
}
return ErrUnsupported
}
func (c *serverConn) SetWriteBuffer(n int) error {
if pc, ok := c.PacketConn.(setBuffer); ok {
return pc.SetWriteBuffer(n)
}
return ErrUnsupported
}
func (c *serverConn) storeQuery(addr net.Addr, m *mdns.Msg) {
if addr == nil {
return
+48
View File
@@ -59,3 +59,51 @@ func TestPacketConnRoundTrip(t *testing.T) {
t.Fatalf("client ReadFrom got %q, want %q", got, responsePayload)
}
}
func TestPacketConnSetBuffer(t *testing.T) {
base := &bufferPacketConn{}
client := ClientConn(base)
if err := client.(setBuffer).SetReadBuffer(1024); err != nil {
t.Fatal(err)
}
if err := client.(setBuffer).SetWriteBuffer(2048); err != nil {
t.Fatal(err)
}
if base.readBuffer != 1024 {
t.Fatalf("read buffer = %d, want 1024", base.readBuffer)
}
if base.writeBuffer != 2048 {
t.Fatalf("write buffer = %d, want 2048", base.writeBuffer)
}
server := ServerConn(base)
if err := server.(setBuffer).SetReadBuffer(4096); err != nil {
t.Fatal(err)
}
if err := server.(setBuffer).SetWriteBuffer(8192); err != nil {
t.Fatal(err)
}
if base.readBuffer != 4096 {
t.Fatalf("read buffer = %d, want 4096", base.readBuffer)
}
if base.writeBuffer != 8192 {
t.Fatalf("write buffer = %d, want 8192", base.writeBuffer)
}
}
type bufferPacketConn struct {
net.PacketConn
readBuffer int
writeBuffer int
}
func (c *bufferPacketConn) SetReadBuffer(n int) error {
c.readBuffer = n
return nil
}
func (c *bufferPacketConn) SetWriteBuffer(n int) error {
c.writeBuffer = n
return nil
}
+25
View File
@@ -3,6 +3,7 @@ package dns
import (
"context"
"crypto/tls"
"errors"
"net"
"strings"
@@ -65,6 +66,7 @@ func (l *dnsTunnelListener) Init(md md.Metadata) (err error) {
if err != nil {
return
}
bufferConn := conn
conn = dns_util.ServerConn(
conn,
@@ -82,6 +84,10 @@ func (l *dnsTunnelListener) Init(md md.Metadata) (err error) {
limiter.ServiceOption(l.options.Service),
limiter.NetworkOption(conn.LocalAddr().Network()),
)
conn = &setBufferPacketConn{
PacketConn: conn,
bufferConn: bufferConn,
}
config := &quic.Config{
KeepAlivePeriod: l.md.keepAlivePeriod,
@@ -203,3 +209,22 @@ func (c *dnsTunnelConn) LocalAddr() net.Addr {
func (c *dnsTunnelConn) RemoteAddr() net.Addr {
return c.raddr
}
type setBufferPacketConn struct {
net.PacketConn
bufferConn net.PacketConn
}
func (c *setBufferPacketConn) SetReadBuffer(n int) error {
if pc, ok := c.bufferConn.(interface{ SetReadBuffer(int) error }); ok {
return pc.SetReadBuffer(n)
}
return errors.New("dns: set read buffer unsupported")
}
func (c *setBufferPacketConn) SetWriteBuffer(n int) error {
if pc, ok := c.bufferConn.(interface{ SetWriteBuffer(int) error }); ok {
return pc.SetWriteBuffer(n)
}
return errors.New("dns: set write buffer unsupported")
}