diff --git a/neode-ui/src/router/index.ts b/neode-ui/src/router/index.ts
index adca8ea9..493c99bc 100644
--- a/neode-ui/src/router/index.ts
+++ b/neode-ui/src/router/index.ts
@@ -190,6 +190,11 @@ const router = createRouter({
name: 'openwrt-gateway',
component: () => import('../views/server/OpenWrtGateway.vue'),
},
+ {
+ path: 'server/firewall-tunnels',
+ name: 'firewall-tunnels',
+ component: () => import('../views/server/FirewallTunnelSettings.vue'),
+ },
{
path: 'monitoring',
name: 'monitoring',
diff --git a/neode-ui/src/views/Server.vue b/neode-ui/src/views/Server.vue
index a79fcf44..6f5d2be5 100644
--- a/neode-ui/src/views/Server.vue
+++ b/neode-ui/src/views/Server.vue
@@ -94,13 +94,18 @@
Refreshing network...
-
+
+
+
+ Firewall & tunnels
+
+
diff --git a/neode-ui/src/views/server/FirewallTunnelSettings.vue b/neode-ui/src/views/server/FirewallTunnelSettings.vue
new file mode 100644
index 00000000..e7c8453c
--- /dev/null
+++ b/neode-ui/src/views/server/FirewallTunnelSettings.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
← Network
+
Firewall & tunnels
+
Review reachability before exposing a service. Transport access and app authentication are separate controls.
+
+
+
+
+ {{ error }}
+
+
+
+
Firewall
+
Node protection status and mesh reachability.
+
Node firewall{{ firewallLabel }}
+
Authenticated mesh peers{{ fips?.authenticated_peer_count ?? 'Unknown' }}
+
+
+
Tunnel
+
Connection and handshake status.
+
Tunnel{{ tunnelLabel }}
+
Address{{ tunnel?.wg_ip || tunnel?.ip_address || 'Unknown' }}
+
+
+
+
+ Public access checks
Existing router forwards are shown for review. No route is changed from this screen yet.
{{ forwards.length }} forward{{ forwards.length === 1 ? '' : 's' }}
+
+
{{ JSON.stringify(forward) }}
+
No router forwards reported.
+
+ Public forwarding, node firewall, service listener and external reachability are independent checks. A local pass does not claim public access.
+
+
+
+ App exposure
+ App manifests and owned exposure rules will be added here after validation and rollback support are qualified.
+ No changes are available yet. Existing app access remains untouched.
+
+
+