新增dnst隧道
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user