From 85c99b9b32e5c876b0c76d8c8e65059a94487217 Mon Sep 17 00:00:00 2001 From: zonyitoo Date: Tue, 20 Dec 2022 14:57:07 +0800 Subject: [PATCH] ACL IP rules compatible with IPv4-mapped-IPv6 fix #1060 --- crates/shadowsocks-service/src/acl/mod.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/crates/shadowsocks-service/src/acl/mod.rs b/crates/shadowsocks-service/src/acl/mod.rs index c06a5aee..9ca465bb 100644 --- a/crates/shadowsocks-service/src/acl/mod.rs +++ b/crates/shadowsocks-service/src/acl/mod.rs @@ -117,8 +117,25 @@ impl Rules { /// Check if the specified address matches any rules fn check_ip_matched(&self, addr: &IpAddr) -> bool { match addr { - IpAddr::V4(v4) => self.ipv4.contains(v4), - IpAddr::V6(v6) => self.ipv6.contains(v6), + IpAddr::V4(v4) => { + if self.ipv4.contains(v4) { + return true; + } + + let mapped_ipv6 = v4.to_ipv6_mapped(); + self.ipv6.contains(&mapped_ipv6) + } + IpAddr::V6(v6) => { + if self.ipv6.contains(v6) { + return true; + } + + if let Some(mapped_ipv4) = v6.to_ipv4_mapped() { + return self.ipv4.contains(&mapped_ipv4); + } + + false + } } }