Compare commits

..

23 Commits

Author SHA1 Message Date
wwqgtxx
b585bfdf1b Update cast using in sing-vmess 2025-08-19 23:55:11 +08:00
wwqgtxx
194aad8d40 Make utlsConnWrapper replaceable 2025-08-19 23:26:00 +08:00
wwqgtxx
4e52c357fe Make realityConnWrapper replaceable 2025-08-19 23:26:00 +08:00
世界
3d8a72b9ba
documentation: Bump version 2025-08-19 23:13:53 +08:00
世界
31fca03ef5
Fix wireguard crash 2025-08-19 23:13:53 +08:00
世界
eb09af768c
documentation: Update behavior of local DNS server on darwin 2025-08-19 23:04:22 +08:00
世界
023fcf6572
Stop using DHCP on iOS and tvOS
We do not have the `com.apple.developer.networking.multicast` entitlement and are unable to obtain it for non-technical reasons.
2025-08-19 23:04:22 +08:00
世界
1596e072ab
Remove use of ldflags -checklinkname=0 on darwin 2025-08-19 21:56:56 +08:00
世界
31d88ac7d3
Fix local DNS server on darwin
We mistakenly believed that `libresolv`'s `search` function worked correctly in NetworkExtension, but it seems only `getaddrinfo` does.

This commit changes the behavior of the `local` DNS server in NetworkExtension to prefer DHCP, falling back to `getaddrinfo` if DHCP servers are unavailable.

It's worth noting that `prefer_go` does not disable DHCP since it respects Dial Fields, but `getaddrinfo` does the opposite. The new behavior only applies to NetworkExtension, not to all scenarios (primarily command-line binaries) as it did previously.

In addition, this commit also improves the DHCP DNS server to use the same robust query logic as `local`.
2025-08-19 21:56:56 +08:00
世界
ea9f344763
Fix legacy DNS config 2025-08-19 21:56:56 +08:00
世界
6adc6a5a1d
Fix rule-set format 2025-08-19 21:56:56 +08:00
世界
ec2695aff6
documentation: Remove outdated icons 2025-08-19 21:56:56 +08:00
世界
5f2ec82448
documentation: Improve local DNS server 2025-08-19 21:56:56 +08:00
世界
c84e5d7784
Use libresolv in local DNS server on darwin 2025-08-19 21:56:55 +08:00
世界
169d496b37
Use resolved in local DNS server if available 2025-08-19 21:56:55 +08:00
xchacha20-poly1305
6c468eee6d
Fix rule set version 2025-08-19 21:56:55 +08:00
世界
a031cf2160
documentation: Add preferred_by route rule item 2025-08-19 21:56:54 +08:00
世界
1c39344e00
Add preferred_by route rule item 2025-08-19 21:56:54 +08:00
世界
8e86ada5eb
documentation: Add interface address rule items 2025-08-19 21:56:54 +08:00
世界
fa8141f0d0
Add interface address rule items 2025-08-19 21:56:54 +08:00
neletor
6054fd8ab4
Add support for ech retry configs 2025-08-19 21:56:54 +08:00
Zephyruso
da3cabb548
Add /dns/flush-clash meta api 2025-08-19 21:56:54 +08:00
世界
57e945300c
Bump version 2025-08-19 21:56:05 +08:00
7 changed files with 15 additions and 37 deletions

View File

@ -128,10 +128,6 @@ func (c *ReadWaitConn) Upstream() any {
return c.Conn
}
func (c *ReadWaitConn) ReaderReplaceable() bool {
return true
}
var tlsRegistry []func(conn net.Conn) (loaded bool, tlsReadRecord func() error, tlsHandlePostHandshakeMessage func() error)
func init() {

View File

@ -6,26 +6,22 @@ import (
"net"
_ "unsafe"
"github.com/sagernet/sing/common"
"github.com/metacubex/utls"
)
func init() {
tlsRegistry = append(tlsRegistry, func(conn net.Conn) (loaded bool, tlsReadRecord func() error, tlsHandlePostHandshakeMessage func() error) {
switch tlsConn := conn.(type) {
case *tls.UConn:
return true, func() error {
return utlsReadRecord(tlsConn.Conn)
}, func() error {
return utlsHandlePostHandshakeMessage(tlsConn.Conn)
}
case *tls.Conn:
return true, func() error {
return utlsReadRecord(tlsConn)
}, func() error {
return utlsHandlePostHandshakeMessage(tlsConn)
}
tlsConn, loaded := common.Cast[*tls.UConn](conn)
if !loaded {
return
}
return
return true, func() error {
return utlsReadRecord(tlsConn.Conn)
}, func() error {
return utlsHandlePostHandshakeMessage(tlsConn.Conn)
}
})
}

View File

@ -109,9 +109,6 @@ func (c *Conn) Write(b []byte) (n int, err error) {
if err != nil {
return
}
if i != len(splitIndexes) {
time.Sleep(c.fallbackDelay)
}
}
}
}

View File

@ -9,10 +9,6 @@ import (
)
func writeAndWaitAck(ctx context.Context, conn *net.TCPConn, payload []byte, fallbackDelay time.Duration) error {
_, err := conn.Write(payload)
if err != nil {
return err
}
time.Sleep(fallbackDelay)
return nil
}

View File

@ -16,9 +16,6 @@ func writeAndWaitAck(ctx context.Context, conn *net.TCPConn, payload []byte, fal
err := winiphlpapi.WriteAndWaitAck(ctx, conn, payload)
if err != nil {
if errors.Is(err, windows.ERROR_ACCESS_DENIED) {
if _, err := conn.Write(payload); err != nil {
return err
}
time.Sleep(fallbackDelay)
return nil
}

View File

@ -76,8 +76,6 @@ func NewRawTransport(transportAdapter dns.TransportAdapter, ctx context.Context,
dialer: dialer,
logger: logger,
networkManager: service.FromContext[adapter.NetworkManager](ctx),
ndots: 1,
attempts: 2,
}
}
@ -85,15 +83,13 @@ func (t *Transport) Start(stage adapter.StartStage) error {
if stage != adapter.StartStateStart {
return nil
}
_, err := t.Fetch()
if err != nil {
t.logger.Error(E.Cause(err, "fetch DNS servers"))
}
if t.interfaceName == "" {
t.interfaceCallback = t.networkManager.InterfaceMonitor().RegisterCallback(t.interfaceUpdated)
}
go func() {
_, err := t.Fetch()
if err != nil {
t.logger.Error(E.Cause(err, "fetch DNS servers"))
}
}()
return nil
}

View File

@ -85,7 +85,7 @@ func (t *Transport) tryOneName(ctx context.Context, servers []M.Socksaddr, fqdn
var lastErr error
for i := 0; i < t.attempts; i++ {
for j := 0; j < sLen; j++ {
server := servers[j]
server := servers[j%sLen]
question := message.Question[0]
question.Name = fqdn
response, err := t.exchangeOne(ctx, server, question, C.DNSTimeout, false, true)