mirror of
https://github.com/EasyTier/EasyTier.git
synced 2025-09-27 04:56:07 +08:00
optimize the condition of enabling kcp (#1210)
This commit is contained in:
@@ -44,5 +44,7 @@
|
|||||||
"prettier.enable": false,
|
"prettier.enable": false,
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.formatOnSaveMode": "modifications",
|
"editor.formatOnSaveMode": "modifications",
|
||||||
|
"editor.formatOnPaste": false,
|
||||||
|
"editor.formatOnType": true,
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -190,6 +190,18 @@ core_clap:
|
|||||||
foreign_relay_bps_limit:
|
foreign_relay_bps_limit:
|
||||||
en: "the maximum bps limit for foreign network relay, default is no limit. unit: BPS (bytes per second)"
|
en: "the maximum bps limit for foreign network relay, default is no limit. unit: BPS (bytes per second)"
|
||||||
zh-CN: "作为共享节点时,限制非本地网络的流量转发速率,默认无限制,单位 BPS (字节每秒)"
|
zh-CN: "作为共享节点时,限制非本地网络的流量转发速率,默认无限制,单位 BPS (字节每秒)"
|
||||||
|
tcp_whitelist:
|
||||||
|
en: "tcp port whitelist. Supports single ports (80) and ranges (8000-9000)"
|
||||||
|
zh-CN: "TCP 端口白名单。支持单个端口(80)和范围(8000-9000)"
|
||||||
|
udp_whitelist:
|
||||||
|
en: "udp port whitelist. Supports single ports (53) and ranges (5000-6000)"
|
||||||
|
zh-CN: "UDP 端口白名单。支持单个端口(53)和范围(5000-6000)"
|
||||||
|
disable_relay_kcp:
|
||||||
|
en: "if true, disable relay kcp packets. avoid consuming too many bandwidth. default is false"
|
||||||
|
zh-CN: "如果为true,则禁止节点转发 KCP 数据包,防止过度消耗流量。默认值为false"
|
||||||
|
enable_relay_foreign_network_kcp:
|
||||||
|
en: "if true, allow relay kcp packets from foreign network. default is false (not forward foreign network kcp packets)"
|
||||||
|
zh-CN: "如果为true,则作为共享节点时也可以转发其他网络的 KCP 数据包。默认值为false(不转发)"
|
||||||
|
|
||||||
core_app:
|
core_app:
|
||||||
panic_backtrace_save:
|
panic_backtrace_save:
|
||||||
|
@@ -40,7 +40,8 @@ pub fn gen_default_flags() -> Flags {
|
|||||||
bind_device: true,
|
bind_device: true,
|
||||||
enable_kcp_proxy: false,
|
enable_kcp_proxy: false,
|
||||||
disable_kcp_input: false,
|
disable_kcp_input: false,
|
||||||
disable_relay_kcp: true,
|
disable_relay_kcp: false,
|
||||||
|
enable_relay_foreign_network_kcp: false,
|
||||||
accept_dns: false,
|
accept_dns: false,
|
||||||
private_mode: false,
|
private_mode: false,
|
||||||
enable_quic_proxy: false,
|
enable_quic_proxy: false,
|
||||||
|
@@ -515,7 +515,7 @@ struct NetworkOptions {
|
|||||||
#[arg(
|
#[arg(
|
||||||
long,
|
long,
|
||||||
value_delimiter = ',',
|
value_delimiter = ',',
|
||||||
help = "TCP port whitelist. Supports single ports (80) and ranges (8000-9000)",
|
help = t!("core_clap.tcp_whitelist").to_string(),
|
||||||
num_args = 0..
|
num_args = 0..
|
||||||
)]
|
)]
|
||||||
tcp_whitelist: Vec<String>,
|
tcp_whitelist: Vec<String>,
|
||||||
@@ -523,10 +523,28 @@ struct NetworkOptions {
|
|||||||
#[arg(
|
#[arg(
|
||||||
long,
|
long,
|
||||||
value_delimiter = ',',
|
value_delimiter = ',',
|
||||||
help = "UDP port whitelist. Supports single ports (53) and ranges (5000-6000)",
|
help = t!("core_clap.udp_whitelist").to_string(),
|
||||||
num_args = 0..
|
num_args = 0..
|
||||||
)]
|
)]
|
||||||
udp_whitelist: Vec<String>,
|
udp_whitelist: Vec<String>,
|
||||||
|
|
||||||
|
#[arg(
|
||||||
|
long,
|
||||||
|
env = "ET_DISABLE_RELAY_KCP",
|
||||||
|
help = t!("core_clap.disable_relay_kcp").to_string(),
|
||||||
|
num_args = 0..=1,
|
||||||
|
default_missing_value = "true"
|
||||||
|
)]
|
||||||
|
disable_relay_kcp: Option<bool>,
|
||||||
|
|
||||||
|
#[arg(
|
||||||
|
long,
|
||||||
|
env = "ET_ENABLE_RELAY_FOREIGN_NETWORK_KCP",
|
||||||
|
help = t!("core_clap.enable_relay_foreign_network_kcp").to_string(),
|
||||||
|
num_args = 0..=1,
|
||||||
|
default_missing_value = "true"
|
||||||
|
)]
|
||||||
|
enable_relay_foreign_network_kcp: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
@@ -875,6 +893,8 @@ impl NetworkOptions {
|
|||||||
.foreign_relay_bps_limit
|
.foreign_relay_bps_limit
|
||||||
.unwrap_or(f.foreign_relay_bps_limit);
|
.unwrap_or(f.foreign_relay_bps_limit);
|
||||||
f.multi_thread_count = self.multi_thread_count.unwrap_or(f.multi_thread_count);
|
f.multi_thread_count = self.multi_thread_count.unwrap_or(f.multi_thread_count);
|
||||||
|
f.disable_relay_kcp = self.disable_relay_kcp.unwrap_or(f.disable_relay_kcp);
|
||||||
|
f.enable_relay_foreign_network_kcp = self.enable_relay_foreign_network_kcp.unwrap_or(f.enable_relay_foreign_network_kcp);
|
||||||
cfg.set_flags(f);
|
cfg.set_flags(f);
|
||||||
|
|
||||||
if !self.exit_nodes.is_empty() {
|
if !self.exit_nodes.is_empty() {
|
||||||
|
@@ -230,15 +230,7 @@ impl TcpProxyForKcpSrcTrait for TcpProxyForKcpSrc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn check_dst_allow_kcp_input(&self, dst_ip: &Ipv4Addr) -> bool {
|
async fn check_dst_allow_kcp_input(&self, dst_ip: &Ipv4Addr) -> bool {
|
||||||
let peer_map: Arc<crate::peers::peer_map::PeerMap> =
|
self.0.get_peer_manager().check_allow_kcp_to_dst(&IpAddr::V4(*dst_ip)).await
|
||||||
self.0.get_peer_manager().get_peer_map();
|
|
||||||
let Some(dst_peer_id) = peer_map.get_peer_id_by_ipv4(dst_ip).await else {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
let Some(peer_info) = peer_map.get_route_peer_info(dst_peer_id).await else {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
peer_info.feature_flag.map(|x| x.kcp_input).unwrap_or(false)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -751,8 +751,16 @@ impl Socks5Server {
|
|||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let Some(peer_mgr_arc) = peer_mgr.upgrade() else {
|
||||||
|
tracing::error!("peer manager is dropped");
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
let dst_allow_kcp = peer_mgr_arc.check_allow_kcp_to_dst(&dst_addr.ip()).await;
|
||||||
|
tracing::debug!("dst_allow_kcp: {:?}", dst_allow_kcp);
|
||||||
|
|
||||||
let connector: Box<dyn AsyncTcpConnector<S = SocksTcpStream> + Send> =
|
let connector: Box<dyn AsyncTcpConnector<S = SocksTcpStream> + Send> =
|
||||||
if kcp_endpoint.is_none() {
|
if kcp_endpoint.is_none() || !dst_allow_kcp {
|
||||||
Box::new(SmolTcpConnector {
|
Box::new(SmolTcpConnector {
|
||||||
net: net.smoltcp_net.clone(),
|
net: net.smoltcp_net.clone(),
|
||||||
entries: entries.clone(),
|
entries: entries.clone(),
|
||||||
|
@@ -163,6 +163,10 @@ impl ForeignNetworkEntry {
|
|||||||
config.set_network_identity(network.clone());
|
config.set_network_identity(network.clone());
|
||||||
config.set_hostname(Some(format!("PublicServer_{}", global_ctx.get_hostname())));
|
config.set_hostname(Some(format!("PublicServer_{}", global_ctx.get_hostname())));
|
||||||
|
|
||||||
|
let mut flags = config.get_flags();
|
||||||
|
flags.disable_relay_kcp = !global_ctx.get_flags().enable_relay_foreign_network_kcp;
|
||||||
|
config.set_flags(flags);
|
||||||
|
|
||||||
let foreign_global_ctx = Arc::new(GlobalCtx::new(config));
|
let foreign_global_ctx = Arc::new(GlobalCtx::new(config));
|
||||||
foreign_global_ctx
|
foreign_global_ctx
|
||||||
.replace_stun_info_collector(Box::new(global_ctx.get_stun_info_collector().clone()));
|
.replace_stun_info_collector(Box::new(global_ctx.get_stun_info_collector().clone()));
|
||||||
|
@@ -1360,6 +1360,38 @@ impl PeerManager {
|
|||||||
tracing::info!("close_peer_conn in foreign network manager done: {:?}", ret);
|
tracing::info!("close_peer_conn in foreign network manager done: {:?}", ret);
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn check_allow_kcp_to_dst(&self, dst_ip: &IpAddr) -> bool {
|
||||||
|
let route = self.get_route();
|
||||||
|
let Some(dst_peer_id) = route.get_peer_id_by_ip(dst_ip).await else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
let Some(peer_info) = route.get_peer_info(dst_peer_id).await else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
// check dst allow kcp input
|
||||||
|
if !peer_info.feature_flag.map(|x| x.kcp_input).unwrap_or(false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let next_hop_policy = Self::get_next_hop_policy( self.global_ctx.get_flags().latency_first);
|
||||||
|
// check relay node allow relay kcp.
|
||||||
|
let Some(next_hop_id) = route.get_next_hop_with_policy(dst_peer_id, next_hop_policy).await else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
let Some(next_hop_info) = route.get_peer_info(next_hop_id).await else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
// check next hop allow kcp relay
|
||||||
|
if next_hop_info.feature_flag.map(|x| x.no_relay_kcp).unwrap_or(false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@@ -86,6 +86,13 @@ pub trait Route {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_peer_id_by_ip(&self, ip: &std::net::IpAddr) -> Option<PeerId> {
|
||||||
|
match ip {
|
||||||
|
std::net::IpAddr::V4(v4) => self.get_peer_id_by_ipv4(v4).await,
|
||||||
|
std::net::IpAddr::V6(v6) => self.get_peer_id_by_ipv6(v6).await,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async fn list_peers_own_foreign_network(
|
async fn list_peers_own_foreign_network(
|
||||||
&self,
|
&self,
|
||||||
_network_identity: &NetworkIdentity,
|
_network_identity: &NetworkIdentity,
|
||||||
|
@@ -28,7 +28,7 @@ message FlagsInConfig {
|
|||||||
bool enable_kcp_proxy = 18;
|
bool enable_kcp_proxy = 18;
|
||||||
// does this peer allow kcp input
|
// does this peer allow kcp input
|
||||||
bool disable_kcp_input = 19;
|
bool disable_kcp_input = 19;
|
||||||
// allow relay kcp packets (for public server, this can reduce the throughput)
|
// disable relay local network kcp packets
|
||||||
bool disable_relay_kcp = 20;
|
bool disable_relay_kcp = 20;
|
||||||
bool proxy_forward_by_system = 21;
|
bool proxy_forward_by_system = 21;
|
||||||
|
|
||||||
@@ -46,6 +46,9 @@ message FlagsInConfig {
|
|||||||
uint64 foreign_relay_bps_limit = 26;
|
uint64 foreign_relay_bps_limit = 26;
|
||||||
|
|
||||||
uint32 multi_thread_count = 27;
|
uint32 multi_thread_count = 27;
|
||||||
|
|
||||||
|
// enable relay foreign network kcp packets
|
||||||
|
bool enable_relay_foreign_network_kcp = 28;
|
||||||
}
|
}
|
||||||
|
|
||||||
message RpcDescriptor {
|
message RpcDescriptor {
|
||||||
|
@@ -1150,6 +1150,8 @@ pub async fn port_forward_test(
|
|||||||
#[values(true, false)] no_tun: bool,
|
#[values(true, false)] no_tun: bool,
|
||||||
#[values(64, 1900)] buf_size: u64,
|
#[values(64, 1900)] buf_size: u64,
|
||||||
#[values(true, false)] enable_kcp: bool,
|
#[values(true, false)] enable_kcp: bool,
|
||||||
|
#[values(true, false)] dst_disable_kcp_input: bool,
|
||||||
|
#[values(true, false)] disable_relay_kcp: bool,
|
||||||
) {
|
) {
|
||||||
prepare_linux_namespaces();
|
prepare_linux_namespaces();
|
||||||
|
|
||||||
@@ -1183,14 +1185,23 @@ pub async fn port_forward_test(
|
|||||||
proto: "udp".to_string(),
|
proto: "udp".to_string(),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
} else if cfg.get_inst_name() == "inst3" {
|
|
||||||
cfg.add_proxy_cidr("10.1.2.0/24".parse().unwrap(), None)
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
let mut flags = cfg.get_flags();
|
let mut flags = cfg.get_flags();
|
||||||
flags.no_tun = no_tun;
|
flags.no_tun = no_tun;
|
||||||
flags.enable_kcp_proxy = enable_kcp;
|
flags.enable_kcp_proxy = enable_kcp;
|
||||||
cfg.set_flags(flags);
|
cfg.set_flags(flags);
|
||||||
|
} else if cfg.get_inst_name() == "inst3" {
|
||||||
|
cfg.add_proxy_cidr("10.1.2.0/24".parse().unwrap(), None)
|
||||||
|
.unwrap();
|
||||||
|
let mut flags = cfg.get_flags();
|
||||||
|
flags.disable_kcp_input = dst_disable_kcp_input;
|
||||||
|
cfg.set_flags(flags);
|
||||||
|
} else if cfg.get_inst_name() == "inst2" {
|
||||||
|
let mut flags = cfg.get_flags();
|
||||||
|
flags.disable_relay_kcp = disable_relay_kcp;
|
||||||
|
cfg.set_flags(flags);
|
||||||
|
}
|
||||||
|
|
||||||
cfg
|
cfg
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
|
Reference in New Issue
Block a user