mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-11-24 01:21:29 +00:00
WireGuard kernelTun: Fix multi-outbounds not work (#4015)
Fixes https://github.com/XTLS/Xray-core/issues/2817
This commit is contained in:
parent
83ae38497b
commit
17825b25f2
|
@ -4,16 +4,18 @@ package wireguard
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
goerrors "errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"os"
|
"os"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
|
||||||
"github.com/sagernet/sing/common/control"
|
"github.com/sagernet/sing/common/control"
|
||||||
"github.com/vishvananda/netlink"
|
"github.com/vishvananda/netlink"
|
||||||
|
"github.com/xtls/xray-core/common/errors"
|
||||||
wgtun "golang.zx2c4.com/wireguard/tun"
|
wgtun "golang.zx2c4.com/wireguard/tun"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -27,6 +29,23 @@ type deviceNet struct {
|
||||||
rules []*netlink.Rule
|
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 {
|
func newDeviceNet(interfaceName string) *deviceNet {
|
||||||
var dialer net.Dialer
|
var dialer net.Dialer
|
||||||
bindControl := control.BindToInterface(control.NewDefaultInterfaceFinder(), interfaceName, -1)
|
bindControl := control.BindToInterface(control.NewDefaultInterfaceFinder(), interfaceName, -1)
|
||||||
|
@ -68,7 +87,7 @@ func (d *deviceNet) Close() (err error) {
|
||||||
if len(errs) == 0 {
|
if len(errs) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errors.Join(errs...)
|
return goerrors.Join(errs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createKernelTun(localAddresses []netip.Addr, mtu int, handler promiscuousModeHandler) (t Tunnel, err error) {
|
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 {
|
if v6 != nil {
|
||||||
r := &netlink.Route{Table: ipv6TableIndex}
|
r := &netlink.Route{Table: ipv6TableIndex}
|
||||||
for {
|
for {
|
||||||
|
|
Loading…
Reference in a new issue