Forráskód Böngészése

WireGuard kernelTun: Fix multi-outbounds not work (#4015)

Fixes https://github.com/XTLS/Xray-core/issues/2817
风扇滑翔翼 1 éve
szülő
commit
17825b25f2
1 módosított fájl, 22 hozzáadás és 3 törlés
  1. 22 3
      proxy/wireguard/tun_linux.go

+ 22 - 3
proxy/wireguard/tun_linux.go

@@ -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 {