|
|
|
@ -4,16 +4,18 @@ package wireguard
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"context" |
|
|
|
|
"errors" |
|
|
|
|
goerrors "errors" |
|
|
|
|
"fmt" |
|
|
|
|
"net" |
|
|
|
|
"net/netip" |
|
|
|
|
"os" |
|
|
|
|
"sync" |
|
|
|
|
|
|
|
|
|
"golang.org/x/sys/unix" |
|
|
|
|
|
|
|
|
|
"github.com/sagernet/sing/common/control" |
|
|
|
|
"github.com/vishvananda/netlink" |
|
|
|
|
"github.com/xtls/xray-core/common/errors" |
|
|
|
|
wgtun "golang.zx2c4.com/wireguard/tun" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
@ -27,6 +29,23 @@ type deviceNet struct {
|
|
|
|
|
rules []*netlink.Rule |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
tableIndex int = 10230 |
|
|
|
|
mu sync.Mutex |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func allocateIPv6TableIndex() int { |
|
|
|
|
mu.Lock() |
|
|
|
|
defer mu.Unlock() |
|
|
|
|
|
|
|
|
|
if tableIndex > 10230 { |
|
|
|
|
errors.LogInfo(context.Background(), "allocate new ipv6 table index: ", tableIndex) |
|
|
|
|
} |
|
|
|
|
currentIndex := tableIndex |
|
|
|
|
tableIndex++ |
|
|
|
|
return currentIndex |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func newDeviceNet(interfaceName string) *deviceNet { |
|
|
|
|
var dialer net.Dialer |
|
|
|
|
bindControl := control.BindToInterface(control.NewDefaultInterfaceFinder(), interfaceName, -1) |
|
|
|
@ -68,7 +87,7 @@ func (d *deviceNet) Close() (err error) {
|
|
|
|
|
if len(errs) == 0 { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
return errors.Join(errs...) |
|
|
|
|
return goerrors.Join(errs...) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func createKernelTun(localAddresses []netip.Addr, mtu int, handler promiscuousModeHandler) (t Tunnel, err error) { |
|
|
|
@ -138,7 +157,7 @@ func createKernelTun(localAddresses []netip.Addr, mtu int, handler promiscuousMo
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ipv6TableIndex := 1023 |
|
|
|
|
ipv6TableIndex := allocateIPv6TableIndex() |
|
|
|
|
if v6 != nil { |
|
|
|
|
r := &netlink.Route{Table: ipv6TableIndex} |
|
|
|
|
for { |
|
|
|
|