Compare commits

..

85 Commits

Author SHA1 Message Date
世界
139a48780f
documentation: Bump version 2025-04-25 11:58:57 +08:00
世界
bc63a6028d
clash-api: Add more meta api 2025-04-25 11:58:57 +08:00
世界
284f10b296
Fix DNS Lookup 2025-04-25 11:58:56 +08:00
世界
7a109569f9
Fix tailscale sending unexpected stuff 2025-04-25 11:58:51 +08:00
世界
ea342f257a
Fix fetch ECH configs 2025-04-25 11:56:39 +08:00
reletor
8814994368
documentation: Minor fixes 2025-04-25 11:56:39 +08:00
caelansar
20d338a06b
Fix callback deletion in UDP transport 2025-04-25 11:56:39 +08:00
世界
7527134ef2
documentation: Try to make the play review happy 2025-04-25 11:56:39 +08:00
世界
43230a89ef
Fix missing handling of legacy domain_strategy options 2025-04-25 11:56:38 +08:00
世界
967d84825f
Improve local DNS server 2025-04-25 11:56:38 +08:00
anytls
c38000d94f
Update anytls
Co-authored-by: anytls <anytls>
2025-04-25 11:56:15 +08:00
世界
ff8e11dfe3
Fix DNS dialer 2025-04-25 11:56:15 +08:00
世界
eaaa70f118
release: Skip override version for iOS 2025-04-25 11:56:14 +08:00
iikira
13870fb4b5
Fix UDP DNS server crash
Signed-off-by: iikira <i2@mail.iikira.com>
2025-04-25 11:56:14 +08:00
ReleTor
961d586e47
Fix fetch ECH configs 2025-04-25 11:56:14 +08:00
世界
4f4b7def78
release: Update Go to 1.24.2 2025-04-25 11:56:13 +08:00
世界
4acb3065b8
Allow direct outbounds without domain_resolver 2025-04-25 11:56:13 +08:00
世界
0ab2ef8c44
Fix Tailscale dialer 2025-04-25 11:56:13 +08:00
dyhkwong
56c144fc2b
Fix DNS over QUIC stream close 2025-04-25 11:56:13 +08:00
anytls
7f0fec0bb3
Update anytls
Co-authored-by: anytls <anytls>
2025-04-25 11:56:12 +08:00
Rambling2076
448d534d25
Fix missing with_tailscale in Dockerfile
Signed-off-by: Rambling2076 <Rambling2076@proton.me>
2025-04-25 11:56:12 +08:00
世界
f9f60bb9ea
Fail when default DNS server not found 2025-04-25 11:56:12 +08:00
世界
9554908971
Update gVisor to 20250319.0 2025-04-25 11:56:11 +08:00
世界
74be568a93
release: Do not build tailscale on iOS and tvOS 2025-04-25 11:56:11 +08:00
世界
b37f4b68d5
Explicitly reject detour to empty direct outbounds 2025-04-25 11:56:11 +08:00
世界
bbe6ded13c
Add netns support 2025-04-25 11:56:11 +08:00
世界
9111cfa5d7
Add wildcard name support for predefined records 2025-04-25 11:56:11 +08:00
世界
546218c0f8
Remove map usage in options 2025-04-25 11:56:10 +08:00
世界
680f8dd008
Fix unhandled DNS loop 2025-04-25 11:56:10 +08:00
世界
13c251287b
Add wildcard-sni support for shadow-tls inbound 2025-04-25 11:56:09 +08:00
世界
8051bb4f3b
Fix Tailscale DNS 2025-04-25 11:56:09 +08:00
k9982874
24c7b040c5
Add ntp protocol sniffing 2025-04-25 11:56:08 +08:00
世界
ac74bbf5dd
option: Fix marshal legacy DNS options 2025-04-25 11:56:08 +08:00
世界
2d72940096
Make domain_resolver optional when only one DNS server is configured 2025-04-25 11:56:08 +08:00
世界
b2d6708f96
Fix DNS lookup context pollution 2025-04-25 11:56:08 +08:00
世界
5108103f3f
Fix http3 DNS server connecting to wrong address 2025-04-25 11:56:07 +08:00
Restia-Ashbell
e875eebf9c
documentation: Fix typo 2025-04-25 11:56:07 +08:00
anytls
445eae88ab
Update sing-anytls
Co-authored-by: anytls <anytls>
2025-04-25 11:56:07 +08:00
k9982874
3f4f804e3e
Fix hosts DNS server 2025-04-25 11:56:07 +08:00
世界
1347d92ebe
Fix UDP DNS server crash 2025-04-25 11:56:06 +08:00
世界
2819ec16f3
documentation: Fix missing ip_accept_any DNS rule option 2025-04-25 11:56:06 +08:00
世界
aa5e7822a4
Fix anytls dialer usage 2025-04-25 11:56:06 +08:00
世界
fa7d03542d
Move predefined DNS server to rule action 2025-04-25 11:56:06 +08:00
世界
dbbab063fe
Fix domain resolver on direct outbound 2025-04-25 11:56:05 +08:00
Zephyruso
ded7d45dee
Fix missing AnyTLS display name 2025-04-25 11:56:05 +08:00
anytls
96bf78ddc1
Update sing-anytls
Co-authored-by: anytls <anytls>
2025-04-25 11:56:05 +08:00
Estel
5af81fa969
documentation: Fix typo
Signed-off-by: Estel <callmebedrockdigger@gmail.com>
2025-04-25 11:56:04 +08:00
TargetLocked
a4ff6f2075
Fix parsing legacy DNS options 2025-04-25 11:56:04 +08:00
世界
3ea9468107
Fix DNS fallback 2025-04-25 11:56:04 +08:00
世界
a7c7703fd3
documentation: Fix missing hosts DNS server 2025-04-25 11:56:03 +08:00
anytls
db33a68eb2
Add MinIdleSession option to AnyTLS outbound
Co-authored-by: anytls <anytls>
2025-04-25 11:56:03 +08:00
ReleTor
c3e4bf6a4c
documentation: Minor fixes 2025-04-25 11:56:03 +08:00
libtry486
3e455902c9
documentation: Fix typo
fix typo

