Files
Easytier_lkddi/easytier/src/connector/mod.rs
T

113 lines
3.8 KiB
Rust
Raw Normal View History

2023-09-23 01:53:45 +00:00
use std::{
net::{SocketAddr, SocketAddrV4, SocketAddrV6},
sync::Arc,
};
2024-05-03 07:55:00 +08:00
#[cfg(feature = "quic")]
use crate::tunnel::quic::QUICTunnelConnector;
#[cfg(feature = "wireguard")]
use crate::tunnel::wireguard::{WgConfig, WgTunnelConnector};
2023-09-23 01:53:45 +00:00
use crate::{
2024-03-28 10:01:25 +08:00
common::{error::Error, global_ctx::ArcGlobalCtx, network::IPCollector},
2024-04-24 23:12:46 +08:00
tunnel::{
2024-05-03 07:55:00 +08:00
check_scheme_and_get_socket_addr, ring::RingTunnelConnector, tcp::TcpTunnelConnector,
udp::UdpTunnelConnector, TunnelConnector,
2023-09-23 01:53:45 +00:00
},
};
pub mod direct;
pub mod manual;
pub mod udp_hole_punch;
async fn set_bind_addr_for_peer_connector(
2024-04-24 23:12:46 +08:00
connector: &mut (impl TunnelConnector + ?Sized),
2023-09-23 01:53:45 +00:00
is_ipv4: bool,
ip_collector: &Arc<IPCollector>,
) {
let ips = ip_collector.collect_ip_addrs().await;
if is_ipv4 {
let mut bind_addrs = vec![];
for ipv4 in ips.interface_ipv4s {
let socket_addr = SocketAddrV4::new(ipv4.parse().unwrap(), 0).into();
bind_addrs.push(socket_addr);
}
connector.set_bind_addrs(bind_addrs);
} else {
let mut bind_addrs = vec![];
for ipv6 in ips.interface_ipv6s {
let socket_addr = SocketAddrV6::new(ipv6.parse().unwrap(), 0, 0, 0).into();
bind_addrs.push(socket_addr);
}
connector.set_bind_addrs(bind_addrs);
}
let _ = connector;
}
pub async fn create_connector_by_url(
url: &str,
2024-03-28 10:01:25 +08:00
global_ctx: &ArcGlobalCtx,
2024-04-24 23:12:46 +08:00
) -> Result<Box<dyn TunnelConnector + 'static>, Error> {
2023-09-23 01:53:45 +00:00
let url = url::Url::parse(url).map_err(|_| Error::InvalidUrl(url.to_owned()))?;
match url.scheme() {
"tcp" => {
let dst_addr = check_scheme_and_get_socket_addr::<SocketAddr>(&url, "tcp")?;
2023-09-23 01:53:45 +00:00
let mut connector = TcpTunnelConnector::new(url);
2024-03-28 10:01:25 +08:00
set_bind_addr_for_peer_connector(
&mut connector,
dst_addr.is_ipv4(),
&global_ctx.get_ip_collector(),
)
.await;
2023-09-23 01:53:45 +00:00
return Ok(Box::new(connector));
}
"udp" => {
let dst_addr = check_scheme_and_get_socket_addr::<SocketAddr>(&url, "udp")?;
2023-09-23 01:53:45 +00:00
let mut connector = UdpTunnelConnector::new(url);
2024-03-28 10:01:25 +08:00
set_bind_addr_for_peer_connector(
&mut connector,
dst_addr.is_ipv4(),
&global_ctx.get_ip_collector(),
)
.await;
2023-09-23 01:53:45 +00:00
return Ok(Box::new(connector));
}
"ring" => {
check_scheme_and_get_socket_addr::<uuid::Uuid>(&url, "ring")?;
2023-09-23 01:53:45 +00:00
let connector = RingTunnelConnector::new(url);
return Ok(Box::new(connector));
}
2024-05-03 07:55:00 +08:00
#[cfg(feature = "quic")]
2024-04-26 23:02:07 +08:00
"quic" => {
let dst_addr = check_scheme_and_get_socket_addr::<SocketAddr>(&url, "quic")?;
2024-04-26 23:02:07 +08:00
let mut connector = QUICTunnelConnector::new(url);
set_bind_addr_for_peer_connector(
&mut connector,
dst_addr.is_ipv4(),
&global_ctx.get_ip_collector(),
)
.await;
return Ok(Box::new(connector));
}
2024-05-03 07:55:00 +08:00
#[cfg(feature = "wireguard")]
2024-03-28 10:01:25 +08:00
"wg" => {
let dst_addr = check_scheme_and_get_socket_addr::<SocketAddr>(&url, "wg")?;
2024-03-28 10:01:25 +08:00
let nid = global_ctx.get_network_identity();
2024-04-27 13:44:59 +08:00
let wg_config = WgConfig::new_from_network_identity(
&nid.network_name,
&nid.network_secret.unwrap_or_default(),
);
2024-03-31 21:10:59 +08:00
let mut connector = WgTunnelConnector::new(url, wg_config);
set_bind_addr_for_peer_connector(
&mut connector,
dst_addr.is_ipv4(),
&global_ctx.get_ip_collector(),
)
.await;
2024-03-28 10:01:25 +08:00
return Ok(Box::new(connector));
}
2023-09-23 01:53:45 +00:00
_ => {
return Err(Error::InvalidUrl(url.into()));
}
}
}