AkurAI Build
Menu

AkurAI-VPNCommit 22da10d5

Commit 22da10d5

22da10d5eeb459769d6d21108a8ba1b363d5b313 by Claude Code

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28a95a4..d3493e6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,11 @@ All notable changes to this project are documented here. Format: Keep a Changelo
 
 ## [Unreleased]
 
+## [0.3.5] - 2026-07-01
+
+- Skip loopback direct endpoint candidates
+
+
 ## [0.3.4] - 2026-07-01
 
 - LAN-local direct path candidates
diff --git a/Cargo.lock b/Cargo.lock
index de18a18..d304ce2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,37 +4,37 @@ version = 4
 
 [[package]]
 name = "akurai-admin"
-version = "0.3.4"
+version = "0.3.5"
 dependencies = [
  "akurai-common",
 ]
 
 [[package]]
 name = "akurai-common"
-version = "0.3.4"
+version = "0.3.5"
 
 [[package]]
 name = "akurai-control"
-version = "0.3.4"
+version = "0.3.5"
 dependencies = [
  "akurai-common",
 ]
 
 [[package]]
 name = "akurai-crypto"
-version = "0.3.4"
+version = "0.3.5"
 
 [[package]]
 name = "akurai-dns"
-version = "0.3.4"
+version = "0.3.5"
 
 [[package]]
 name = "akurai-ingress"
-version = "0.3.4"
+version = "0.3.5"
 
 [[package]]
 name = "akurai-node"
-version = "0.3.4"
+version = "0.3.5"
 dependencies = [
  "akurai-common",
  "akurai-crypto",
@@ -45,18 +45,18 @@ dependencies = [
 
 [[package]]
 name = "akurai-relay"
-version = "0.3.4"
+version = "0.3.5"
 dependencies = [
  "akurai-common",
 ]
 
 [[package]]
 name = "akurai-sys"
-version = "0.3.4"
+version = "0.3.5"
 
 [[package]]
 name = "akurai-transport"
-version = "0.3.4"
+version = "0.3.5"
 dependencies = [
  "akurai-crypto",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index bc5c1bc..b7c6b46 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,7 +14,7 @@ members = ["crates/akurai-common", "crates/akurai-crypto", "crates/akurai-transp
 # official RFC test vectors. The hand-rolled-crypto risk is accepted deliberately.
 
 [workspace.package]
-version = "0.3.4"
+version = "0.3.5"
 edition = "2021"
 license = "MIT"
 repository = "https://github.com/olibuijr/AkurAI-VPN"
diff --git a/VERSION b/VERSION
index 42045ac..c2c0004 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.3.4
+0.3.5
diff --git a/crates/akurai-node/src/heartbeat.rs b/crates/akurai-node/src/heartbeat.rs
index 5679928..fe7b0e2 100644
--- a/crates/akurai-node/src/heartbeat.rs
+++ b/crates/akurai-node/src/heartbeat.rs
@@ -181,10 +181,10 @@ fn advertised_endpoint(relay: SocketAddr, tunnel_port: u16) -> Option<String> {
     sock.connect(relay).ok()?;
     let local = sock.local_addr().ok()?;
     match local {
-        SocketAddr::V4(v4) if !v4.ip().is_unspecified() => {
+        SocketAddr::V4(v4) if !v4.ip().is_unspecified() && !v4.ip().is_loopback() => {
             Some(SocketAddr::from((*v4.ip(), tunnel_port)).to_string())
         }
-        SocketAddr::V6(v6) if !v6.ip().is_unspecified() => {
+        SocketAddr::V6(v6) if !v6.ip().is_unspecified() && !v6.ip().is_loopback() => {
             Some(SocketAddr::from((*v6.ip(), tunnel_port)).to_string())
         }
         _ => None,
@@ -266,4 +266,10 @@ mod tests {
             r#"{"id":"node\"a","endpoint":"192.168.1.44:51399"}"#
         );
     }
+
+    #[test]
+    fn advertised_endpoint_skips_loopback_source() {
+        let relay = "127.0.0.1:51820".parse().unwrap();
+        assert_eq!(advertised_endpoint(relay, 50000), None);
+    }
 }