From e130c3f2e49d146bebbdc77f8c772b7186b15a84 Mon Sep 17 00:00:00 2001 From: "Sijie.Sun" Date: Fri, 21 Mar 2025 22:40:26 +0800 Subject: [PATCH] when gather v6 bind addrs should only rely on v6 range (#707) --- easytier/src/common/network.rs | 27 +++++++++++++++++++++------ easytier/src/connector/mod.rs | 7 ++++--- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/easytier/src/common/network.rs b/easytier/src/common/network.rs index 5a0dbd8..948a98f 100644 --- a/easytier/src/common/network.rs +++ b/easytier/src/common/network.rs @@ -220,7 +220,7 @@ impl IPCollector { return self.cached_ip_list.read().await.deref().clone(); } - pub async fn collect_interfaces(net_ns: NetNS) -> Vec { + pub async fn collect_interfaces(net_ns: NetNS, filter: bool) -> Vec { let _g = net_ns.guard(); let ifaces = pnet::datalink::interfaces(); let mut ret = vec![]; @@ -229,7 +229,7 @@ impl IPCollector { iface: iface.clone(), }; - if !f.filter_iface().await { + if filter && !f.filter_iface().await { continue; } @@ -243,21 +243,36 @@ impl IPCollector { async fn do_collect_local_ip_addrs(net_ns: NetNS) -> GetIpListResponse { let mut ret = GetIpListResponse::default(); - let ifaces = Self::collect_interfaces(net_ns.clone()).await; + let ifaces = Self::collect_interfaces(net_ns.clone(), true).await; let _g = net_ns.guard(); for iface in ifaces { for ip in iface.ips { let ip: std::net::IpAddr = ip.ip(); - if ip.is_loopback() || ip.is_multicast() { - continue; - } match ip { std::net::IpAddr::V4(v4) => { + if ip.is_loopback() || ip.is_multicast() { + continue; + } ret.interface_ipv4s.push(v4.into()); } + _ => {} + } + } + } + + let ifaces = Self::collect_interfaces(net_ns.clone(), false).await; + let _g = net_ns.guard(); + for iface in ifaces { + for ip in iface.ips { + let ip: std::net::IpAddr = ip.ip(); + match ip { std::net::IpAddr::V6(v6) => { + if v6.is_multicast() || v6.is_loopback() || v6.is_unicast_link_local() { + continue; + } ret.interface_ipv6s.push(v6.into()); } + _ => {} } } } diff --git a/easytier/src/connector/mod.rs b/easytier/src/connector/mod.rs index a1c35be..dda3186 100644 --- a/easytier/src/connector/mod.rs +++ b/easytier/src/connector/mod.rs @@ -43,8 +43,8 @@ async fn set_bind_addr_for_peer_connector( connector.set_bind_addrs(bind_addrs); } else { let mut bind_addrs = vec![]; - for ipv6 in ips.interface_ipv6s { - let socket_addr = SocketAddrV6::new(ipv6.into(), 0, 0, 0).into(); + for ipv6 in ips.interface_ipv6s.iter().chain(ips.public_ipv6.iter()) { + let socket_addr = SocketAddrV6::new(std::net::Ipv6Addr::from(*ipv6), 0, 0, 0).into(); bind_addrs.push(socket_addr); } connector.set_bind_addrs(bind_addrs); @@ -96,7 +96,8 @@ pub async fn create_connector_by_url( } #[cfg(feature = "quic")] "quic" => { - let dst_addr = check_scheme_and_get_socket_addr::(&url, "quic", ip_version)?; + let dst_addr = + check_scheme_and_get_socket_addr::(&url, "quic", ip_version)?; let mut connector = QUICTunnelConnector::new(url); if global_ctx.config.get_flags().bind_device { set_bind_addr_for_peer_connector(