From fdaa6a22a4d14ccb08a5173128e1c47585678627 Mon Sep 17 00:00:00 2001 From: Mars160 <74127225+Mars160@users.noreply.github.com> Date: Sun, 4 Jun 2023 23:43:54 +0800 Subject: [PATCH] fix hysteria faketcp lookback in TUN mode (#601) --- component/dialer/bind.go | 2 +- component/iface/iface.go | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/component/dialer/bind.go b/component/dialer/bind.go index 34d40ca2..edfc79c7 100644 --- a/component/dialer/bind.go +++ b/component/dialer/bind.go @@ -22,7 +22,7 @@ func LookupLocalAddrFromIfaceName(ifaceName string, network string, destination addr, err = ifaceObj.PickIPv6Addr(destination) default: if destination.IsValid() { - if destination.Is4() { + if destination.Is4() || destination.Is4In6() { addr, err = ifaceObj.PickIPv4Addr(destination) } else { addr, err = ifaceObj.PickIPv6Addr(destination) diff --git a/component/iface/iface.go b/component/iface/iface.go index 11c754f8..c32b65ab 100644 --- a/component/iface/iface.go +++ b/component/iface/iface.go @@ -4,6 +4,7 @@ import ( "errors" "net" "net/netip" + "strings" "time" "github.com/Dreamacro/clash/common/singledo" @@ -37,12 +38,21 @@ func ResolveInterface(name string) (*Interface, error) { if err != nil { continue } + // if not available device like Meta, dummy0, docker0, etc. + if (iface.Flags&net.FlagMulticast == 0) || (iface.Flags&net.FlagPointToPoint != 0) || (iface.Flags&net.FlagRunning == 0) { + continue + } ipNets := make([]*netip.Prefix, 0, len(addrs)) for _, addr := range addrs { ipNet := addr.(*net.IPNet) ip, _ := netip.AddrFromSlice(ipNet.IP) + //unavailable IPv6 Address + if ip.Is6() && strings.HasPrefix(ip.String(), "fe80") { + continue + } + ones, bits := ipNet.Mask.Size() if bits == 32 { ip = ip.Unmap()