From 92ed8f5e6a66d7a83fb10f627f79ca10e2414266 Mon Sep 17 00:00:00 2001 From: Haruue Date: Tue, 19 Mar 2024 19:38:43 +0800 Subject: [PATCH] chore(tun): enable ForwarderBindInterface --- app/internal/tun/server.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app/internal/tun/server.go b/app/internal/tun/server.go index f1816e1..5953647 100644 --- a/app/internal/tun/server.go +++ b/app/internal/tun/server.go @@ -7,6 +7,8 @@ import ( "net" "net/netip" + "github.com/sagernet/sing/common/control" + "github.com/apernet/hysteria/core/client" tun "github.com/apernet/sing-tun" "github.com/sagernet/sing/common/buf" @@ -66,6 +68,8 @@ func (s *Server) Serve() error { tag: "tun-stack", zapLogger: s.Logger, }, + ForwarderBindInterface: true, + InterfaceFinder: &interfaceFinder{}, }) if err != nil { return fmt.Errorf("failed to create tun stack: %w", err) @@ -190,3 +194,23 @@ func (t *tunHandler) NewPacketConnection(ctx context.Context, conn network.Packe func (t *tunHandler) NewError(ctx context.Context, err error) { // unused } + +type interfaceFinder struct{} + +var _ control.InterfaceFinder = (*interfaceFinder)(nil) + +func (f *interfaceFinder) InterfaceIndexByName(name string) (int, error) { + ifce, err := net.InterfaceByName(name) + if err != nil { + return -1, err + } + return ifce.Index, nil +} + +func (f *interfaceFinder) InterfaceNameByIndex(index int) (string, error) { + ifce, err := net.InterfaceByIndex(index) + if err != nil { + return "", err + } + return ifce.Name, nil +}