mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-06 17:59:11 +00:00
bump version to v2.5.0 (#1715)
This commit is contained in:
@@ -11,7 +11,7 @@ on:
|
|||||||
image_tag:
|
image_tag:
|
||||||
description: 'Tag for this image build'
|
description: 'Tag for this image build'
|
||||||
type: string
|
type: string
|
||||||
default: 'v2.4.5'
|
default: 'v2.5.0'
|
||||||
required: true
|
required: true
|
||||||
mark_latest:
|
mark_latest:
|
||||||
description: 'Mark this image as latest'
|
description: 'Mark this image as latest'
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ on:
|
|||||||
version:
|
version:
|
||||||
description: 'Version for this release'
|
description: 'Version for this release'
|
||||||
type: string
|
type: string
|
||||||
default: 'v2.4.5'
|
default: 'v2.5.0'
|
||||||
required: true
|
required: true
|
||||||
make_latest:
|
make_latest:
|
||||||
description: 'Mark this release as latest'
|
description: 'Mark this release as latest'
|
||||||
|
|||||||
Generated
+3
-3
@@ -2078,7 +2078,7 @@ checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "easytier"
|
name = "easytier"
|
||||||
version = "2.4.5"
|
version = "2.5.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes-gcm",
|
"aes-gcm",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@@ -2234,7 +2234,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "easytier-gui"
|
name = "easytier-gui"
|
||||||
version = "2.4.5"
|
version = "2.5.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@@ -2323,7 +2323,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "easytier-web"
|
name = "easytier-web"
|
||||||
version = "2.4.5"
|
version = "2.5.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
|||||||
@@ -105,9 +105,9 @@ After successful execution, you can check the network status using `easytier-cli
|
|||||||
```text
|
```text
|
||||||
| ipv4 | hostname | cost | lat_ms | loss_rate | rx_bytes | tx_bytes | tunnel_proto | nat_type | id | version |
|
| ipv4 | hostname | cost | lat_ms | loss_rate | rx_bytes | tx_bytes | tunnel_proto | nat_type | id | version |
|
||||||
| ------------ | -------------- | ----- | ------ | --------- | -------- | -------- | ------------ | -------- | ---------- | --------------- |
|
| ------------ | -------------- | ----- | ------ | --------- | -------- | -------- | ------------ | -------- | ---------- | --------------- |
|
||||||
| 10.126.126.1 | abc-1 | Local | * | * | * | * | udp | FullCone | 439804259 | 2.4.5-70e69a38~ |
|
| 10.126.126.1 | abc-1 | Local | * | * | * | * | udp | FullCone | 439804259 | 2.5.0-70e69a38~ |
|
||||||
| 10.126.126.2 | abc-2 | p2p | 3.452 | 0 | 17.33 kB | 20.42 kB | udp | FullCone | 390879727 | 2.4.5-70e69a38~ |
|
| 10.126.126.2 | abc-2 | p2p | 3.452 | 0 | 17.33 kB | 20.42 kB | udp | FullCone | 390879727 | 2.5.0-70e69a38~ |
|
||||||
| | PublicServer_a | p2p | 27.796 | 0.000 | 50.01 kB | 67.46 kB | tcp | Unknown | 3771642457 | 2.4.5-70e69a38~ |
|
| | PublicServer_a | p2p | 27.796 | 0.000 | 50.01 kB | 67.46 kB | tcp | Unknown | 3771642457 | 2.5.0-70e69a38~ |
|
||||||
```
|
```
|
||||||
|
|
||||||
You can test connectivity between nodes:
|
You can test connectivity between nodes:
|
||||||
|
|||||||
+3
-3
@@ -106,9 +106,9 @@ sudo easytier-core -d --network-name abc --network-secret abc -p tcp://public.ea
|
|||||||
```text
|
```text
|
||||||
| ipv4 | hostname | cost | lat_ms | loss_rate | rx_bytes | tx_bytes | tunnel_proto | nat_type | id | version |
|
| ipv4 | hostname | cost | lat_ms | loss_rate | rx_bytes | tx_bytes | tunnel_proto | nat_type | id | version |
|
||||||
| ------------ | -------------- | ----- | ------ | --------- | -------- | -------- | ------------ | -------- | ---------- | --------------- |
|
| ------------ | -------------- | ----- | ------ | --------- | -------- | -------- | ------------ | -------- | ---------- | --------------- |
|
||||||
| 10.126.126.1 | abc-1 | Local | * | * | * | * | udp | FullCone | 439804259 | 2.4.5-70e69a38~ |
|
| 10.126.126.1 | abc-1 | Local | * | * | * | * | udp | FullCone | 439804259 | 2.5.0-70e69a38~ |
|
||||||
| 10.126.126.2 | abc-2 | p2p | 3.452 | 0 | 17.33 kB | 20.42 kB | udp | FullCone | 390879727 | 2.4.5-70e69a38~ |
|
| 10.126.126.2 | abc-2 | p2p | 3.452 | 0 | 17.33 kB | 20.42 kB | udp | FullCone | 390879727 | 2.5.0-70e69a38~ |
|
||||||
| | PublicServer_a | p2p | 27.796 | 0.000 | 50.01 kB | 67.46 kB | tcp | Unknown | 3771642457 | 2.4.5-70e69a38~ |
|
| | PublicServer_a | p2p | 27.796 | 0.000 | 50.01 kB | 67.46 kB | tcp | Unknown | 3771642457 | 2.5.0-70e69a38~ |
|
||||||
```
|
```
|
||||||
|
|
||||||
您可以测试节点之间的连通性:
|
您可以测试节点之间的连通性:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
id=easytier_magisk
|
id=easytier_magisk
|
||||||
name=EasyTier_Magisk
|
name=EasyTier_Magisk
|
||||||
version=v2.4.5
|
version=v2.5.0
|
||||||
versionCode=1
|
versionCode=1
|
||||||
author=EasyTier
|
author=EasyTier
|
||||||
description=easytier magisk module @EasyTier(https://github.com/EasyTier/EasyTier)
|
description=easytier magisk module @EasyTier(https://github.com/EasyTier/EasyTier)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "easytier-gui",
|
"name": "easytier-gui",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "2.4.5",
|
"version": "2.5.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"packageManager": "pnpm@9.12.1+sha512.e5a7e52a4183a02d5931057f7a0dbff9d5e9ce3161e33fa68ae392125b79282a8a8a470a51dfc8a0ed86221442eb2fb57019b0990ed24fab519bf0e1bc5ccfc4",
|
"packageManager": "pnpm@9.12.1+sha512.e5a7e52a4183a02d5931057f7a0dbff9d5e9ce3161e33fa68ae392125b79282a8a8a470a51dfc8a0ed86221442eb2fb57019b0990ed24fab519bf0e1bc5ccfc4",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "easytier-gui"
|
name = "easytier-gui"
|
||||||
version = "2.4.5"
|
version = "2.5.0"
|
||||||
description = "EasyTier GUI"
|
description = "EasyTier GUI"
|
||||||
authors = ["you"]
|
authors = ["you"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
"createUpdaterArtifacts": false
|
"createUpdaterArtifacts": false
|
||||||
},
|
},
|
||||||
"productName": "easytier-gui",
|
"productName": "easytier-gui",
|
||||||
"version": "2.4.5",
|
"version": "2.5.0",
|
||||||
"identifier": "com.kkrainbow.easytier",
|
"identifier": "com.kkrainbow.easytier",
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"shell": {
|
"shell": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "easytier-web"
|
name = "easytier-web"
|
||||||
version = "2.4.5"
|
version = "2.5.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "Config server for easytier. easytier-core gets config from this and web frontend use it as restful api server."
|
description = "Config server for easytier. easytier-core gets config from this and web frontend use it as restful api server."
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@ name = "easytier"
|
|||||||
description = "A full meshed p2p VPN, connecting all your devices in one network with one command."
|
description = "A full meshed p2p VPN, connecting all your devices in one network with one command."
|
||||||
homepage = "https://github.com/EasyTier/EasyTier"
|
homepage = "https://github.com/EasyTier/EasyTier"
|
||||||
repository = "https://github.com/EasyTier/EasyTier"
|
repository = "https://github.com/EasyTier/EasyTier"
|
||||||
version = "2.4.5"
|
version = "2.5.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors = ["kkrainbow"]
|
authors = ["kkrainbow"]
|
||||||
keywords = ["vpn", "p2p", "network", "easytier"]
|
keywords = ["vpn", "p2p", "network", "easytier"]
|
||||||
|
|||||||
@@ -432,7 +432,7 @@ impl StunNatTypeDetectResult {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_pat(&self) -> bool {
|
fn is_no_pat(&self) -> bool {
|
||||||
for resp in self.stun_resps.iter() {
|
for resp in self.stun_resps.iter() {
|
||||||
if resp.mapped_socket_addr.map(|x| x.port()) == Some(self.source_addr.port()) {
|
if resp.mapped_socket_addr.map(|x| x.port()) == Some(self.source_addr.port()) {
|
||||||
return true;
|
return true;
|
||||||
@@ -470,7 +470,7 @@ impl StunNatTypeDetectResult {
|
|||||||
if self.has_ip_changed_resp() {
|
if self.has_ip_changed_resp() {
|
||||||
if self.is_open_internet() {
|
if self.is_open_internet() {
|
||||||
NatType::OpenInternet
|
NatType::OpenInternet
|
||||||
} else if self.is_pat() {
|
} else if self.is_no_pat() {
|
||||||
NatType::NoPat
|
NatType::NoPat
|
||||||
} else {
|
} else {
|
||||||
NatType::FullCone
|
NatType::FullCone
|
||||||
@@ -522,7 +522,7 @@ impl StunNatTypeDetectResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if self.is_cone() {
|
if self.is_cone() {
|
||||||
if self.is_pat() {
|
if self.is_no_pat() {
|
||||||
NatType::NoPat
|
NatType::NoPat
|
||||||
} else {
|
} else {
|
||||||
NatType::FullCone
|
NatType::FullCone
|
||||||
@@ -802,8 +802,6 @@ impl TcpStunClient {
|
|||||||
|
|
||||||
#[tracing::instrument(ret, level = Level::TRACE)]
|
#[tracing::instrument(ret, level = Level::TRACE)]
|
||||||
pub async fn bind_request(self) -> Result<BindRequestResponse, Error> {
|
pub async fn bind_request(self) -> Result<BindRequestResponse, Error> {
|
||||||
let mut tids = vec![];
|
|
||||||
|
|
||||||
let mut stream = self.connect().await?;
|
let mut stream = self.connect().await?;
|
||||||
let local_addr = stream.local_addr()?;
|
let local_addr = stream.local_addr()?;
|
||||||
let stun_host = self.stun_server;
|
let stun_host = self.stun_server;
|
||||||
@@ -814,14 +812,13 @@ impl TcpStunClient {
|
|||||||
let msg = encoder
|
let msg = encoder
|
||||||
.encode_into_bytes(message.clone())
|
.encode_into_bytes(message.clone())
|
||||||
.with_context(|| "encode tcp stun message")?;
|
.with_context(|| "encode tcp stun message")?;
|
||||||
tids.push(tid);
|
|
||||||
tokio::time::timeout(self.io_timeout, stream.write_all(msg.as_slice())).await??;
|
tokio::time::timeout(self.io_timeout, stream.write_all(msg.as_slice())).await??;
|
||||||
|
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
let msg = Self::tcp_read_stun_message(&mut stream, self.io_timeout).await?;
|
let msg = Self::tcp_read_stun_message(&mut stream, self.io_timeout).await?;
|
||||||
if msg.class() != MessageClass::SuccessResponse
|
if msg.class() != MessageClass::SuccessResponse
|
||||||
|| msg.method() != BINDING
|
|| msg.method() != BINDING
|
||||||
|| !tids.contains(&tid_to_u32(&msg.transaction_id()))
|
|| tid_to_u32(&msg.transaction_id()) != tid
|
||||||
{
|
{
|
||||||
return Err(Error::MessageDecodeError(
|
return Err(Error::MessageDecodeError(
|
||||||
"unexpected stun response".to_string(),
|
"unexpected stun response".to_string(),
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ use crate::{
|
|||||||
rpc_types::{self, controller::BaseController},
|
rpc_types::{self, controller::BaseController},
|
||||||
},
|
},
|
||||||
tunnel::{
|
tunnel::{
|
||||||
common::setup_sokcet2,
|
|
||||||
tcp::{TcpTunnelConnector, TcpTunnelListener},
|
tcp::{TcpTunnelConnector, TcpTunnelListener},
|
||||||
TunnelConnector as _, TunnelListener as _,
|
TunnelConnector as _, TunnelListener as _,
|
||||||
},
|
},
|
||||||
@@ -73,36 +72,6 @@ async fn select_local_port(peer_mgr: &Arc<PeerManager>, is_v6: bool) -> Result<u
|
|||||||
Ok(port)
|
Ok(port)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn send_syn_from_port(
|
|
||||||
peer_mgr: &Arc<PeerManager>,
|
|
||||||
local_port: u16,
|
|
||||||
dst: SocketAddr,
|
|
||||||
) -> Result<(), Error> {
|
|
||||||
let bind_addr = bind_addr_for_port(local_port, dst.is_ipv6());
|
|
||||||
tracing::debug!(?bind_addr, ?dst, "tcp hole punch send syn");
|
|
||||||
let _g = peer_mgr.get_global_ctx().net_ns.guard();
|
|
||||||
|
|
||||||
let socket2_socket = socket2::Socket::new(
|
|
||||||
socket2::Domain::for_address(dst),
|
|
||||||
socket2::Type::STREAM,
|
|
||||||
Some(socket2::Protocol::TCP),
|
|
||||||
)?;
|
|
||||||
setup_sokcet2(&socket2_socket, &bind_addr)?;
|
|
||||||
let socket = tokio::net::TcpSocket::from_std_stream(socket2_socket.into());
|
|
||||||
match tokio::time::timeout(Duration::from_millis(600), socket.connect(dst)).await {
|
|
||||||
Ok(Ok(_stream)) => {
|
|
||||||
tracing::trace!(?bind_addr, ?dst, "tcp hole punch syn connect succeeded");
|
|
||||||
}
|
|
||||||
Ok(Err(e)) => {
|
|
||||||
tracing::trace!(?bind_addr, ?dst, ?e, "tcp hole punch syn connect failed");
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
tracing::trace!(?bind_addr, ?dst, ?e, "tcp hole punch syn connect timeout");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
// tcp support simultaneous connect, so initiator and server can both use connect.
|
// tcp support simultaneous connect, so initiator and server can both use connect.
|
||||||
async fn try_connect_to_remote(
|
async fn try_connect_to_remote(
|
||||||
peer_mgr: Arc<PeerManager>,
|
peer_mgr: Arc<PeerManager>,
|
||||||
@@ -576,8 +545,13 @@ impl TcpHolePunchConnector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn run(&mut self) -> Result<(), Error> {
|
pub async fn run(&mut self) -> Result<(), Error> {
|
||||||
if self.peer_mgr.get_global_ctx().get_flags().disable_p2p {
|
let flags = self.peer_mgr.get_global_ctx().get_flags();
|
||||||
tracing::debug!("tcp hole punch disabled by disable_p2p");
|
if flags.disable_p2p || flags.disable_tcp_hole_punching {
|
||||||
|
tracing::debug!(
|
||||||
|
"tcp hole punch disabled by disable_p2p(={}) or disable_tcp_hole_punching(={});",
|
||||||
|
flags.disable_p2p,
|
||||||
|
flags.disable_tcp_hole_punching
|
||||||
|
);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -225,7 +225,12 @@ fn get_or_create_worker(interface_name: &str) -> io::Result<Arc<InterfaceWorker>
|
|||||||
let interface = interfaces
|
let interface = interfaces
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.find(|iface| iface.name == interface_name)
|
.find(|iface| iface.name == interface_name)
|
||||||
.expect("Network interface not found");
|
.ok_or_else(|| {
|
||||||
|
io::Error::new(
|
||||||
|
io::ErrorKind::NotFound,
|
||||||
|
format!("Network interface '{}' not found", interface_name),
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
let worker = InterfaceWorker::new(interface)?;
|
let worker = InterfaceWorker::new(interface)?;
|
||||||
INTERFACE_MANAGERS.insert(interface_name.to_string(), Arc::downgrade(&worker));
|
INTERFACE_MANAGERS.insert(interface_name.to_string(), Arc::downgrade(&worker));
|
||||||
|
|||||||
Reference in New Issue
Block a user