Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
f3e2097
feat(net): automatic port forwarding via PCP/NAT-PMP/UPnP (client + S…
helix-nine Jun 10, 2026
ab11d7d
feat(net): RFC 2136 client for private domains (best-effort)
helix-nine Jun 10, 2026
e8a4370
feat(net): shared RFC 2136 DNS-injection handler (core)
helix-nine Jun 10, 2026
f43d1f9
feat(tunnel): accept RFC 2136 DNS injection from trusted devices
helix-nine Jun 10, 2026
17c4900
feat(tunnel): DNS-injection CRUD API + per-device toggle (CLI + bindi…
helix-nine Jun 10, 2026
e2343ae
feat(tunnel/web): DNS records page + per-device DNS-injection toggle
helix-nine Jun 10, 2026
155d990
fix(tunnel/web): add allowDnsInjection to mock addDevice WgConfig
helix-nine Jun 10, 2026
6badb1d
feat(net): PCP HOSTNAME option codec (SNI-demux extension, phase 1)
helix-nine Jun 11, 2026
5d87386
feat(tunnel): SNI demux dataplane for PCP HOSTNAME bindings
helix-nine Jun 11, 2026
71fab98
feat(net): emit PCP HOSTNAME mappings for public domain vhosts
helix-nine Jun 11, 2026
a1069aa
fix: restore [profile.dev.package.backtrace] opt-level
helix-nine Jun 11, 2026
99927e5
feat(net): gateway-autoconfig-aware port and DNS checks
helix-nine Jun 11, 2026
37440c2
feat(net): PCP PORT_SET (RFC 7753) for range port mappings
helix-nine Jun 11, 2026
684ef9f
refactor(tunnel): move IGD SOAP/XML templates to include_str! files
helix-nine Jun 11, 2026
cc465d4
refactor(net): extract reusable PCP server (GatewayBackend trait)
helix-nine Jun 11, 2026
fcbd535
refactor(net): add GatewayBackend::remove_forward_by_source for IGD
helix-nine Jun 11, 2026
5bd0bbd
style: prettier-format StartTunnel DNS/devices web routes
helix-nine Jun 11, 2026
b8c7812
refactor(net): extract reusable UPnP IGD server (igd_server.rs)
helix-nine Jun 12, 2026
fb571c8
feat(sni): SniDemux on_change hook for inbound access control
helix-nine Jun 13, 2026
8c7a8d7
fix(start-tunnel/web): address review feedback on DNS UI
helix-nine Jun 15, 2026
5ebb8cc
fix(build): raise RUST_MIN_STACK for apple-darwin codegen
helix-nine Jun 16, 2026
600f73e
fix(net): bound UPnP IGD control calls so set-public can't hang
helix-nine Jun 16, 2026
63e23ca
feat(tunnel): SNI-demuxed port forwards as a first-class forward type
helix-nine Jun 17, 2026
70add4d
feat(tunnel/web): SNI column + manual SNI entry in port-forwards
helix-nine Jun 17, 2026
0ab133e
fix(net/port-map): don't re-apply an unsatisfiable mapping on every e…
helix-nine Jun 17, 2026
c6863d6
feat(tunnel): per-subnet/per-device WAN assignment; SNI ownership by …
helix-nine Jun 17, 2026
4c591b5
feat(tunnel/web): WAN-IP assignment UI in the portal
helix-nine Jun 17, 2026
2272530
feat(tunnel): fix a port forward's external IP to the target device's…
helix-nine Jun 18, 2026
3d3eb93
fix(net/port-map): rate-limited retry of not-yet-active mappings
helix-nine Jun 18, 2026
7a3c17d
feat(tunnel/web): single hostname per port-forward + clarify SSL-only
helix-nine Jun 18, 2026
f849433
feat(tunnel): re-key forwards when a device's WAN assignment changes
helix-nine Jun 18, 2026
513830f
feat(net): block packages from sending UPnP/NAT-PMP/PCP to the gateway
helix-nine Jun 18, 2026
3703eaa
refactor(net): whitelist port-mapping egress to the host (v4 + v6)
helix-nine Jun 18, 2026
c8cae1d
feat(tunnel/web): fold WAN IP + DNS injection into Add/Edit dialogs
helix-nine Jun 18, 2026
2cb9e59
fix(net): make hostname part of a SNI port-forward's identity
helix-nine Jun 22, 2026
5514914
fix(net): scope auto port-mapping to gateways the service is named on
helix-nine Jun 22, 2026
1ac8099
fix(net): probe only each interface's own subnet gateway for port-map…
helix-nine Jun 22, 2026
88bc3f4
chore(net): log which address + gateway each port-map is on behalf of
helix-nine Jun 22, 2026
dc534de
chore: reconcile Cargo.lock + bindings after rebase onto master
helix-nine Jun 23, 2026
ccf0f37
refactor(net,tunnel): group the feature's new code into module hierar…
helix-nine Jun 23, 2026
9f11d65
style: tighten the feature's comments to be terse and to the point
helix-nine Jun 23, 2026
2743598
refactor(net,tunnel): DRY up duplicated helpers
helix-nine Jun 23, 2026
eda6213
docs: add PCP HOSTNAME extension Internet-Draft
helix-nine Jun 23, 2026
5fa3e15
docs: PCP HOSTNAME extension as a submittable Internet-Draft
helix-nine Jun 23, 2026
136fad4
docs: rename PCP HOSTNAME draft slug to draft-start9-pcp-hostname
helix-nine Jun 23, 2026
4f9f5eb
feat(net): source-preserving SNI demux via IP_TRANSPARENT egress
helix-nine Jun 23, 2026
a0f8a0d
refactor(net): address review — rustls SNI parse, native async trait
helix-nine Jun 23, 2026
b193b13
fix(net): drop rp_filter loosening from transparent-egress divert
helix-nine Jun 23, 2026
0b8f508
fix(net): divert SNI-demux replies via socket-transparent match
helix-nine Jun 23, 2026
547b041
fix(net): install sni-divert nft rule on hosts without gateway reconcile
dr-bonez Jun 23, 2026
a332b24
fix(start-tunnel): port-forward/DNS UI nits
helix-nine Jun 23, 2026
d1ace3f
feat(tunnel): gateway autoconfiguration toggle gates port forwarding
helix-nine Jun 23, 2026
a4f944a
feat(tunnel): split gateway autoconfig into two device flags
helix-nine Jun 23, 2026
1d20401
fix(net): install ring as rustls process-default provider
dr-bonez Jun 23, 2026
8ed1213
style(container-runtime): prettier-format EffectCreator
dr-bonez Jun 23, 2026
0902921
chore(deps): sync container-runtime + web lockfiles to build output
dr-bonez Jun 23, 2026
d0d84e2
fix(start-tunnel): autoconfig reflects both flags; note -> hint
helix-nine Jun 23, 2026
76626cf
feat(net): best-effort 80->443 forward for auto HTTPS redirects
helix-nine Jun 23, 2026
447fc13
fix(tunnel): consistent auto-forward labels
helix-nine Jun 23, 2026
07ceb3c
fix(dns): answer NODATA for held names, don't forward missing-type qu…
helix-nine Jun 23, 2026
8303a37
fix(net): upstream port map advertises the target internal port
helix-nine Jun 24, 2026
ad2b6c4
feat(net): PCP ANNOUNCE capability discovery for the HOSTNAME extension
helix-nine Jun 24, 2026
9b94373
chore(net): set Start9 PCP capability magic to b"S9\x3b\x01"
helix-nine Jun 24, 2026
ddb3eee
fix(net): apple-darwin build + tokio runtime for the NODATA test
helix-nine Jun 24, 2026
8336b99
fix(net): bind ANNOUNCE probe to the gateway-facing source IP
helix-nine Jun 24, 2026
c07222a
fix(net): check_dns queries the subnet gateway, not just DHCP resolvers
helix-nine Jun 24, 2026
e8604a3
fix(net): track imported WireGuard DNS in dns_servers; drop the .1 fa…
helix-nine Jun 24, 2026
b46363d
feat(tunnel): device Client/Server kind + explicit forward auto flag …
helix-nine Jun 24, 2026
4b9ebcb
chore(bindings): regenerate osBindings for device kind + forward auto
helix-nine Jun 24, 2026
a7c0abe
feat(start-tunnel): Clients/Servers + Manual/Automatic UI; promote/de…
helix-nine Jun 24, 2026
dd6d546
feat(net): update a WireGuard gateway's config in place
helix-nine Jun 24, 2026
ec41e1e
feat(ui): Update config action for WireGuard gateways
helix-nine Jun 24, 2026
f4b18ef
feat(net): authenticate DNS UPDATE injection with TSIG keyed off WG PSK
helix-nine Jun 24, 2026
e7af87e
fix(net): read IP6Config Nameservers, not nonexistent NameserverData
helix-nine Jun 24, 2026
33c5952
feat(start-tunnel): wrap tables in titled cards; infer device kind fr…
helix-nine Jun 24, 2026
8953d72
fix(start-tunnel): WAN default option no longer blank; context-specif…
helix-nine Jun 24, 2026
0d01808
fix(net): PCP internal port for non-SNI forwards is the LAN port, not…
helix-nine Jun 24, 2026
b98374a
fix(start-tunnel): drop enable toggle from automatic forwards; DNS so…
helix-nine Jun 24, 2026
32be54d
feat(ui): offer DNS Injection / automatic port forwarding in domain s…
helix-nine Jun 24, 2026
5afa975
fix(net): update_tunnel survives losing the gateway it's updating
helix-nine Jun 24, 2026
d6e4084
fix(net): make delete_iface cancel-safe (twin of the update_tunnel fix)
helix-nine Jun 24, 2026
9b1d555
feat(net): in-place WireGuard update; unify add/update on one config …
helix-nine Jun 25, 2026
78345f1
chore: cleanup
waterplea Jun 25, 2026
b91548f
fix(net): OS 80->443 redirect maps via PortMapController directly
helix-nine Jun 25, 2026
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
4 changes: 4 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# LLVM codegen recurses deep enough on the apple-darwin target to overflow the
# 2 MiB default rustc codegen-worker stack; 64 MiB clears it. Harmless on other targets.
[env]
RUST_MIN_STACK = "67108864"
8 changes: 5 additions & 3 deletions container-runtime/package-lock.json

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

4 changes: 3 additions & 1 deletion container-runtime/src/Adapters/EffectCreator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,9 @@ export function makeEffects(context: EffectContext): Effects {
T.Effects["setHealth"]
>
},
setBackupProgress(...[options]: Parameters<T.Effects["setBackupProgress"]>) {
setBackupProgress(
...[options]: Parameters<T.Effects["setBackupProgress"]>
) {
return rpcRound("set-backup-progress", options) as ReturnType<
T.Effects["setBackupProgress"]
>
Expand Down
78 changes: 77 additions & 1 deletion core/Cargo.lock

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

6 changes: 5 additions & 1 deletion core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ futures = "0.3.28"
gpt = "4.1.0"
hashing-serializer = "0.1.1"
hex = "0.4.3"
hickory-server = { version = "0.26.1", features = ["resolver"] }
hickory-server = { version = "0.26.1", features = ["resolver", "dnssec-ring"] }
hkdf = "0.12"
hmac = "0.12.1"
http = "1.0.0"
http-body-util = "0.1"
Expand Down Expand Up @@ -234,6 +235,9 @@ uuid = { version = "1.4.1", features = ["v4"] }
visit-rs = "0.1.1"
x25519-dalek = { version = "2.0.1", features = ["static_secrets"] }
zbus = "5.1.1"
igd-next = { version = "0.17.1", default-features = false, features = ["aio_tokio"] }
xmltree = "0.10"
crab_nat = { git = "https://github.com/Start9Labs/crab_nat.git", branch = "feat/custom-pcp-options" }

[dev-dependencies]
clap_mangen = "0.2.33"
Expand Down
70 changes: 70 additions & 0 deletions core/locales/i18n.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5659,6 +5659,13 @@ about.persist-new-notification:
fr_FR: "Persister une nouvelle notification"
pl_PL: "Utrwal nowe powiadomienie"

about.promote-or-demote-device-kind:
en_US: "Promote a device to a server or demote it to a client"
de_DE: "Ein Gerät zu einem Server hochstufen oder zu einem Client herabstufen"
es_ES: "Promover un dispositivo a servidor o degradarlo a cliente"
fr_FR: "Promouvoir un appareil en serveur ou le rétrograder en client"
pl_PL: "Awansuj urządzenie do serwera lub zdegraduj je do klienta"

about.promote-os-registry:
en_US: "Promote an OS version from one registry to another"
de_DE: "Eine OS-Version von einer Registry in eine andere heraufstufen"
Expand Down Expand Up @@ -5981,6 +5988,13 @@ about.set-default-outbound-gateway:
fr_FR: "Définir la passerelle sortante par défaut"
pl_PL: "Ustaw domyślną bramę wychodzącą"

about.set-device-wan:
en_US: "Override the WAN IP for a single device"
de_DE: "Die WAN-IP für ein einzelnes Gerät überschreiben"
es_ES: "Anular la IP WAN para un solo dispositivo"
fr_FR: "Remplacer l'IP WAN pour un seul appareil"
pl_PL: "Zastąp adres IP WAN dla pojedynczego urządzenia"

about.set-echoip-urls:
en_US: "Set the Echo IP service URLs"
de_DE: "Die Echo-IP-Dienst-URLs festlegen"
Expand Down Expand Up @@ -6072,6 +6086,13 @@ about.set-subnet-dns:
fr_FR: "Définir le DNS du sous-réseau"
pl_PL: "Ustaw DNS podsieci"

about.set-subnet-wan:
en_US: "Assign the WAN IP a subnet's traffic uses"
de_DE: "Die WAN-IP zuweisen, die der Datenverkehr eines Subnetzes verwendet"
es_ES: "Asignar la IP WAN que usa el tráfico de una subred"
fr_FR: "Attribuer l'IP WAN qu'utilise le trafic d'un sous-réseau"
pl_PL: "Przypisz adres IP WAN używany przez ruch podsieci"

about.set-user-interface-password:
en_US: "Set user interface password"
de_DE: "Passwort der Benutzeroberfläche festlegen"
Expand Down Expand Up @@ -6289,9 +6310,58 @@ about.update-port-forward-label:
fr_FR: "Mettre à jour le libellé d'une redirection de port"
pl_PL: "Zaktualizuj etykietę przekierowania portu"

about.update-tunnel:
en_US: "Replace a gateway's WireGuard config in place, keeping its identity"
de_DE: "Die WireGuard-Konfiguration eines Gateways direkt ersetzen, unter Beibehaltung seiner Identität"
es_ES: "Reemplazar la configuración WireGuard de un gateway in situ, conservando su identidad"
fr_FR: "Remplacer la configuration WireGuard d'une passerelle sur place, en conservant son identité"
pl_PL: "Zastąp konfigurację WireGuard bramy w miejscu, zachowując jej tożsamość"

about.view-edit-gateway-configs:
en_US: "View and edit gateway configurations"
de_DE: "Gateway-Konfigurationen anzeigen und bearbeiten"
es_ES: "Ver y editar configuraciones de gateway"
fr_FR: "Voir et modifier les configurations de passerelle"
pl_PL: "Wyświetl i edytuj konfiguracje bramy"

about.add-or-replace-a-dns-record:
en_US: "Add or replace a DNS record"
de_DE: "Einen DNS-Eintrag hinzufügen oder ersetzen"
es_ES: "Agregar o reemplazar un registro DNS"
fr_FR: "Ajouter ou remplacer un enregistrement DNS"
pl_PL: "Dodaj lub zastąp rekord DNS"

about.allow-or-deny-device-dns-injection:
en_US: "Allow or deny a device to inject DNS records"
de_DE: "Einem Gerät das Einfügen von DNS-Einträgen erlauben oder verweigern"
es_ES: "Permitir o denegar que un dispositivo inyecte registros DNS"
fr_FR: "Autoriser ou refuser à un appareil d'injecter des enregistrements DNS"
pl_PL: "Zezwól lub odmów urządzeniu wstrzykiwania rekordów DNS"

about.allow-or-deny-device-auto-port-forward:
en_US: "Allow or deny a device to auto-create port forwards"
de_DE: "Einem Gerät das automatische Erstellen von Portweiterleitungen erlauben oder verweigern"
es_ES: "Permitir o denegar que un dispositivo cree reenvíos de puertos automáticamente"
fr_FR: "Autoriser ou refuser à un appareil de créer automatiquement des redirections de ports"
pl_PL: "Zezwól lub odmów urządzeniu automatycznego tworzenia przekierowań portów"

about.list-injected-dns-records:
en_US: "List injected DNS records"
de_DE: "Eingefügte DNS-Einträge auflisten"
es_ES: "Listar registros DNS inyectados"
fr_FR: "Lister les enregistrements DNS injectés"
pl_PL: "Wyświetl wstrzyknięte rekordy DNS"

about.remove-a-dns-record:
en_US: "Remove a DNS record"
de_DE: "Einen DNS-Eintrag entfernen"
es_ES: "Eliminar un registro DNS"
fr_FR: "Supprimer un enregistrement DNS"
pl_PL: "Usuń rekord DNS"

about.view-or-edit-injected-dns-records:
en_US: "View or edit injected DNS records"
de_DE: "Eingefügte DNS-Einträge anzeigen oder bearbeiten"
es_ES: "Ver o editar registros DNS inyectados"
fr_FR: "Voir ou modifier les enregistrements DNS injectés"
pl_PL: "Wyświetl lub edytuj wstrzyknięte rekordy DNS"
22 changes: 22 additions & 0 deletions core/man/start-tunnel/start-tunnel-device-set-dns-injection.1
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH start-tunnel-device-set-dns-injection 1 "set-dns-injection "
.SH NAME
start\-tunnel\-device\-set\-dns\-injection \- Allow or deny a device to inject DNS records
.SH SYNOPSIS
\fBstart\-tunnel device set\-dns\-injection\fR [\fB\-\-enabled\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fISUBNET\fR> <\fIIP\fR>
.SH DESCRIPTION
Allow or deny a device to inject DNS records
.SH OPTIONS
.TP
\fB\-\-enabled\fR

.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fISUBNET\fR>

.TP
<\fIIP\fR>

3 changes: 3 additions & 0 deletions core/man/start-tunnel/start-tunnel-device.1
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,8 @@ List devices in a subnet
start\-tunnel\-device\-remove(1)
Remove device from subnet
.TP
start\-tunnel\-device\-set\-dns\-injection(1)
Allow or deny a device to inject DNS records
.TP
start\-tunnel\-device\-show\-config(1)
Show WireGuard configuration for device
25 changes: 25 additions & 0 deletions core/man/start-tunnel/start-tunnel-dns-add.1
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH start-tunnel-dns-add 1 "add "
.SH NAME
start\-tunnel\-dns\-add \- Add or replace a DNS record
.SH SYNOPSIS
\fBstart\-tunnel dns add\fR <\fB\-\-type\fR> [\fB\-\-ttl\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fINAME\fR> <\fIVALUE\fR>
.SH DESCRIPTION
Add or replace a DNS record
.SH OPTIONS
.TP
\fB\-\-type\fR \fI<RTYPE>\fR

.TP
\fB\-\-ttl\fR \fI<TTL>\fR

.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fINAME\fR>

.TP
<\fIVALUE\fR>

Loading
Loading