Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions projects/start-os/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ file tracks notable changes since the move to the monorepo.
one canonical origin can now direct Open UI to that address while it remains
enabled and compatible with the current browser session.

- **Private-domain routes on a shared port survive a network path that blocks
PCP.** When you bind a private domain through a Start9 gateway, StartOS asks
the gateway to route the hostname by TLS SNI — previously only over PCP, so
a network that filters UDP 5351 between your server and the gateway kept
ordinary port forwards working while the domain silently stopped being
routed. StartOS now falls back to asking over UPnP (a Start9 vendor action
the gateway advertises), so the route comes up either way; PCP remains
preferred when it gets through.

- **A service can permanently retire a network host or a port it no longer
uses, and the port numbers it held become available again.** A service that
reorganizes its interfaces across an update — renaming a host, dropping a
Expand Down
19 changes: 18 additions & 1 deletion projects/start-tunnel/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,24 @@ All notable changes to StartTunnel are documented here.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.2.2]
## [1.3.0]

### Added

- **Devices can request SNI hostname routes over UPnP, not only PCP.** The
tunnel's UPnP IGD now serves two Start9 vendor actions
(`X_START9_AddHostnameMapping` / `X_START9_DeleteHostnameMapping`, advertised
in its `WANIPConnection:1` SCPD) that bind a hostname on a shared external
port via SNI demultiplexing — the same capability the PCP `HOSTNAME` option
provides. A device that reaches the tunnel over UPnP but not PCP (for
example, UDP 5351 filtered by an intermediate device) previously kept its
ordinary port forwards but silently lost SNI demux; StartOS now falls back to
the vendor action automatically. Unlike standard UPnP mappings, these routes
are always lease-bearing and expire if the device stops renewing them, so a
vanished device can never squat a hostname against its legitimate owner.
A hostname grant (over either protocol) is now also refused outright when
the tunnel cannot bind the shared port's listener, instead of being
acknowledged while routing nothing.

### Fixed

Expand Down
2 changes: 1 addition & 1 deletion projects/start-tunnel/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ edition = "2024"
license = "MIT"
name = "start-tunnel"
repository = "https://github.com/Start9Labs/start-technologies"
version = "1.2.2" # VERSION_BUMP
version = "1.3.0" # VERSION_BUMP

[[bin]]
name = "tunnelbox"
Expand Down
4 changes: 3 additions & 1 deletion projects/start-tunnel/docs/src/published-ports.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Because each device has its own IPv6 address, two different devices can both pub

## Manual and automatic ports

The `Published Ports` page shows two tables: **Manual** ports you added by hand, and **Automatic** ports opened by connected devices via PCP/UPnP. A row's **External IP** is your VPS's public IPv4 (a v4 published port) or the device's IPv6 GUA (a v6 pinhole). You can enable, disable, or remove either; automatic ports have no editable label (they're owned by the device that created them) and may be re-created if you remove one while the device still wants it. Manual ports are persistent — they stay until you delete them. Automatic ports are lease-based: one that stops being renewed (its device went offline or no longer wants the port) expires and is removed on its own.
The `Published Ports` page shows two tables: **Manual** ports you added by hand, and **Automatic** port uses created by connected devices. Automatic entries include PCP/UPnP port mappings and SNI hostname routes; their kind identifies which one they are. A row's **External IP** is your VPS's public IPv4 (a v4 published port) or the device's IPv6 GUA (a v6 pinhole). You can enable, disable, or remove either; automatic entries are owned by the device that created them and may be re-created if you remove one while the device still wants it. Manual ports are persistent — they stay until you delete them. Automatic port uses are lease-based: one that stops being renewed (its device went offline or no longer wants the port) expires and is removed on its own.

Deleting a device or demoting it to a client clears all of its published ports (manual and automatic, IPv4 and IPv6). Turning off **auto-publish** for a device clears its automatic ports but leaves any you added by hand.

Expand All @@ -42,3 +42,5 @@ Deleting a device or demoting it to a client clears all of its published ports (
## SNI hostnames (IPv4 only)

When IP Version includes IPv4 (`IPv4` or `IPv4 + IPv6`), an optional **Hostname** routes by TLS SNI so several hostnames can share one external port. SNI demultiplexing is IPv4-only — in `IPv4 + IPv6` mode it applies to the IPv4 side only, and the IPv6 side is a plain pinhole (each device already has its own address, so no demux is needed) — and it cannot be combined with a port range.

Connected devices can also create SNI hostname routes **automatically**, the same way they open automatic ports. A device asks over PCP (preferred) or, when PCP can't get through, over a UPnP vendor action the tunnel advertises (`X_START9_AddHostnameMapping`). Either way the route appears in the **Automatic** table, carries a lease, and expires on its own if the device stops renewing it — and, like every automatic mapping, it can only point at the requesting device's own address.
Loading