mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-20 00:50:06 +08:00
chore: remove the redundant layer of udpnat in sing-tun to reduce resource usage when processing udp
Some checks failed
Test / test (1.20, macos-13) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-13) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-13) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-13) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-13) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Failing after 1s
Test / test (1.21, ubuntu-latest) (push) Failing after 1s
Test / test (1.22, ubuntu-latest) (push) Failing after 1s
Test / test (1.23, ubuntu-latest) (push) Failing after 1s
Test / test (1.24, ubuntu-latest) (push) Failing after 1s
Trigger CMFA Update / trigger-CMFA-update (push) Failing after 1s
Some checks failed
Test / test (1.20, macos-13) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-13) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-13) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-13) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-13) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Failing after 1s
Test / test (1.21, ubuntu-latest) (push) Failing after 1s
Test / test (1.22, ubuntu-latest) (push) Failing after 1s
Test / test (1.23, ubuntu-latest) (push) Failing after 1s
Test / test (1.24, ubuntu-latest) (push) Failing after 1s
Trigger CMFA Update / trigger-CMFA-update (push) Failing after 1s
This commit is contained in:
parent
9e3bf14b1a
commit
a0c46bb4b7
2
go.mod
2
go.mod
@ -31,7 +31,7 @@ require (
|
|||||||
github.com/metacubex/sing-shadowsocks v0.2.9
|
github.com/metacubex/sing-shadowsocks v0.2.9
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.3
|
github.com/metacubex/sing-shadowsocks2 v0.2.3
|
||||||
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2
|
||||||
github.com/metacubex/sing-tun v0.4.6-0.20250523121712-972bc1c2b1e7
|
github.com/metacubex/sing-tun v0.4.6-0.20250524070426-1a615b3de4c5
|
||||||
github.com/metacubex/sing-vmess v0.2.1
|
github.com/metacubex/sing-vmess v0.2.1
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f
|
github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f
|
||||||
github.com/metacubex/smux v0.0.0-20250503055512-501391591dee
|
github.com/metacubex/smux v0.0.0-20250503055512-501391591dee
|
||||||
|
|||||||
4
go.sum
4
go.sum
@ -128,8 +128,8 @@ github.com/metacubex/sing-shadowsocks2 v0.2.3 h1:v3rNS/5Ywh0NIZ6VU/NmdERQIN5RePz
|
|||||||
github.com/metacubex/sing-shadowsocks2 v0.2.3/go.mod h1:/WNy/Q8ahLCoPRriWuFZFD0Jy+JNp1MEQl28Zw6SaF8=
|
github.com/metacubex/sing-shadowsocks2 v0.2.3/go.mod h1:/WNy/Q8ahLCoPRriWuFZFD0Jy+JNp1MEQl28Zw6SaF8=
|
||||||
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MYPm7Wme3/OAY2FFzVq9d9GxPHOqu5AQfg/ddhI=
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MYPm7Wme3/OAY2FFzVq9d9GxPHOqu5AQfg/ddhI=
|
||||||
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E=
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E=
|
||||||
github.com/metacubex/sing-tun v0.4.6-0.20250523121712-972bc1c2b1e7 h1:vxkBCkZocH2de2tqeeCZxWvT1VjSJPFkE/8hGqvcLCQ=
|
github.com/metacubex/sing-tun v0.4.6-0.20250524070426-1a615b3de4c5 h1:i+aNFgMMcGFl0vxh7xf4LwAWhc7OzOBdd9SKsWx6vdQ=
|
||||||
github.com/metacubex/sing-tun v0.4.6-0.20250523121712-972bc1c2b1e7/go.mod h1:HDaHDL6onAX2ZGbAGUXKp++PohRdNb7Nzt6zxzhox+U=
|
github.com/metacubex/sing-tun v0.4.6-0.20250524070426-1a615b3de4c5/go.mod h1:HDaHDL6onAX2ZGbAGUXKp++PohRdNb7Nzt6zxzhox+U=
|
||||||
github.com/metacubex/sing-vmess v0.2.1 h1:I6gM3VUjtvJ15D805EUbNH+SRBuqzJeFnuIbKYUsWZ0=
|
github.com/metacubex/sing-vmess v0.2.1 h1:I6gM3VUjtvJ15D805EUbNH+SRBuqzJeFnuIbKYUsWZ0=
|
||||||
github.com/metacubex/sing-vmess v0.2.1/go.mod h1:DsODWItJtOMZNna8Qhheg8r3tUivrcO3vWgaTYKnfTo=
|
github.com/metacubex/sing-vmess v0.2.1/go.mod h1:DsODWItJtOMZNna8Qhheg8r3tUivrcO3vWgaTYKnfTo=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f h1:Sr/DYKYofKHKc4GF3qkRGNuj6XA6c0eqPgEDN+VAsYU=
|
github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f h1:Sr/DYKYofKHKc4GF3qkRGNuj6XA6c0eqPgEDN+VAsYU=
|
||||||
|
|||||||
@ -146,11 +146,11 @@ func (h *ListenerHandler) NewConnection(ctx context.Context, conn net.Conn, meta
|
|||||||
func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.PacketConn, metadata M.Metadata) error {
|
func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.PacketConn, metadata M.Metadata) error {
|
||||||
defer func() { _ = conn.Close() }()
|
defer func() { _ = conn.Close() }()
|
||||||
mutex := sync.Mutex{}
|
mutex := sync.Mutex{}
|
||||||
conn2 := bufio.NewNetPacketConn(conn) // a new interface to set nil in defer
|
writer := bufio.NewNetPacketWriter(conn) // a new interface to set nil in defer
|
||||||
defer func() {
|
defer func() {
|
||||||
mutex.Lock() // this goroutine must exit after all conn.WritePacket() is not running
|
mutex.Lock() // this goroutine must exit after all conn.WritePacket() is not running
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
conn2 = nil
|
writer = nil
|
||||||
}()
|
}()
|
||||||
rwOptions := network.ReadWaitOptions{}
|
rwOptions := network.ReadWaitOptions{}
|
||||||
readWaiter, isReadWaiter := bufio.CreatePacketReadWaiter(conn)
|
readWaiter, isReadWaiter := bufio.CreatePacketReadWaiter(conn)
|
||||||
@ -180,30 +180,46 @@ func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
cPacket := &packet{
|
cPacket := &packet{
|
||||||
conn: &conn2,
|
writer: &writer,
|
||||||
mutex: &mutex,
|
mutex: &mutex,
|
||||||
rAddr: metadata.Source.UDPAddr(),
|
rAddr: metadata.Source.UDPAddr(),
|
||||||
lAddr: conn.LocalAddr(),
|
lAddr: conn.LocalAddr(),
|
||||||
buff: buff,
|
buff: buff,
|
||||||
}
|
}
|
||||||
|
h.handlePacket(ctx, cPacket, metadata.Source, dest)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *ListenerHandler) NewPacket(ctx context.Context, key netip.AddrPort, buffer *buf.Buffer, metadata M.Metadata, init func(natConn network.PacketConn) network.PacketWriter) {
|
||||||
|
writer := bufio.NewNetPacketWriter(init(nil))
|
||||||
|
mutex := sync.Mutex{}
|
||||||
|
cPacket := &packet{
|
||||||
|
writer: &writer,
|
||||||
|
mutex: &mutex,
|
||||||
|
rAddr: metadata.Source.UDPAddr(),
|
||||||
|
lAddr: metadata.Source.UDPAddr(), // tun does not have real inAddr
|
||||||
|
buff: buffer,
|
||||||
|
}
|
||||||
|
h.handlePacket(ctx, cPacket, metadata.Source, metadata.Destination)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *ListenerHandler) handlePacket(ctx context.Context, cPacket *packet, source M.Socksaddr, destination M.Socksaddr) {
|
||||||
cMetadata := &C.Metadata{
|
cMetadata := &C.Metadata{
|
||||||
NetWork: C.UDP,
|
NetWork: C.UDP,
|
||||||
Type: h.Type,
|
Type: h.Type,
|
||||||
}
|
}
|
||||||
if metadata.Source.IsIP() && metadata.Source.Fqdn == "" {
|
if source.IsIP() && source.Fqdn == "" {
|
||||||
cMetadata.RawSrcAddr = metadata.Source.Unwrap().UDPAddr()
|
cMetadata.RawSrcAddr = source.Unwrap().UDPAddr()
|
||||||
}
|
}
|
||||||
if dest.IsIP() && dest.Fqdn == "" {
|
if destination.IsIP() && destination.Fqdn == "" {
|
||||||
cMetadata.RawDstAddr = dest.Unwrap().UDPAddr()
|
cMetadata.RawDstAddr = destination.Unwrap().UDPAddr()
|
||||||
}
|
}
|
||||||
inbound.ApplyAdditions(cMetadata, inbound.WithDstAddr(dest), inbound.WithSrcAddr(metadata.Source), inbound.WithInAddr(conn.LocalAddr()))
|
inbound.ApplyAdditions(cMetadata, inbound.WithDstAddr(destination), inbound.WithSrcAddr(source), inbound.WithInAddr(cPacket.InAddr()))
|
||||||
inbound.ApplyAdditions(cMetadata, h.Additions...)
|
inbound.ApplyAdditions(cMetadata, h.Additions...)
|
||||||
inbound.ApplyAdditions(cMetadata, getAdditions(ctx)...)
|
inbound.ApplyAdditions(cMetadata, getAdditions(ctx)...)
|
||||||
|
|
||||||
h.Tunnel.HandleUDPPacket(cPacket, cMetadata)
|
h.Tunnel.HandleUDPPacket(cPacket, cMetadata)
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *ListenerHandler) NewError(ctx context.Context, err error) {
|
func (h *ListenerHandler) NewError(ctx context.Context, err error) {
|
||||||
@ -225,7 +241,7 @@ func ShouldIgnorePacketError(err error) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type packet struct {
|
type packet struct {
|
||||||
conn *network.NetPacketConn
|
writer *network.NetPacketWriter
|
||||||
mutex *sync.Mutex
|
mutex *sync.Mutex
|
||||||
rAddr net.Addr
|
rAddr net.Addr
|
||||||
lAddr net.Addr
|
lAddr net.Addr
|
||||||
@ -245,7 +261,7 @@ func (c *packet) WriteBack(b []byte, addr net.Addr) (n int, err error) {
|
|||||||
|
|
||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
defer c.mutex.Unlock()
|
defer c.mutex.Unlock()
|
||||||
conn := *c.conn
|
conn := *c.writer
|
||||||
if conn == nil {
|
if conn == nil {
|
||||||
err = errors.New("writeBack to closed connection")
|
err = errors.New("writeBack to closed connection")
|
||||||
return
|
return
|
||||||
|
|||||||
@ -43,16 +43,31 @@ func (h *ListenerHandler) NewConnection(ctx context.Context, conn net.Conn, meta
|
|||||||
return h.ListenerHandler.NewConnection(ctx, conn, metadata)
|
return h.ListenerHandler.NewConnection(ctx, conn, metadata)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *ListenerHandler) NewPacket(ctx context.Context, key netip.AddrPort, buffer *buf.Buffer, metadata M.Metadata, init func(natConn network.PacketConn) network.PacketWriter) {
|
||||||
|
if h.ShouldHijackDns(metadata.Destination.AddrPort()) {
|
||||||
|
log.Debugln("[DNS] hijack udp:%s from %s", metadata.Destination.String(), metadata.Source.String())
|
||||||
|
writer := init(nil)
|
||||||
|
rwOptions := network.ReadWaitOptions{
|
||||||
|
FrontHeadroom: network.CalculateFrontHeadroom(writer),
|
||||||
|
RearHeadroom: network.CalculateRearHeadroom(writer),
|
||||||
|
MTU: resolver.SafeDnsPacketSize,
|
||||||
|
}
|
||||||
|
go relayDnsPacket(ctx, buffer, rwOptions, metadata.Destination, nil, &writer)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
h.ListenerHandler.NewPacket(ctx, key, buffer, metadata, init)
|
||||||
|
}
|
||||||
|
|
||||||
func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.PacketConn, metadata M.Metadata) error {
|
func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.PacketConn, metadata M.Metadata) error {
|
||||||
if h.ShouldHijackDns(metadata.Destination.AddrPort()) {
|
if h.ShouldHijackDns(metadata.Destination.AddrPort()) {
|
||||||
log.Debugln("[DNS] hijack udp:%s from %s", metadata.Destination.String(), metadata.Source.String())
|
log.Debugln("[DNS] hijack udp:%s from %s", metadata.Destination.String(), metadata.Source.String())
|
||||||
defer func() { _ = conn.Close() }()
|
defer func() { _ = conn.Close() }()
|
||||||
mutex := sync.Mutex{}
|
mutex := sync.Mutex{}
|
||||||
conn2 := conn // a new interface to set nil in defer
|
var writer network.PacketWriter = conn // a new interface to set nil in defer
|
||||||
defer func() {
|
defer func() {
|
||||||
mutex.Lock() // this goroutine must exit after all conn.WritePacket() is not running
|
mutex.Lock() // this goroutine must exit after all conn.WritePacket() is not running
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
conn2 = nil
|
writer = nil
|
||||||
}()
|
}()
|
||||||
rwOptions := network.ReadWaitOptions{
|
rwOptions := network.ReadWaitOptions{
|
||||||
FrontHeadroom: network.CalculateFrontHeadroom(conn),
|
FrontHeadroom: network.CalculateFrontHeadroom(conn),
|
||||||
@ -89,7 +104,14 @@ func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
go func() {
|
go relayDnsPacket(ctx, readBuff, rwOptions, dest, &mutex, &writer)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return h.ListenerHandler.NewPacketConnection(ctx, conn, metadata)
|
||||||
|
}
|
||||||
|
|
||||||
|
func relayDnsPacket(ctx context.Context, readBuff *buf.Buffer, rwOptions network.ReadWaitOptions, dest M.Socksaddr, mutex *sync.Mutex, writer *network.PacketWriter) {
|
||||||
ctx, cancel := context.WithTimeout(ctx, resolver.DefaultDnsRelayTimeout)
|
ctx, cancel := context.WithTimeout(ctx, resolver.DefaultDnsRelayTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
inData := readBuff.Bytes()
|
inData := readBuff.Bytes()
|
||||||
@ -107,9 +129,11 @@ func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
writeBuff.Truncate(len(msg))
|
writeBuff.Truncate(len(msg))
|
||||||
|
if mutex != nil {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
conn := conn2
|
}
|
||||||
|
conn := *writer
|
||||||
if conn == nil {
|
if conn == nil {
|
||||||
writeBuff.Release()
|
writeBuff.Release()
|
||||||
return
|
return
|
||||||
@ -119,11 +143,6 @@ func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.
|
|||||||
writeBuff.Release()
|
writeBuff.Release()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return h.ListenerHandler.NewPacketConnection(ctx, conn, metadata)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *ListenerHandler) TypeMutation(typ C.Type) *ListenerHandler {
|
func (h *ListenerHandler) TypeMutation(typ C.Type) *ListenerHandler {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user