mirror of
https://github.com/SagerNet/sing-box.git
synced 2024-11-22 08:31:30 +00:00
Minor fixes
This commit is contained in:
parent
fe5618c35d
commit
afc2f509a4
|
@ -1,23 +0,0 @@
|
||||||
package dialer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
|
||||||
"github.com/sagernet/sing/common/control"
|
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
|
||||||
)
|
|
||||||
|
|
||||||
func BindToInterface(router adapter.Router) control.Func {
|
|
||||||
return func(network, address string, conn syscall.RawConn) error {
|
|
||||||
interfaceName := router.AutoDetectInterfaceName()
|
|
||||||
if interfaceName == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var innerErr error
|
|
||||||
err := conn.Control(func(fd uintptr) {
|
|
||||||
innerErr = syscall.BindToDevice(int(fd), interfaceName)
|
|
||||||
})
|
|
||||||
return E.Errors(innerErr, err)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
//go:build !linux && !windows
|
|
||||||
|
|
||||||
package dialer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
|
||||||
"github.com/sagernet/sing/common/control"
|
|
||||||
)
|
|
||||||
|
|
||||||
func BindToInterface(router adapter.Router) control.Func {
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
package dialer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/binary"
|
|
||||||
"net"
|
|
||||||
"net/netip"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
|
||||||
"github.com/sagernet/sing/common/control"
|
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
|
||||||
|
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
IP_UNICAST_IF = 31
|
|
||||||
IPV6_UNICAST_IF = 31
|
|
||||||
)
|
|
||||||
|
|
||||||
func bind4(handle windows.Handle, ifaceIdx int) error {
|
|
||||||
var bytes [4]byte
|
|
||||||
binary.BigEndian.PutUint32(bytes[:], uint32(ifaceIdx))
|
|
||||||
idx := *(*uint32)(unsafe.Pointer(&bytes[0]))
|
|
||||||
return windows.SetsockoptInt(handle, windows.IPPROTO_IP, IP_UNICAST_IF, int(idx))
|
|
||||||
}
|
|
||||||
|
|
||||||
func bind6(handle windows.Handle, ifaceIdx int) error {
|
|
||||||
return windows.SetsockoptInt(handle, windows.IPPROTO_IPV6, IPV6_UNICAST_IF, int(ifaceIdx))
|
|
||||||
}
|
|
||||||
|
|
||||||
func BindToInterface(router adapter.Router) control.Func {
|
|
||||||
return func(network, address string, conn syscall.RawConn) error {
|
|
||||||
interfaceName := router.AutoDetectInterfaceName()
|
|
||||||
if interfaceName == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
ipStr, _, err := net.SplitHostPort(address)
|
|
||||||
if err == nil {
|
|
||||||
if ip, err := netip.ParseAddr(ipStr); err == nil && !ip.IsGlobalUnicast() {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var innerErr error
|
|
||||||
err = conn.Control(func(fd uintptr) {
|
|
||||||
handle := windows.Handle(fd)
|
|
||||||
// handle ip empty, e.g. net.Listen("udp", ":0")
|
|
||||||
if ipStr == "" {
|
|
||||||
innerErr = bind4(handle, router.AutoDetectInterfaceIndex())
|
|
||||||
if innerErr != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// try bind ipv6, if failed, ignore. it's a workaround for windows disable interface ipv6
|
|
||||||
bind6(handle, router.AutoDetectInterfaceIndex())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch network {
|
|
||||||
case "tcp4", "udp4", "ip4":
|
|
||||||
innerErr = bind4(handle, router.AutoDetectInterfaceIndex())
|
|
||||||
case "tcp6", "udp6":
|
|
||||||
innerErr = bind6(handle, router.AutoDetectInterfaceIndex())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return E.Errors(innerErr, err)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSniffSTUN(t *testing.T) {
|
func TestSniffSTUN(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
packet, err := hex.DecodeString("000100002112a44224b1a025d0c180c484341306")
|
packet, err := hex.DecodeString("000100002112a44224b1a025d0c180c484341306")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
metadata, err := sniff.STUNMessage(context.Background(), packet)
|
metadata, err := sniff.STUNMessage(context.Background(), packet)
|
||||||
|
|
|
@ -8,13 +8,11 @@
|
||||||
{
|
{
|
||||||
"type": "redirect",
|
"type": "redirect",
|
||||||
"tag": "redirect-in",
|
"tag": "redirect-in",
|
||||||
|
|
||||||
"listen": "::",
|
"listen": "::",
|
||||||
"listen_port": 5353,
|
"listen_port": 5353,
|
||||||
"sniff": false,
|
"sniff": false,
|
||||||
"sniff_override_destination": false,
|
"sniff_override_destination": false,
|
||||||
"domain_strategy": "prefer_ipv6",
|
"domain_strategy": "prefer_ipv6"
|
||||||
"udp_timeout": 300
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -54,8 +52,4 @@ One of `prefer_ipv4` `prefer_ipv6` `ipv4_only` `ipv6_only`.
|
||||||
|
|
||||||
If set, the requested domain name will be resolved to IP before routing.
|
If set, the requested domain name will be resolved to IP before routing.
|
||||||
|
|
||||||
If `sniff_override_destination` is in effect, its value will be taken as a fallback.
|
If `sniff_override_destination` is in effect, its value will be taken as a fallback.
|
||||||
|
|
||||||
#### udp_timeout
|
|
||||||
|
|
||||||
UDP NAT expiration time in seconds, default is 300 (5 minutes).
|
|
Loading…
Reference in a new issue