Skip to content

Commit

Permalink
fix: process IPv6 Link-Local address (#1657)
Browse files Browse the repository at this point in the history
  • Loading branch information
wwqgtxx committed Nov 18, 2024
1 parent 25b3c86 commit 80e4eaa
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 26 deletions.
9 changes: 1 addition & 8 deletions adapter/inbound/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,5 @@ func SkipAuthRemoteAddress(addr string) bool {
}

func skipAuth(addr netip.Addr) bool {
if addr.IsValid() {
for _, prefix := range skipAuthPrefixes {
if prefix.Contains(addr.Unmap()) {
return true
}
}
}
return false
return prefixesContains(skipAuthPrefixes, addr)
}
24 changes: 7 additions & 17 deletions adapter/inbound/ipfilter.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,27 +31,17 @@ func IsRemoteAddrDisAllowed(addr net.Addr) bool {
if err := m.SetRemoteAddr(addr); err != nil {
return false
}
return isAllowed(m.AddrPort().Addr().Unmap()) && !isDisAllowed(m.AddrPort().Addr().Unmap())
ipAddr := m.AddrPort().Addr()
if ipAddr.IsValid() {
return isAllowed(ipAddr) && !isDisAllowed(ipAddr)
}
return false
}

func isAllowed(addr netip.Addr) bool {
if addr.IsValid() {
for _, prefix := range lanAllowedIPs {
if prefix.Contains(addr) {
return true
}
}
}
return false
return prefixesContains(lanAllowedIPs, addr)
}

func isDisAllowed(addr netip.Addr) bool {
if addr.IsValid() {
for _, prefix := range lanDisAllowedIPs {
if prefix.Contains(addr) {
return true
}
}
}
return false
return prefixesContains(lanDisAllowedIPs, addr)
}
16 changes: 16 additions & 0 deletions adapter/inbound/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,19 @@ func parseHTTPAddr(request *http.Request) *C.Metadata {

return metadata
}

func prefixesContains(prefixes []netip.Prefix, addr netip.Addr) bool {
if len(prefixes) == 0 {
return false
}
if !addr.IsValid() {
return false
}
addr = addr.Unmap().WithZone("") // netip.Prefix.Contains returns false if ip has an IPv6 zone
for _, prefix := range prefixes {
if prefix.Contains(addr) {
return true
}
}
return false
}
2 changes: 1 addition & 1 deletion rules/common/ipcidr.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func (i *IPCIDR) Match(metadata *C.Metadata) (bool, string) {
if i.isSourceIP {
ip = metadata.SrcIP
}
return ip.IsValid() && i.ipnet.Contains(ip), i.adapter
return ip.IsValid() && i.ipnet.Contains(ip.WithZone("")), i.adapter
}

func (i *IPCIDR) Adapter() string {
Expand Down

0 comments on commit 80e4eaa

Please sign in to comment.