Signed-off-by: libtry486 <89328481+libtry486@users.noreply.github.com>
2025-04-25 11:56:02 +08:00
Alireza Ahmadi
aaba387a8a
Fix Outbound deadlock 2025-04-25 11:56:02 +08:00
世界
4d1be802cb
documentation: Fix AnyTLS doc 2025-04-25 11:56:02 +08:00
anytls
83ccc72e2b
Add AnyTLS protocol 2025-04-25 11:56:02 +08:00
世界
f9e850867a
Migrate to stdlib ECH support 2025-04-25 11:56:01 +08:00
世界
342c2361f1
Add fallback local DNS server for iOS 2025-04-25 11:56:01 +08:00
世界
ac4e30b190
Get darwin local DNS server from libresolv 2025-04-25 11:56:00 +08:00
世界
cf008519fd
Improve resolve action 2025-04-25 11:56:00 +08:00
世界
91d9fc63b7
Fix toolchain version 2025-04-25 11:55:59 +08:00
世界
7d054da0b1
Add back port hopping to hysteria 1 2025-04-25 11:55:59 +08:00
世界
40d35829e1
Update dependencies 2025-04-25 11:55:59 +08:00
xchacha20-poly1305
41ad180be1
Remove single quotes of raw Moziila certs 2025-04-25 11:55:58 +08:00
世界
9cb07a2387
Add Tailscale endpoint 2025-04-25 11:55:58 +08:00
世界
086784baf3
Build legacy binaries with latest Go 2025-04-25 11:55:58 +08:00
世界
0e8cd7d3be
documentation: Remove outdated icons 2025-04-25 11:55:57 +08:00
世界
58f712d222
documentation: Certificate store 2025-04-25 11:55:57 +08:00
世界
dfb7569d11
documentation: TLS fragment 2025-04-25 11:55:56 +08:00
世界
638179fd7c
documentation: Outbound domain resolver 2025-04-25 11:55:56 +08:00
世界
69fff5591f
documentation: Refactor DNS 2025-04-25 11:55:56 +08:00
世界
7c3c3ddbeb
Add certificate store 2025-04-25 11:55:56 +08:00
世界
d88e87b9a4
Add TLS fragment support 2025-04-25 11:55:42 +08:00
世界
1f529be0f1
refactor: Outbound domain resolver 2025-04-25 11:54:18 +08:00
世界
f87808f8c3
refactor: DNS 2025-04-25 11:54:14 +08:00
世界
11e3634a63
Fix panic on some stupid input 2025-04-25 11:49:25 +08:00
世界
c46f70a4c8
Fix ssh outbound 2025-04-25 11:35:22 +08:00
世界
4ed2e1ee1b
Fix wireguard listening 2025-04-25 09:55:54 +08:00
世界
aa8a85b4bc
option: Fix listable again and again 2025-04-25 09:52:00 +08:00
世界
6103ecb771
option: Fix omitempty reject method 2025-04-25 09:47:45 +08:00
世界
3dbe90c535
release: Fix apt-get install 2025-04-25 09:07:41 +08:00
世界
0eac73a8fd
Fix set wireguard reserved on Linux 2025-04-25 09:02:20 +08:00
世界
f9cb268ee7
Fix vmess working with zero uuids 2025-04-25 08:55:26 +08:00
世界
d7085167e7
Fix hysteria1 server panic 2025-04-24 21:46:23 +08:00
世界
c80d62968c
Fix DNS crash 2025-04-22 23:02:06 +08:00
17 changed files with 28 additions and 90 deletions

