when gather v6 bind addrs should only rely on v6 range (#707)

This commit is contained in:
Sijie.Sun
2025-03-21 22:40:26 +08:00
committed by GitHub
parent 3ad754879f
commit e130c3f2e4
2 changed files with 25 additions and 9 deletions
+20 -5
View File
@@ -220,7 +220,7 @@ impl IPCollector {
return self.cached_ip_list.read().await.deref().clone(); return self.cached_ip_list.read().await.deref().clone();
} }
pub async fn collect_interfaces(net_ns: NetNS) -> Vec<NetworkInterface> { pub async fn collect_interfaces(net_ns: NetNS, filter: bool) -> Vec<NetworkInterface> {
let _g = net_ns.guard(); let _g = net_ns.guard();
let ifaces = pnet::datalink::interfaces(); let ifaces = pnet::datalink::interfaces();
let mut ret = vec![]; let mut ret = vec![];
@@ -229,7 +229,7 @@ impl IPCollector {
iface: iface.clone(), iface: iface.clone(),
}; };
if !f.filter_iface().await { if filter && !f.filter_iface().await {
continue; continue;
} }
@@ -243,21 +243,36 @@ impl IPCollector {
async fn do_collect_local_ip_addrs(net_ns: NetNS) -> GetIpListResponse { async fn do_collect_local_ip_addrs(net_ns: NetNS) -> GetIpListResponse {
let mut ret = GetIpListResponse::default(); 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(); let _g = net_ns.guard();
for iface in ifaces { for iface in ifaces {
for ip in iface.ips { for ip in iface.ips {
let ip: std::net::IpAddr = ip.ip(); let ip: std::net::IpAddr = ip.ip();
match ip {
std::net::IpAddr::V4(v4) => {
if ip.is_loopback() || ip.is_multicast() { if ip.is_loopback() || ip.is_multicast() {
continue; continue;
} }
match ip {
std::net::IpAddr::V4(v4) => {
ret.interface_ipv4s.push(v4.into()); 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) => { std::net::IpAddr::V6(v6) => {
if v6.is_multicast() || v6.is_loopback() || v6.is_unicast_link_local() {
continue;
}
ret.interface_ipv6s.push(v6.into()); ret.interface_ipv6s.push(v6.into());
} }
_ => {}
} }
} }
} }
+4 -3
View File
@@ -43,8 +43,8 @@ async fn set_bind_addr_for_peer_connector(
connector.set_bind_addrs(bind_addrs); connector.set_bind_addrs(bind_addrs);
} else { } else {
let mut bind_addrs = vec![]; let mut bind_addrs = vec![];
for ipv6 in ips.interface_ipv6s { for ipv6 in ips.interface_ipv6s.iter().chain(ips.public_ipv6.iter()) {
let socket_addr = SocketAddrV6::new(ipv6.into(), 0, 0, 0).into(); let socket_addr = SocketAddrV6::new(std::net::Ipv6Addr::from(*ipv6), 0, 0, 0).into();
bind_addrs.push(socket_addr); bind_addrs.push(socket_addr);
} }
connector.set_bind_addrs(bind_addrs); connector.set_bind_addrs(bind_addrs);
@@ -96,7 +96,8 @@ pub async fn create_connector_by_url(
} }
#[cfg(feature = "quic")] #[cfg(feature = "quic")]
"quic" => { "quic" => {
let dst_addr = check_scheme_and_get_socket_addr::<SocketAddr>(&url, "quic", ip_version)?; let dst_addr =
check_scheme_and_get_socket_addr::<SocketAddr>(&url, "quic", ip_version)?;
let mut connector = QUICTunnelConnector::new(url); let mut connector = QUICTunnelConnector::new(url);
if global_ctx.config.get_flags().bind_device { if global_ctx.config.get_flags().bind_device {
set_bind_addr_for_peer_connector( set_bind_addr_for_peer_connector(