@ -1 +1 @@
Subproject commit 6a15780ce1659a234816f7248cbc09e8ea54a1be Subproject commit 55f31c29bb68895ce544e0dfbf852b4b3e32b530

View File

@ -341,17 +341,7 @@ func (d *DefaultDialer) ListenSerialInterfacePacket(ctx context.Context, destina
} }
func (d *DefaultDialer) ListenPacketCompat(network, address string) (net.PacketConn, error) { func (d *DefaultDialer) ListenPacketCompat(network, address string) (net.PacketConn, error) {
udpListener := d.udpListener return d.udpListener.ListenPacket(context.Background(), network, address)
udpListener.Control = control.Append(udpListener.Control, func(network, address string, conn syscall.RawConn) error {
for _, wgControlFn := range WgControlFns {
err := wgControlFn(network, address, conn)
if err != nil {
return err
}
}
return nil
})
return udpListener.ListenPacket(context.Background(), network, address)
} }
func trackConn(conn net.Conn, err error) (net.Conn, error) { func trackConn(conn net.Conn, err error) (net.Conn, error) {

View File

@ -268,10 +268,13 @@ func (c *Client) Lookup(ctx context.Context, transport adapter.DNSTransport, dom
return nil return nil
}) })
err := group.Run(ctx) err := group.Run(ctx)
if len(response4) == 0 && len(response6) == 0 { if len(response4) > 0 || len(response6) > 0 {
return sortAddresses(response4, response6, options.Strategy), nil
} else if err != nil {
return nil, err return nil, err
} else {
return nil, RcodeError(dns.RcodeNameError)
} }
return sortAddresses(response4, response6, options.Strategy), nil
} }
func (c *Client) ClearCache() { func (c *Client) ClearCache() {

View File

@ -323,9 +323,6 @@ func (r *Router) Lookup(ctx context.Context, domain string, options adapter.DNSQ
err error err error
) )
printResult := func() { printResult := func() {
if err == nil && len(responseAddrs) == 0 {
err = E.New("empty result")
}
if err != nil { if err != nil {
if errors.Is(err, ErrResponseRejectedCached) { if errors.Is(err, ErrResponseRejectedCached) {
r.logger.DebugContext(ctx, "response rejected for ", domain, " (cached)") r.logger.DebugContext(ctx, "response rejected for ", domain, " (cached)")
@ -334,15 +331,14 @@ func (r *Router) Lookup(ctx context.Context, domain string, options adapter.DNSQ
} else { } else {
r.logger.ErrorContext(ctx, E.Cause(err, "lookup failed for ", domain)) r.logger.ErrorContext(ctx, E.Cause(err, "lookup failed for ", domain))
} }
} } else if len(responseAddrs) == 0 {
if err != nil { panic("unexpected empty result")
err = E.Cause(err, "lookup ", domain)
} }
} }
responseAddrs, cached = r.client.LookupCache(domain, options.Strategy) responseAddrs, cached = r.client.LookupCache(domain, options.Strategy)
if cached { if cached {
if len(responseAddrs) == 0 { if len(responseAddrs) == 0 {
return nil, E.New("lookup ", domain, ": empty result (cached)") return nil, RcodeNameError
} }
return responseAddrs, nil return responseAddrs, nil
} }

View File

@ -93,9 +93,7 @@ func NewHTTPS(ctx context.Context, logger log.ContextLogger, tag string, options
return nil, err return nil, err
} }
serverAddr := options.DNSServerAddressOptions.Build() serverAddr := options.DNSServerAddressOptions.Build()
if !serverAddr.Addr.IsValid() { if serverAddr.Port == 0 {
return nil, E.New("invalid server address: ", serverAddr)
} else if serverAddr.Port == 0 {
serverAddr.Port = 443 serverAddr.Port = 443
} }
return NewHTTPSRaw( return NewHTTPSRaw(

View File

@ -3,7 +3,6 @@ package local
import ( import (
"context" "context"
"math/rand" "math/rand"
"net/netip"
"time" "time"
"github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/adapter"
@ -91,9 +90,8 @@ func (t *Transport) exchangeParallel(ctx context.Context, systemConfig *dnsConfi
startRacer := func(ctx context.Context, fqdn string) { startRacer := func(ctx context.Context, fqdn string) {
response, err := t.tryOneName(ctx, systemConfig, fqdn, message) response, err := t.tryOneName(ctx, systemConfig, fqdn, message)
if err == nil { if err == nil {
var addresses []netip.Addr addresses, _ := dns.MessageToAddresses(response)
addresses, err = dns.MessageToAddresses(response) if len(addresses) == 0 {
if err == nil && len(addresses) == 0 {
err = E.New(fqdn, ": empty result") err = E.New(fqdn, ": empty result")
} }
} }

View File

@ -89,9 +89,7 @@ func NewHTTP3(ctx context.Context, logger log.ContextLogger, tag string, options
return nil, err return nil, err
} }
serverAddr := options.DNSServerAddressOptions.Build() serverAddr := options.DNSServerAddressOptions.Build()
if !serverAddr.Addr.IsValid() { if serverAddr.Port == 0 {
return nil, E.New("invalid server address: ", serverAddr)
} else if serverAddr.Port == 0 {
serverAddr.Port = 443 serverAddr.Port = 443
} }
return &HTTP3Transport{ return &HTTP3Transport{

View File

@ -16,7 +16,6 @@ import (
sQUIC "github.com/sagernet/sing-quic" sQUIC "github.com/sagernet/sing-quic"
"github.com/sagernet/sing/common" "github.com/sagernet/sing/common"
"github.com/sagernet/sing/common/bufio" "github.com/sagernet/sing/common/bufio"
E "github.com/sagernet/sing/common/exceptions"
"github.com/sagernet/sing/common/logger" "github.com/sagernet/sing/common/logger"
M "github.com/sagernet/sing/common/metadata" M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network" N "github.com/sagernet/sing/common/network"
@ -56,9 +55,7 @@ func NewQUIC(ctx context.Context, logger log.ContextLogger, tag string, options
tlsConfig.SetNextProtos([]string{"doq"}) tlsConfig.SetNextProtos([]string{"doq"})
} }
serverAddr := options.DNSServerAddressOptions.Build() serverAddr := options.DNSServerAddressOptions.Build()
if !serverAddr.Addr.IsValid() { if serverAddr.Port == 0 {
return nil, E.New("invalid server address: ", serverAddr)
} else if serverAddr.Port == 0 {
serverAddr.Port = 853 serverAddr.Port = 853
} }
return &Transport{ return &Transport{

View File

@ -13,7 +13,6 @@ import (
"github.com/sagernet/sing-box/option" "github.com/sagernet/sing-box/option"
"github.com/sagernet/sing/common" "github.com/sagernet/sing/common"
"github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/buf"
E "github.com/sagernet/sing/common/exceptions"
M "github.com/sagernet/sing/common/metadata" M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network" N "github.com/sagernet/sing/common/network"
@ -38,9 +37,7 @@ func NewTCP(ctx context.Context, logger log.ContextLogger, tag string, options o
return nil, err return nil, err
} }
serverAddr := options.DNSServerAddressOptions.Build() serverAddr := options.DNSServerAddressOptions.Build()
if !serverAddr.Addr.IsValid() { if serverAddr.Port == 0 {
return nil, E.New("invalid server address: ", serverAddr)
} else if serverAddr.Port == 0 {
serverAddr.Port = 53 serverAddr.Port = 53
} }
return &TCPTransport{ return &TCPTransport{

View File

@ -54,9 +54,7 @@ func NewTLS(ctx context.Context, logger log.ContextLogger, tag string, options o
return nil, err return nil, err
} }
serverAddr := options.DNSServerAddressOptions.Build() serverAddr := options.DNSServerAddressOptions.Build()
if !serverAddr.Addr.IsValid() { if serverAddr.Port == 0 {
return nil, E.New("invalid server address: ", serverAddr)
} else if serverAddr.Port == 0 {
serverAddr.Port = 853 serverAddr.Port = 853
} }
return &TLSTransport{ return &TLSTransport{

View File

@ -13,7 +13,6 @@ import (
"github.com/sagernet/sing-box/log" "github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option" "github.com/sagernet/sing-box/option"
"github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/buf"
E "github.com/sagernet/sing/common/exceptions"
"github.com/sagernet/sing/common/logger" "github.com/sagernet/sing/common/logger"
M "github.com/sagernet/sing/common/metadata" M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network" N "github.com/sagernet/sing/common/network"
@ -45,9 +44,7 @@ func NewUDP(ctx context.Context, logger log.ContextLogger, tag string, options o
return nil, err return nil, err
} }
serverAddr := options.DNSServerAddressOptions.Build() serverAddr := options.DNSServerAddressOptions.Build()
if !serverAddr.Addr.IsValid() { if serverAddr.Port == 0 {
return nil, E.New("invalid server address: ", serverAddr)
} else if serverAddr.Port == 0 {
serverAddr.Port = 53 serverAddr.Port = 53
} }
return NewUDPRaw(logger, dns.NewTransportAdapterWithRemoteOptions(C.DNSTypeUDP, tag, options), transportDialer, serverAddr), nil return NewUDPRaw(logger, dns.NewTransportAdapterWithRemoteOptions(C.DNSTypeUDP, tag, options), transportDialer, serverAddr), nil

View File

@ -2,16 +2,6 @@
icon: material/alert-decagram icon: material/alert-decagram
--- ---
#### 1.12.0-beta.6
* Fixes and improvements
### 1.11.9
* Fixes and improvements
_We are temporarily unable to update sing-box apps on the App Store because the reviewer mistakenly found that we violated the rules (TestFlight users are not affected)._
#### 1.12.0-beta.5 #### 1.12.0-beta.5
* Fixes and improvements * Fixes and improvements

View File

@ -83,6 +83,7 @@ type DialerOptions struct {
NetworkType badoption.Listable[InterfaceType] `json:"network_type,omitempty"` NetworkType badoption.Listable[InterfaceType] `json:"network_type,omitempty"`
FallbackNetworkType badoption.Listable[InterfaceType] `json:"fallback_network_type,omitempty"` FallbackNetworkType badoption.Listable[InterfaceType] `json:"fallback_network_type,omitempty"`
FallbackDelay badoption.Duration `json:"fallback_delay,omitempty"` FallbackDelay badoption.Duration `json:"fallback_delay,omitempty"`
IsWireGuardListener bool `json:"-"`
// Deprecated: migrated to domain resolver // Deprecated: migrated to domain resolver
DomainStrategy DomainStrategy `json:"domain_strategy,omitempty"` DomainStrategy DomainStrategy `json:"domain_strategy,omitempty"`

View File

@ -45,8 +45,8 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL
logger: logger, logger: logger,
localAddresses: options.Address, localAddresses: options.Address,
} }
if options.Detour != "" && options.ListenPort != 0 { if options.Detour == "" {
return nil, E.New("`listen_port` is conflict with `detour`") options.IsWireGuardListener = true
} }
outboundDialer, err := dialer.NewWithOptions(dialer.Options{ outboundDialer, err := dialer.NewWithOptions(dialer.Options{
Context: ctx, Context: ctx,

View File

@ -46,7 +46,9 @@ func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextL
logger: logger, logger: logger,
localAddresses: options.LocalAddress, localAddresses: options.LocalAddress,
} }
if options.Detour != "" && options.GSO { if options.Detour == "" {
options.IsWireGuardListener = true
} else if options.GSO {
return nil, E.New("gso is conflict with detour") return nil, E.New("gso is conflict with detour")
} }
outboundDialer, err := dialer.NewWithOptions(dialer.Options{ outboundDialer, err := dialer.NewWithOptions(dialer.Options{

View File

@ -7,7 +7,6 @@ import (
"net" "net"
"net/netip" "net/netip"
"os" "os"
"strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
@ -67,17 +66,7 @@ func (m *ConnectionManager) NewConnection(ctx context.Context, this N.Dialer, co
remoteConn, err = this.DialContext(ctx, N.NetworkTCP, metadata.Destination) remoteConn, err = this.DialContext(ctx, N.NetworkTCP, metadata.Destination)
} }
if err != nil { if err != nil {
var remoteString string err = E.Cause(err, "open outbound connection")
if len(metadata.DestinationAddresses) > 0 {
remoteString = "[" + strings.Join(common.Map(metadata.DestinationAddresses, netip.Addr.String), ",") + "]"
} else {
remoteString = metadata.Destination.String()
}
var dialerString string
if outbound, isOutbound := this.(adapter.Outbound); isOutbound {
dialerString = " using outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
}
err = E.Cause(err, "open connection to ", remoteString, dialerString)
N.CloseOnHandshakeFailure(conn, onClose, err) N.CloseOnHandshakeFailure(conn, onClose, err)
m.logger.ErrorContext(ctx, err) m.logger.ErrorContext(ctx, err)
return return
@ -144,19 +133,8 @@ func (m *ConnectionManager) NewPacketConnection(ctx context.Context, this N.Dial
remoteConn, err = this.DialContext(ctx, N.NetworkUDP, metadata.Destination) remoteConn, err = this.DialContext(ctx, N.NetworkUDP, metadata.Destination)
} }
if err != nil { if err != nil {
var remoteString string
if len(metadata.DestinationAddresses) > 0 {
remoteString = "[" + strings.Join(common.Map(metadata.DestinationAddresses, netip.Addr.String), ",") + "]"
} else {
remoteString = metadata.Destination.String()
}
var dialerString string
if outbound, isOutbound := this.(adapter.Outbound); isOutbound {
dialerString = " using outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
}
err = E.Cause(err, "open packet connection to ", remoteString, dialerString)
N.CloseOnHandshakeFailure(conn, onClose, err) N.CloseOnHandshakeFailure(conn, onClose, err)
m.logger.ErrorContext(ctx, err) m.logger.ErrorContext(ctx, "open outbound packet connection: ", err)
return return
} }
remotePacketConn = bufio.NewUnbindPacketConn(remoteConn) remotePacketConn = bufio.NewUnbindPacketConn(remoteConn)
@ -171,13 +149,8 @@ func (m *ConnectionManager) NewPacketConnection(ctx context.Context, this N.Dial
remotePacketConn, err = this.ListenPacket(ctx, metadata.Destination) remotePacketConn, err = this.ListenPacket(ctx, metadata.Destination)
} }
if err != nil { if err != nil {
var dialerString string
if outbound, isOutbound := this.(adapter.Outbound); isOutbound {
dialerString = " using outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
}
err = E.Cause(err, "listen packet connection using ", dialerString)
N.CloseOnHandshakeFailure(conn, onClose, err) N.CloseOnHandshakeFailure(conn, onClose, err)
m.logger.ErrorContext(ctx, err) m.logger.ErrorContext(ctx, "listen outbound packet connection: ", err)
return return
} }
} }

View File

@ -141,7 +141,7 @@ func (e *Endpoint) Start(resolve bool) error {
return nil return nil
} }
var bind conn.Bind var bind conn.Bind
wgListener, isWgListener := common.Cast[conn.Listener](e.options.Dialer) wgListener, isWgListener := e.options.Dialer.(conn.Listener)
if isWgListener { if isWgListener {
bind = conn.NewStdNetBind(wgListener) bind = conn.NewStdNetBind(wgListener)
} else { } else {