1337 lines
65 KiB
Plaintext
1337 lines
65 KiB
Plaintext
vpn-router (0.37.1-1) unstable; urgency=medium
|
|
|
|
fix: /config answers the OpenID Provider's state and issuer.
|
|
|
|
* /config has oidc: enabled, and issuer, the issuer URL, null while the
|
|
provider is disabled.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 30 Oct 2026 01:53:55 +0100
|
|
|
|
vpn-router (0.37.0-1) unstable; urgency=medium
|
|
|
|
feature: the OpenID Provider has the client credentials and device authorization grants, public clients, and service accounts as resources with roles and scopes in JWT access tokens.
|
|
|
|
* A client may have the grants client_credentials, by which a
|
|
confidential client gets an access token as its own service account,
|
|
and the device code (RFC 8628): POST /oidc/device_authorization gives
|
|
a device code and a user code, the user enters the code on
|
|
/oidc/device, signs in and allows or denies the device, and the device
|
|
polls /oidc/token. A public client has no secret.
|
|
* An http loopback redirect URI matches with any port.
|
|
* Every service account is a resource: it defines scopes, which clients
|
|
ask for as <resource>:<scope> when their client scopes allow them, and
|
|
roles, assigned to groups, users and service accounts. A token request
|
|
names its resource with resource (RFC 8707) or by its scopes.
|
|
* Access tokens are RS256 JWTs of RFC 9068 for the resource, or the
|
|
client, with client_id, scope, roles and the claims of the scopes; ID
|
|
tokens and /oidc/userinfo carry the user's roles of the client.
|
|
* vpn-router-user takes --grant, --public-client, --client-scope and
|
|
--resource-scope; the new vpn-router-role manages the roles; and
|
|
/service-accounts takes and answers grants, public_client,
|
|
client_scopes, resource_scopes and roles.
|
|
* Changing the password of a service account, disabling, unlocking or
|
|
removing it through /service-accounts revokes its tokens.
|
|
* POST /oidc/device and /oidc/device_authorization are rate limited as
|
|
/oidc/login is.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 30 Oct 2026 00:57:11 +0100
|
|
|
|
vpn-router (0.36.0-1) unstable; urgency=medium
|
|
|
|
feature: a shell opens with one of the user's passkeys in place of the password and the TOTP code.
|
|
|
|
* POST /shell/passkey begins a proof for one of the signed-in user's own
|
|
passkeys, with user verification; POST /shell takes the browser's
|
|
answer as {"passkey": {"id", "credential"}} in place of the password
|
|
and the code, and gives the ticket of the shell.
|
|
* A passkey that is not accepted is refused with 403. The shell still
|
|
needs the user's TOTP enrolment, which its login session and sudo in
|
|
it need.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Thu, 29 Oct 2026 23:09:43 +0100
|
|
|
|
vpn-router (0.35.2-2) unstable; urgency=medium
|
|
|
|
update: the package is published for Ubuntu 26.04 (resolute) as well as 24.04 (noble).
|
|
|
|
* publish.sh uploads the package to the distributions noble and resolute
|
|
of the repository, component main, skipping a distribution that has
|
|
the version already; DISTRIBUTIONS names others. A router on Ubuntu
|
|
26.04 installs vpn-router from the distribution resolute.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Thu, 29 Oct 2026 21:41:32 +0100
|
|
|
|
vpn-router (0.35.2-1) unstable; urgency=medium
|
|
|
|
fix: the web service answers /, /status and /status/full again while IKEv2 runs.
|
|
|
|
* The status of IKEv2 clients is collected again; the requests that
|
|
collect the status were dropped with a NameError since 0.35.1.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Thu, 29 Oct 2026 19:03:16 +0100
|
|
|
|
vpn-router (0.35.1-1) unstable; urgency=medium
|
|
|
|
update: the router web service is split into the package vpnrouter_web, with one module per family of paths.
|
|
|
|
* /usr/lib/vpn-router/web initializes and serves; the package
|
|
/usr/lib/vpn-router/vpnrouter_web/ answers the requests, with a module
|
|
for the status, the sign-in, the identities, the connections, backups,
|
|
the PKI, logs, web sites, DNS, metrics and the shell. The paths, the
|
|
answers and the log messages are the same.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Thu, 29 Oct 2026 18:20:50 +0100
|
|
|
|
vpn-router (0.35.0-1) unstable; urgency=medium
|
|
|
|
feature: vre opens files from the Router Manager's shell in the editor of its Shell page.
|
|
|
|
* vpn-router-editor FILE..., or vre, in the shell of the Router Manager
|
|
opens the files in the editor of the Shell page and returns at once;
|
|
outside that shell it exits with status 2.
|
|
* GET, PUT and DELETE /shell/editor/<session>/<id> read, save and close
|
|
a file opened so, as the shell's console account; a save is refused
|
|
with 409 when the file changed since it was read.
|
|
* The editor takes regular files of UTF-8 text up to 1 MiB, at most 20
|
|
per shell, while the shell lives.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Thu, 29 Oct 2026 18:02:27 +0100
|
|
|
|
vpn-router (0.34.0-1) unstable; urgency=medium
|
|
|
|
feature: the web service shows and changes the settings of the metrics service at /metrics/settings, and OpenVPN starts on a new router, as setup installs CRLs that revoke nothing.
|
|
|
|
* GET and PUT /metrics/settings show and change the metrics section;
|
|
otlp_password is never shown, an empty one keeps it, and an empty
|
|
otlp_username removes it.
|
|
* A CRL without revoked certificates is installed for strongSwan and
|
|
OpenVPN.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Wed, 28 Oct 2026 22:00:00 +0100
|
|
|
|
vpn-router (0.33.3-1) unstable; urgency=medium
|
|
|
|
fix: vpn-router-setup runs on a new installation once libpq can be found.
|
|
|
|
* The vpn-router-setup unit waits, with wait-for-libpq, until libpq is in
|
|
the linker cache before it runs setup.
|
|
* The package starts vpn-router-setup without waiting for it.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Wed, 28 Oct 2026 21:00:00 +0100
|
|
|
|
vpn-router (0.33.2-1) unstable; urgency=medium
|
|
|
|
fix: the router's IPsec remote access is called IKEv2 instead of road-warrior.
|
|
|
|
* The README, the package description, the installer's questions, the
|
|
status page, the messages of the web service and the examples say
|
|
IKEv2 access and IKEv2 clients; the strongSwan connection keeps its
|
|
name, road-warrior.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 23:00:00 +0100
|
|
|
|
vpn-router (0.33.1-1) unstable; urgency=medium
|
|
|
|
fix: the name server is the primary of any number of domains, each with secondary name servers and a switch for the records of the sites.
|
|
|
|
* The domains, their secondaries and manual records are kept in the
|
|
vpn-router-dns database and changed through /dns/domains; dns.zone is
|
|
removed.
|
|
* Each domain is served as a primary zone: the router and its
|
|
secondaries are its NS, and each secondary's address is notified of
|
|
changes and may transfer the zone.
|
|
* A domain with site records gives the host names of the enabled sites
|
|
in it A and AAAA records of dns.addresses; a domain inside another is
|
|
delegated from it.
|
|
* Manual records belong to a domain; those of the single zone are
|
|
dropped.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 20:00:00 +0100
|
|
|
|
vpn-router (0.33.0-1) unstable; urgency=medium
|
|
|
|
feature: road-warrior clients resolve the domains of the new setting p2s.dns_domains with the router's resolver.
|
|
|
|
* p2s.dns_domains lists up to 16 domains; setup pushes them to IKEv2
|
|
clients as INTERNAL_DNS_DOMAIN (RFC 8598, attribute 25) of the
|
|
road-warrior pool.
|
|
* The Apple VPN profile names them as match domains of the router's
|
|
resolver, which macOS and iOS use for those domains.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 18:00:00 +0100
|
|
|
|
vpn-router (0.32.1-1) unstable; urgency=medium
|
|
|
|
fix: a VPN user downloads the own OpenVPN client profile through /account, with the current password and code.
|
|
|
|
* POST /account/profile answers the user's OpenVPN client profile; it
|
|
needs the current password and, when enrolled, a code.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 16:00:00 +0100
|
|
|
|
vpn-router (0.32.0-1) unstable; urgency=medium
|
|
|
|
feature: the web service gives Apple VPN profiles that set up IKEv2 road-warrior access on macOS, iOS and iPadOS.
|
|
|
|
* POST /users/<name>/apple-profile and POST /account/apple-profile answer
|
|
an unsigned .mobileconfig with the P2S CA and the root CA, the user's
|
|
certificate and key as a PKCS#12 encrypted with the password of the
|
|
request, and an IKEv2 VPN to wan.local_fqdn with EAP-TLS and the
|
|
proposals of the road-warrior connection.
|
|
* A user's own profile needs the current password and, when enrolled, a
|
|
code.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 14:00:00 +0100
|
|
|
|
vpn-router (0.31.3-1) unstable; urgency=medium
|
|
|
|
fix: WireGuard clients may use the router's DNS resolver, which runs while WireGuard does, and /remote-access names its addresses for their configuration.
|
|
|
|
* The firewall opens port 53 of the remote access clients' resolver for
|
|
the WireGuard network, as it does for the IKEv2 and OpenVPN pools.
|
|
* The resolver runs while WireGuard is the only remote access enabled.
|
|
* GET /remote-access answers the resolver's addresses as
|
|
wireguard_server.dns.
|
|
* dns.listen may not share an interface with p2s.dns_listen while
|
|
WireGuard is enabled either.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 12:00:00 +0100
|
|
|
|
vpn-router (0.31.2-1) unstable; urgency=medium
|
|
|
|
fix: dnsmasq answers the remote access clients' DNS queries, so they no longer get the router's own host name with all its addresses from systemd-resolved.
|
|
|
|
* vpn-router-resolver.service runs dnsmasq on the addresses of
|
|
p2s.dns_listen, forwarding to systemd-resolved's stub on 127.0.0.53;
|
|
names without a dot are not forwarded. The package depends on
|
|
dnsmasq-base.
|
|
* systemd-resolved keeps its loopback stubs only; setup removes the
|
|
drop-in that made it listen for the clients.
|
|
* /logs shows the journal of vpn-router-resolver, vpn-router-webdav and
|
|
pdns.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 11:00:00 +0100
|
|
|
|
vpn-router (0.31.1-1) unstable; urgency=medium
|
|
|
|
fix: the remote access clients' resolver answers on the internal address by default, chosen by p2s.dns_listen, so the name server can take port 53 of the external addresses.
|
|
|
|
* The new setting p2s.dns_listen chooses the addresses of the resolver the
|
|
road-warrior and OpenVPN clients are given: internal, the default,
|
|
external or both. The firewall opens port 53 for the client pools on
|
|
those addresses only.
|
|
* dns.listen is refused only when it shares an interface with
|
|
p2s.dns_listen while IKEv2 or OpenVPN is enabled.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 23:00:00 +0100
|
|
|
|
vpn-router (0.31.0-1) unstable; urgency=medium
|
|
|
|
feature: Caddy serves static web sites from folders on the router, defined in their own database, with files uploaded through the web service or WebDAV, and an optional PowerDNS name server answers for a zone of the sites.
|
|
|
|
* The new database vpn-router-sites holds the web sites: host names,
|
|
port, interfaces, TLS (none, Let's Encrypt, an issuing CA or a
|
|
certificate and key), index file, single-page fallback and the group
|
|
whose members change the files. sites.enabled serves them from
|
|
/var/lib/vpn-router/sites/<name>; setup writes their blocks into the
|
|
Caddyfile and opens their ports, and Caddy also runs without HTTPS of
|
|
the router while a site is served.
|
|
* vpn-router-site lists, shows, adds, changes and removes the sites, and
|
|
bash completes it.
|
|
* /sites manages the sites and the settings of the sites section, and
|
|
under /sites/<name>/files/ lists, downloads, uploads, extracts zip
|
|
archives into, creates, renames and removes the files of a site, up to
|
|
sites.upload_max_mb; members of the site's editors group may use its
|
|
files.
|
|
* sites.webdav runs rclone's WebDAV server of the sites' folders behind
|
|
Caddy on sites.webdav_port, signing users in with the directory and
|
|
showing each the sites it may change.
|
|
* dns.enabled runs PowerDNS with its PostgreSQL backend in the new
|
|
database vpn-router-dns for dns.zone on the addresses of dns.listen:
|
|
SOA, NS, the A and AAAA records of dns.addresses for the zone, the
|
|
name server and the sites' host names in the zone, and manual records
|
|
added with /dns.
|
|
* rclone and PowerDNS are installed from the Ubuntu archive by
|
|
vpn-router-install@<feature>.service when their feature is on.
|
|
* Backups hold the sites' folders and the dumps of both databases; a
|
|
restore puts them back. Purge removes the databases, their roles and
|
|
password files, and the settings of PowerDNS.
|
|
* Renaming a group renames it in the sites; a group a site has cannot be
|
|
removed.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 21:00:00 +0100
|
|
|
|
vpn-router (0.30.0-1) unstable; urgency=medium
|
|
|
|
feature: the web service serves the last lines of the journal of the router's units and of the log files web.log_files lists, at /logs.
|
|
|
|
* GET /logs lists the units whose journal and the files whose lines it
|
|
serves; GET /logs/journal?unit=&lines= and /logs/file?path=&lines=
|
|
answer the last lines, 200 by default and at most 1000, a file read
|
|
from its last MiB. Units and files outside the lists are refused.
|
|
* The new setting web.log_files lists the absolute paths of the log
|
|
files, at most 32.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 19:00:00 +0100
|
|
|
|
vpn-router (0.29.0-1) unstable; urgency=medium
|
|
|
|
feature: vpn-config-edit set and remove take --restart, which applies the change with vpn-router-setup and waits for it.
|
|
|
|
* vpn-config-edit set --restart and remove --restart restart
|
|
vpn-router-setup after writing the configuration and wait until it has
|
|
applied the change; a failed run exits with status 1 and points to its
|
|
journal. Bash completes --restart.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 17:00:00 +0100
|
|
|
|
vpn-router (0.28.0-1) unstable; urgency=medium
|
|
|
|
feature: bash completes the vpn-* commands, their options and the names they take.
|
|
|
|
* Bash completes the commands, options and arguments of vpn-router-user,
|
|
vpn-router-group, vpn-router-token, vpn-config-edit, vpn-router-backup,
|
|
vpn-router-ca and vpn-router-caddy, from
|
|
/usr/share/bash-completion/completions; for root also the users,
|
|
groups, issuing CAs, templates, settings and site-to-site connections.
|
|
* The package recommends bash-completion.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 16:00:00 +0100
|
|
|
|
vpn-router (0.27.0-1) unstable; urgency=medium
|
|
|
|
feature: the web service is an OpenID Provider, which signs the directory's users in to other systems, the clients being service accounts with redirect URIs.
|
|
|
|
* oidc.enabled turns on the OpenID Provider at the issuer
|
|
https://<wan.local_fqdn>:<https.web_port>, with discovery, JWKS,
|
|
authorize, token, userinfo and RP-initiated logout under /oidc/,
|
|
answered only through Caddy. The authorization code flow with PKCE
|
|
S256 and refresh tokens are offered; ID tokens are RS256, signed with
|
|
/etc/vpn-router/oidc.key, which the web service makes on its first run.
|
|
* Users sign in on the provider's page with the password and the TOTP
|
|
code or with a passkey; the session lasts 8 hours. The scopes openid,
|
|
profile, email and groups give sub (the entry's entryUUID), the names,
|
|
the e-mail address and the user's groups.
|
|
* A service account with redirect URIs is a client: its name is the
|
|
client ID and its password the secret. Its redirect URIs,
|
|
post-logout redirect URIs and allowed groups are set with
|
|
vpn-router-user add/update --redirect-uri, --post-logout-redirect-uri
|
|
and --allowed-group, and in /service-accounts as redirect_uris,
|
|
post_logout_redirect_uris and allowed_groups; GET /service-accounts
|
|
also answers the issuer. vpn-router-user list shows them.
|
|
* Changing a user's password, disabling, unlocking or removing the user
|
|
also revokes the user's codes, tokens and sessions of the provider.
|
|
* Renaming a group renames it in the clients that allow it, and a group
|
|
a client allows cannot be removed.
|
|
* The package depends on python3-oauthlib and python3-jwt.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 14:00:00 +0100
|
|
|
|
vpn-router (0.26.2-1) unstable; urgency=medium
|
|
|
|
fix: a service account may be named by a GUID in lowercase, as the Router Manager proposes for a new one.
|
|
|
|
* vpn-router-user add --service and POST /service-accounts take a GUID
|
|
in lowercase as the name, besides a user name; users and groups keep
|
|
the rules of user names.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 10:00:00 +0100
|
|
|
|
vpn-router (0.26.1-1) unstable; urgency=medium
|
|
|
|
fix: the package installs vpnrouter_passkeys, without which the web service and vpn-router-user do not start.
|
|
|
|
* /usr/lib/vpn-router/vpnrouter_passkeys.py is part of the package.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 08:45:00 +0100
|
|
|
|
vpn-router (0.26.0-1) unstable; urgency=medium
|
|
|
|
feature: users sign in to the Router Manager with passkeys, and console login needs a TOTP token, so a user without one is refused the shell, SSH and sudo.
|
|
|
|
* Console login is switched on only for a user enrolled for TOTP. A user
|
|
whose console login is on without a token is refused POST /shell, the
|
|
shell's WebSocket, SSH and sudo; an open shell ends within a minute of
|
|
the token's removal or of console login being switched off, and
|
|
removing the token ends the sessions of the user's own POSIX account.
|
|
* POST /auth/passkey and /auth/passkey/complete sign a user in with a
|
|
passkey of wan.local_fqdn, giving the tokens of /auth; POST /auth also
|
|
answers the user's name.
|
|
* POST, PUT /account/passkeys and DELETE /account/passkeys/<id> add, with
|
|
the current password and code, and remove the user's passkeys, at most
|
|
10, kept in the new attribute vpnRouterPasskey; DELETE
|
|
/users/<name>/passkeys and vpn-router-user passkeys-remove remove all
|
|
passkeys of a user.
|
|
* Users have passkeys, [{"id", "label", "created"}], in /users and
|
|
/account; vpn-router-user list shows their number and a console login
|
|
refused for want of a TOTP token.
|
|
* The package depends on python3-fido2.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 03 Nov 2026 08:00:00 +0100
|
|
|
|
vpn-router (0.25.4-1) unstable; urgency=medium
|
|
|
|
fix: a shell opens without the password and code again while the user's last use of a shell is within web.shell_auth_timeout minutes.
|
|
|
|
* New setting web.shell_auth_timeout, 15 minutes by default, 0 to 1440:
|
|
POST /shell without a password gives a ticket while the user's last
|
|
sign-in of POST /shell or keystroke in a shell is within it, and a
|
|
null ticket otherwise; 0 asks for the password and code every time.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 03 Nov 2026 06:00:00 +0100
|
|
|
|
vpn-router (0.25.3-1) unstable; urgency=medium
|
|
|
|
fix: /config gives the state of caddy.service with the installed Caddy, for the Router Manager's Web page.
|
|
|
|
* caddy of /config is {"version", "source", "service"}.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 03 Nov 2026 05:00:00 +0100
|
|
|
|
vpn-router (0.25.2-1) unstable; urgency=medium
|
|
|
|
fix: wireguard.address must be the router's own address in its network, not the network or broadcast address, from which the peers' addresses are told apart.
|
|
|
|
* A wireguard.address that is the network or the broadcast address of a
|
|
network larger than /31, such as 192.168.232.0/24, is refused with the
|
|
first address of the network as the example.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 03 Nov 2026 02:30:00 +0100
|
|
|
|
vpn-router (0.25.1-1) unstable; urgency=medium
|
|
|
|
fix: /remote-access gives the router's WireGuard public key, endpoint and allowed IPs, which a peer's configuration needs.
|
|
|
|
* GET /remote-access answers wireguard_server: {"public_key",
|
|
"endpoint", "allowed_ips"}.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 03 Nov 2026 01:30:00 +0100
|
|
|
|
vpn-router (0.25.0-1) unstable; urgency=medium
|
|
|
|
feature: a VPN user has WireGuard peers, each a device with its public key and IPs, kept in the directory and written into wg0.conf by setup.
|
|
|
|
* PUT /users/<name> takes wireguard_peers, [{"public_key", "ips"}],
|
|
which replaces the user's peers; keys are unique and IPs may not
|
|
overlap another peer's or cover the router's WireGuard address.
|
|
* GET /users answers each user's wireguard_peers and the WireGuard
|
|
endpoint's enabled and address.
|
|
* Setup writes a [Peer] section into wg0.conf for each peer of a user
|
|
who is not disabled, in a marked block, and keeps the peers added by
|
|
hand; changing a user's peers, disabling, enabling or removing a user
|
|
with peers applies at once.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 03 Nov 2026 00:00:00 +0100
|
|
|
|
vpn-router (0.24.1-1) unstable; urgency=medium
|
|
|
|
fix: the status gives the number of connected OpenVPN clients at most 5 seconds old instead of up to a minute.
|
|
|
|
* The OpenVPN server writes its status file every 5 seconds, so a
|
|
refresh of the status shows clients that connected or left since.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 23:30:00 +0100
|
|
|
|
vpn-router (0.24.0-1) unstable; urgency=medium
|
|
|
|
feature: /remote-access of the web service shows and changes the settings of IKEv2 road-warrior, OpenVPN and WireGuard access and whether each runs, for the Router Manager's Remote access page.
|
|
|
|
* GET /remote-access answers the p2s, openvpn and wireguard sections,
|
|
which of them setup runs, and wan.local_fqdn; PUT
|
|
/remote-access/<system> changes one section and restarts setup.
|
|
* p2s.enabled and openvpn.enabled need their address_pool, and
|
|
wireguard.enabled its address.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 23:00:00 +0100
|
|
|
|
vpn-router (0.23.2-1) unstable; urgency=medium
|
|
|
|
fix: the shell of a user's own POSIX account opens on the first setup that sets up console login, and the journal records each refused shell with the reason.
|
|
|
|
* Setup restarts vpn-router-web when it adds ldap to the name service
|
|
switch, so the web service finds the POSIX accounts of the directory.
|
|
* The journal of vpn-router-web records each refused ticket and shell,
|
|
with the user, the address and the reason.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 22:00:00 +0100
|
|
|
|
vpn-router (0.23.1-1) unstable; urgency=medium
|
|
|
|
fix: the shell runs as the console account of each member of admins, a local account or the user's own POSIX account in the directory, which also signs in with SSH and sudo, instead of one web.shell_user.
|
|
|
|
* vpn-router-user console <name> --posix | --account LOCAL | --off, and
|
|
PUT /users/<name>/console with a token of vpn-router-token, switch a
|
|
member of admins' console login; leaving admins switches it off.
|
|
* The user's own POSIX account is served by nslcd from the directory,
|
|
with a uid from 20000, the group vpn-router-console, which may use
|
|
sudo, and a home created at the first login; its password is the
|
|
directory password, followed by the code once enrolled for TOTP.
|
|
* ssh.ldap_login (false) lets sshd accept that password.
|
|
* POST /shell and the shell need the user's console login; web.shell_user
|
|
is gone.
|
|
* Depends on nslcd, libnss-ldapd, libpam-ldapd and sudo.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 21:00:00 +0100
|
|
|
|
vpn-router (0.23.0-1) unstable; urgency=medium
|
|
|
|
feature: web.shell lets /shell of the web service open a login shell of web.shell_user over a WebSocket for the Router Manager's Shell page, after the user signs in again.
|
|
|
|
* web.shell (false), web.shell_user and web.shell_idle_minutes (15).
|
|
* POST /shell takes the password and the TOTP code and answers a
|
|
one-time ticket; GET /shell with it is a WebSocket carrying the
|
|
terminal, closed after web.shell_idle_minutes without a keystroke.
|
|
* The journal of vpn-router-web records each shell opened and ended.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 20:00:00 +0100
|
|
|
|
vpn-router (0.22.1-1) unstable; urgency=medium
|
|
|
|
fix: the status gives the number of site-to-site connections set up and established, not each connection by name.
|
|
|
|
* site_to_site of the status document is {"connections", "established"},
|
|
and the status page shows "Site to site: N of M established".
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 18:00:00 +0100
|
|
|
|
vpn-router (0.22.0-1) unstable; urgency=medium
|
|
|
|
feature: pki.extended_key_usages adds custom extended key usages by their OIDs, which templates give by name, and a template's policies put certificate policy OIDs into its certificates.
|
|
|
|
* pki.extended_key_usages maps a name to the OID of a custom extended
|
|
key usage; a template's extended_key_usage takes the built-in and the
|
|
custom names.
|
|
* The template option policies lists certificate policy OIDs, written
|
|
into a Certificate Policies extension.
|
|
* GET /ca answers extended_key_usages, each usage with its OID and
|
|
whether it is built in.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 14:00:00 +0100
|
|
|
|
vpn-router (0.21.5-1) unstable; urgency=medium
|
|
|
|
fix: /status/full of the status web service gives an authenticated client the whole status, whatever web.status_content says.
|
|
|
|
* /status/full takes the token of /config and answers the status
|
|
document as web.status_content full shows it.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 12:00:00 +0100
|
|
|
|
vpn-router (0.21.4-1) unstable; urgency=medium
|
|
|
|
fix: vpn-router-setup, vpn-router-ca and /ca read a CA's key and CRL from the directory each as itself, instead of failing on a CA with a CRL.
|
|
|
|
* A CA's CRL was read as its key and its key as its CRL, so every
|
|
operation on a CA with a CRL failed with "Could not deserialize key
|
|
data".
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 02 Nov 2026 10:00:00 +0100
|
|
|
|
vpn-router (0.21.3-1) unstable; urgency=medium
|
|
|
|
fix: the PKI is kept in ou=pki of the router's directory instead of files under /etc/vpn-router/pki, and the router's site-to-site certificate names only the identities its connections present, and /ca/bundle gives the certificate bundle of a CA.
|
|
|
|
* The CAs with their certificates, keys, CSRs and CRLs, and every
|
|
certificate issued with its revocation, are entries of the
|
|
package's schema in ou=pki; a user's certificate is also the
|
|
userCertificate of the user's entry, and only root reads a key.
|
|
* slapcat puts the PKI into every backup with the users.
|
|
* A root CA supplied as /etc/vpn-router/pki/root/cert.pem and key.pem
|
|
before the first setup is imported into the directory, and the files
|
|
are removed; vpn-router-ca root import-cert is gone.
|
|
* Setup provisions the directory before the configuration; without it,
|
|
the PKI and its files are left as they are.
|
|
* The router's site-to-site certificate names wan.local_fqdn and the
|
|
public or internal address a connection with auth certificate uses
|
|
as its identity, not every address of the router, and is issued
|
|
again when those names change.
|
|
* GET /ca/bundle/<name> of the status web service answers the PEM
|
|
certificates a client trusts a CA with: the root alone, or an issuing
|
|
CA followed by the root.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 01 Nov 2026 10:00:00 +0100
|
|
|
|
vpn-router (0.21.2-1) unstable; urgency=medium
|
|
|
|
fix: pki.root_key_warning silences the warning of vpn-router-ca status and /ca about the root key on the router.
|
|
|
|
* pki.root_key_warning, true by default, set to false silences the
|
|
warning that the root key is on the router.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 31 Oct 2026 10:00:00 +0100
|
|
|
|
vpn-router (0.21.1-1) unstable; urgency=medium
|
|
|
|
fix: vpn-router-ca status and /ca warn about a CRL the router signs only once vpn-router-pki.timer has not renewed it in time.
|
|
|
|
* A CRL whose CA key is on the router is reported once past half of its
|
|
validity, when the timer should have signed it again; a root CRL
|
|
signed offline is still reported 30 days before it expires.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 30 Oct 2026 10:00:00 +0100
|
|
|
|
vpn-router (0.21.0-1) unstable; urgency=medium
|
|
|
|
feature: the router has a two-level CA with an optional offline root, issuing CAs for P2S, site-to-site and general use, templates, published certificates and CRLs and an ACME server, site-to-site connections authenticate with certificates, and setup installs Caddy from Ubuntu or Caddy's repository.
|
|
|
|
* The root CA signs the issuing CAs p2s, which issues the router's VPN
|
|
server certificate and the users' certificates, s2s, which issues
|
|
the site-to-site certificates, and the general-purpose CAs of
|
|
pki.issuing_cas; road-warrior and OpenVPN accept certificates of p2s
|
|
only.
|
|
* The pki section of vpn-router.json sets the names, lifetimes and
|
|
key type of the CAs, the validity of the CRLs, where certificates
|
|
and CRLs are published, the general-purpose CAs and the certificate
|
|
templates; p2s.ca_name and the vpn-router/p2s_ca_name question are
|
|
replaced by pki.root_name and vpn-router/pki_root_name.
|
|
* Without the root key on the router, new issuing CAs wait with a CSR
|
|
for an offline signature; vpn-router-ca exports, removes and imports
|
|
the root key, imports the signed certificates and a root CRL, issues
|
|
certificates from a CSR or into a PFX file, lists and revokes them.
|
|
* Certificates name their issuer's certificate and CRL at the
|
|
endpoints of pki.publish: the status port over HTTP, or Caddy on port
|
|
80, on the HTTPS status port or on port 443; the CRLs are signed
|
|
again at every revocation and by vpn-router-pki.timer.
|
|
* A general-purpose CA with acme backs an ACME server of Caddy.
|
|
* The router renews its own certificates before they expire.
|
|
* A site-to-site connection with auth certificate authenticates with
|
|
the router's site-to-site certificate and trusts the s2s CA or the
|
|
connection's remote_ca.
|
|
* /ca of the status web service shows and changes the PKI; /pki/
|
|
serves the published certificates and CRLs; /config shows the
|
|
installed Caddy and its source; request bodies may be 64 KiB.
|
|
* vpn-router no longer depends on caddy: vpn-router-setup installs it
|
|
from https.caddy_source, the Ubuntu archive or Caddy's repository,
|
|
and vpn-router-caddy use-upstream switches an installed router to
|
|
Caddy's repository for good.
|
|
* The package depends on python3-cryptography instead of openssl, and
|
|
simple-ca is gone.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Thu, 29 Oct 2026 10:00:00 +0100
|
|
|
|
vpn-router (0.20.0-1) unstable; urgency=medium
|
|
|
|
feature: the router makes scheduled backups to a local folder, copied to the cloud with rclone, or to a Proxmox Backup Server, and vpn-router-backup restores them.
|
|
|
|
* The backup section of vpn-router.json switches on backups and sets
|
|
the schedule (hourly, daily or weekly), the target (local or pbs),
|
|
the folder, the retention of local archives, whether the metrics
|
|
database is included, the rclone remote and mode, and the Proxmox
|
|
Backup Server repository, token secret, fingerprint, namespace and
|
|
key file.
|
|
* A backup holds /etc/vpn-router, /etc/wireguard, the ufw rules, the
|
|
Router Manager's settings, PSK files outside /etc/vpn-router, the
|
|
user directory as slapcat writes it and, optionally, the database as
|
|
pg_dump writes it, copied while the configuration and the users are
|
|
locked.
|
|
* Local backups are tar archives compressed with zstd. Archives the
|
|
retention settings no longer keep are deleted by the rules of Proxmox
|
|
Backup Server's prune, and rclone can sync or copy the archives to a
|
|
remote of /etc/vpn-router/rclone.conf.
|
|
* Backups to a Proxmox Backup Server are made with
|
|
proxmox-backup-client-static, which the package suggests; the server
|
|
keeps them.
|
|
* vpn-router-backup runs a backup, lists the backups and restores a
|
|
local archive or a snapshot; vpn-router-backup.timer runs it on the
|
|
schedule.
|
|
* /backup of the status web service shows and changes the backup
|
|
settings, shows the last run, the local archives and the next run,
|
|
and starts a backup.
|
|
* The package depends on zstd and suggests rclone and
|
|
proxmox-backup-client-static.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Wed, 28 Oct 2026 10:00:00 +0100
|
|
|
|
vpn-router (0.19.1-3) unstable; urgency=medium
|
|
|
|
update: ADR-24 names Ubuntu's apt-daily timer, not a cron job, as what updates the package lists.
|
|
|
|
* ADR-24 says that Ubuntu's apt-daily timer updates the package lists
|
|
twice a day, and that apt-daily or unattended-upgrades may hold the
|
|
dpkg lock the upgrade waits for.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 10:00:00 +0100
|
|
|
|
vpn-router (0.19.1-2) unstable; urgency=medium
|
|
|
|
update: ADR-24 says that the Router Manager checks for updates on demand.
|
|
|
|
* ADR-24 describes Check update of the Router Manager, which updates
|
|
apt's package lists in the transient unit vpn-router-manager-check.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Tue, 27 Oct 2026 09:00:00 +0100
|
|
|
|
vpn-router (0.19.1-1) unstable; urgency=medium
|
|
|
|
fix: /metrics/history gives the availability of each site-to-site connection as the percentage of time it was up in slots of the view.
|
|
|
|
* site_to_site_up of /metrics/history divides the view into slots of 5
|
|
minutes for an hour, 1 hour for a day, 1 day for a month and 1 month
|
|
for a year, and gives for each slot and connection the percentage of
|
|
the samples in which the connection was up.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 21:00:00 +0100
|
|
|
|
vpn-router (0.19.0-1) unstable; urgency=medium
|
|
|
|
feature: service accounts have a display name and a description, which the router sets for its internal ones.
|
|
|
|
* vpnRouterAccount of the package's schema also takes displayName and
|
|
description; vpn-router-setup updates the schema of an existing
|
|
directory.
|
|
* /service-accounts shows display_name and description, takes them when
|
|
adding a service account and changes them with PUT; "" removes one.
|
|
/users shows them as null.
|
|
* vpn-router-user add --service and update take --display-name and
|
|
--description.
|
|
* vpn-router-setup gives the metrics service's internal account the
|
|
display name Metrics and its description, and sets them again when
|
|
they differ.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 20:00:00 +0100
|
|
|
|
vpn-router (0.18.3-1) unstable; urgency=medium
|
|
|
|
fix: internal service accounts are the router's own, of which the metrics service's is the one at present, and the documentation says what a service account is.
|
|
|
|
* /service-accounts, /groups and the internal field of the answers
|
|
take every internal service account, the accounts the router creates
|
|
and manages for its own services, instead of only the metrics
|
|
service's; the 403 answers say that the router manages them.
|
|
* The README, the ADR and the users module describe a service account
|
|
as the account another system, such as an OpenTelemetry Collector
|
|
reading /metrics, signs in with, and the internal ones as managed by
|
|
the router.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 19:00:00 +0100
|
|
|
|
vpn-router (0.18.2-1) unstable; urgency=medium
|
|
|
|
fix: service accounts are managed at /service-accounts, not /users, and the internal one of the metrics service is only listed.
|
|
|
|
* /service-accounts, for members of admins and admin tokens, lists the
|
|
service accounts, adds one with a password and an optional e-mail
|
|
address, changes the e-mail address, sets the password, disables,
|
|
enables, unlocks and removes them.
|
|
* /users no longer lists service accounts or takes "service" on POST,
|
|
and answers 404 to a request naming one.
|
|
* /service-accounts answers 403 to every request but the list on the
|
|
account metrics.service_account names while metrics are enabled, and
|
|
/groups to putting it in or taking it out of a group;
|
|
vpn-router-setup and root's vpn-router-user still change it.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 18:00:00 +0100
|
|
|
|
vpn-router (0.18.1-1) unstable; urgency=medium
|
|
|
|
fix: vpn-router-setup owns only the creation of the metrics service's account, which is marked internal, and administrators add service accounts with vpn-router-user add --service and /users.
|
|
|
|
* POST /users takes "service": true and adds a service account, which
|
|
cannot sign in to /auth; vpn-router-user add takes --service.
|
|
* The users of /users and vpn-router-user have internal, true for the
|
|
account metrics.service_account names while metrics are enabled;
|
|
vpn-router-user list shows its kind as internal.
|
|
* PUT /users/<name>/password refuses the internal service account,
|
|
whose password vpn-router-setup keeps.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 17:00:00 +0100
|
|
|
|
vpn-router (0.18.0-2) unstable; urgency=medium
|
|
|
|
update: release.py tags a Debian revision other than 1 as x.y.z-n.
|
|
|
|
* release.py tags the newest entry x.y.z for the Debian revision 1 and
|
|
x.y.z-n for a later revision, so a packaging change gets a release
|
|
of its own.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Mon, 26 Oct 2026 14:00:00 +0100
|
|
|
|
vpn-router (0.18.0-1) unstable; urgency=medium
|
|
|
|
feature: site_to_site holds any number of named site-to-site connections, which /site-to-site lists, adds, changes and removes.
|
|
|
|
* site_to_site maps a connection name to addrs, id, cidrs, local_cidrs,
|
|
local_id_mode, psk and psk_file; it replaces remote and
|
|
wan.local_id_mode, and a configuration with them is refused.
|
|
* The install answers fill the connection remote-site; the local subnets
|
|
fill both its local_cidrs and local.cidrs.
|
|
* Every ready connection is written to
|
|
/etc/swanctl/conf.d/site-to-site.conf as the swanctl connection and
|
|
child of its name with the secret ike-psk-<name>; remote-site.conf is
|
|
no longer written.
|
|
* Traffic from each connection's local_cidrs to its cidrs is not
|
|
masqueraded.
|
|
* /site-to-site, for members of admins and admin tokens, lists the
|
|
connections without their keys, adds, changes and removes them, and
|
|
restarts vpn-router-setup to apply the change.
|
|
* vpn-config-edit sets site_to_site.NAME.option, creating the
|
|
connection, and removes site_to_site.NAME; it and the web service
|
|
write vpn-router.json under one lock.
|
|
* The status shows site_to_site.connections, whether each connection is
|
|
established.
|
|
* The metrics service keeps, per site-to-site connection, whether it is
|
|
up, the bytes and packets per second received and sent, and the
|
|
seconds its IKE SA has been up, in metrics_site_to_site and its
|
|
summaries; /metrics/history has them in site_to_site of each point.
|
|
* /metrics serves vpn_router_site_to_site_up,
|
|
vpn_router_site_to_site_uptime_seconds,
|
|
vpn_router_site_to_site_io_bytes_per_second and
|
|
vpn_router_site_to_site_packets_per_second by connection, and the
|
|
OTLP push the vpn_router.site_to_site gauges; vpn_router_clients and
|
|
metrics_vpn no longer have the kind site_to_site.
|
|
* /config shows each connection in network.site_to_site, and no psk at
|
|
any level of the configuration.
|
|
* Removing the package terminates every site-to-site connection; purging
|
|
removes site-to-site.conf.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 23:00:00 +0100
|
|
|
|
vpn-router (0.17.0-1) unstable; urgency=medium
|
|
|
|
feature: /config shows the router's PostgreSQL clusters and their settings, and /postgresql their databases with their sizes.
|
|
|
|
* /config has a postgresql section: each cluster of pg_lsclusters with
|
|
its version, name, port, status and data directory, and the main
|
|
settings of each online cluster.
|
|
* /postgresql, protected like /config, lists the databases of each
|
|
online cluster with owner, encoding and size, and the total size.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 21:00:00 +0200
|
|
|
|
vpn-router (0.16.0-1) unstable; urgency=medium
|
|
|
|
feature: the router keeps its metrics in PostgreSQL, serves them for an OpenTelemetry Collector and pushes them over OTLP.
|
|
|
|
* vpn-router-metrics takes a sample every minute: CPU, memory, free
|
|
space of /, bytes per second on the external and the internal
|
|
interface, the load averages, and the VPN clients of each enabled
|
|
system.
|
|
* The samples are kept in metrics_system, metrics_network and
|
|
metrics_vpn, and summarized hourly, daily, monthly and yearly in
|
|
their _hourly, _daily, _monthly and _yearly tables; once a day the
|
|
rows older than metrics.keep_details, keep_hourly, keep_daily,
|
|
keep_monthly and keep_yearly are deleted.
|
|
* /metrics serves the last sample in the Prometheus format on the
|
|
interfaces metrics.listen names (internal by default) at
|
|
metrics.port, and over HTTPS by Caddy at metrics.https_port, with
|
|
HTTP Basic authentication of the service account
|
|
metrics.service_account names (metrics by default).
|
|
* metrics.otlp_endpoint pushes every sample as OTLP/HTTP JSON, with
|
|
metrics.otlp_username and metrics.otlp_password.
|
|
* /metrics/history of the web service answers the hour, day, month
|
|
and year views for the Router Manager.
|
|
* vpn-router-setup adds and keeps that service account, which cannot
|
|
sign in to /auth, with a random password in
|
|
/etc/vpn-router/metrics.secret, set anew when the file is missing.
|
|
* Depends on python3-psutil and python3-prometheus-client.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 19:00:00 +0200
|
|
|
|
vpn-router (0.15.0-1) unstable; urgency=medium
|
|
|
|
feature: vpn-config-edit shows and changes the router's configuration.
|
|
|
|
* vpn-config-edit show prints /etc/vpn-router/vpn-router.json as
|
|
indented JSON.
|
|
* vpn-config-edit set SECTION.OPTION VALUE converts the value to the
|
|
setting's type, checks the whole configuration as vpn-router-setup
|
|
does, writes the file indented with mode 0600, and reminds that
|
|
vpn-router-setup applies it.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 18:00:00 +0200
|
|
|
|
vpn-router (0.14.1-1) unstable; urgency=medium
|
|
|
|
fix: web.status_content is basic by default.
|
|
|
|
* Without web.status_content, or with a value that is not allowed, /
|
|
and /status show only the overall status, the time and the Client
|
|
IP; set it to standard or full to show more.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 17:00:00 +0200
|
|
|
|
vpn-router (0.14.0-1) unstable; urgency=medium
|
|
|
|
feature: the status page shows the Client IP, and web.status_content sets how much it shows.
|
|
|
|
* / and /status show the Client IP, the address the request came from:
|
|
the last X-Forwarded-For entry for a request from a trusted proxy, so
|
|
behind Caddy or the Router Manager the browser's; /status has it as
|
|
client_ip.
|
|
* web.status_content sets what / and /status show: basic the overall
|
|
status, the time and the Client IP; standard also the package
|
|
versions and the number of active and failed services; full, the
|
|
default, everything as before. /status names it in content.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 16:00:00 +0200
|
|
|
|
vpn-router (0.13.0-1) unstable; urgency=medium
|
|
|
|
feature: Caddy serves the status page and the Router Manager over HTTPS with a certificate from Let's Encrypt.
|
|
|
|
* The package depends on caddy. While https.enabled is true, the
|
|
default, and wan.local_fqdn is set, vpn-router-setup writes
|
|
/etc/caddy/vpn-router.Caddyfile and runs Caddy, which serves the
|
|
status page on https.web_port (7444) and the Router Manager, when it
|
|
is installed, on https.manager_port (7443) for wan.local_fqdn, and
|
|
obtains the certificate from Let's Encrypt with the HTTP challenge.
|
|
* The package's drop-in for caddy.service makes Caddy read that file
|
|
and keeps it from starting before the file exists. The file belongs
|
|
to root and the group caddy, which Caddy runs as, with mode 0640.
|
|
* The firewall opens port 80 on the external interface and the HTTPS
|
|
ports on both interfaces while HTTPS is on.
|
|
* The web service also listens on 127.0.0.1, where Caddy calls it.
|
|
* docker.exposed_ports may not take port 80 or the HTTPS ports while
|
|
HTTPS is on.
|
|
* Removing the package stops and disables caddy; purging it removes
|
|
/etc/caddy/vpn-router.Caddyfile.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 15:00:00 +0200
|
|
|
|
vpn-router (0.12.3-1) unstable; urgency=medium
|
|
|
|
fix: the web service listens on the internal address, the external address or both.
|
|
|
|
* web.listen in vpn-router.json sets the interfaces the web service
|
|
listens on: internal, external or both, the default. It is read
|
|
every 30 seconds, so a change takes effect without running setup,
|
|
at the latest when vpn-router-web restarts.
|
|
* The firewall opens the ports of the web service and of the Router
|
|
Manager on the internal and the external interface.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 13:00:00 +0200
|
|
|
|
vpn-router (0.12.2-1) unstable; urgency=medium
|
|
|
|
fix: the web service manages users also when it started before setup.
|
|
|
|
* vpn-router-web creates /run/vpn-router when it starts, so the user
|
|
operations take their lock there; started before vpn-router-setup had
|
|
made the directory, they failed with "Read-only file system".
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 12:00:00 +0200
|
|
|
|
vpn-router (0.12.1-1) unstable; urgency=medium
|
|
|
|
fix: the status page shows whether the Router Manager runs.
|
|
|
|
* When vpn-router-manager is installed, the services show the state of
|
|
vpn-router-manager, and status is degraded while it is not active.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 11:00:00 +0200
|
|
|
|
vpn-router (0.12.0-1) unstable; urgency=medium
|
|
|
|
feature: every user manages their own account through /account.
|
|
|
|
* /account serves the signed-in user, admin or not: GET shows the user
|
|
and whether they are a member of admins; PUT /account/password sets
|
|
the password and POST and PUT /account/otp enrol or replace the TOTP
|
|
enrolment, given the current password and, when enrolled, a current
|
|
code. A wrong one is 403 and counts as a failed login. Tokens of
|
|
vpn-router-token get 403 there.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 10:00:00 +0200
|
|
|
|
vpn-router (0.11.0-1) unstable; urgency=medium
|
|
|
|
feature: the status page shows the Router Manager's version.
|
|
|
|
* / and /status show the installed version of vpn-router-manager, as
|
|
manager_version in JSON, or that it is not installed.
|
|
* The services show the state of each PostgreSQL cluster, as
|
|
postgresql@<version>-<cluster>, or postgresql: no cluster without one.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 09:00:00 +0200
|
|
|
|
vpn-router (0.10.0-1) unstable; urgency=medium
|
|
|
|
feature: Manager-only accounts, and the Router Manager's first administrator.
|
|
|
|
* vpn-router-user add without the person options, and POST /users without
|
|
them, add a Manager-only account: a name and a password, no names, no
|
|
e-mail address and no certificate, so no VPN access. Giving only some of
|
|
the three is refused. The answers show the kind as manager_only, list
|
|
shows a KIND column, and update refuses a Manager-only account.
|
|
* vpn-router-setup creates the administrator the Router Manager's package
|
|
leaves in /etc/vpn-router-manager/admin.json as a Manager-only account in
|
|
the group admins, which it creates when missing, and removes the file.
|
|
* The directory has the package's own schema, with the auxiliary class
|
|
vpnRouterAccount and the attribute vpnRouterScope. A Manager-only account
|
|
can have an e-mail address: add --email, update --email ('' removes it),
|
|
and email in POST and PUT /users.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 08:00:00 +0200
|
|
|
|
vpn-router (0.9.2-1) unstable; urgency=medium
|
|
|
|
fix: the web service starts once libpq can be found.
|
|
|
|
* The web service unit waits, with wait-for-libpq, until libpq is in the
|
|
linker cache before it starts the service, for at most 5 minutes; the
|
|
service imports psycopg at start again.
|
|
* The package starts the web service without waiting for it.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 06:00:00 +0200
|
|
|
|
vpn-router (0.9.1-1) unstable; urgency=medium
|
|
|
|
fix: the web service waits for the PostgreSQL driver instead of failing at start.
|
|
|
|
* The web service imports psycopg as the first step of its
|
|
initialization, retrying every 15 seconds and logging the failure while
|
|
libpq cannot be found yet during an installation.
|
|
* vpn-router-user and vpn-router-token load without psycopg; a command
|
|
that needs the token database then reports that the driver cannot be
|
|
loaded, as it reports every failure of that database.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 05:00:00 +0200
|
|
|
|
vpn-router (0.9.0-1) unstable; urgency=medium
|
|
|
|
feature: bootstrap diagnostics on port 17081 during the first setup.
|
|
|
|
* vpn-router-bootstrap serves, on port 17081, the setup state, the
|
|
services, the failed units, the addresses, cloud-init status and the end
|
|
of the logs of setup and the web service, as plain text.
|
|
* vpn-router-setup starts it, and the Router Manager's bootstrap on port
|
|
17080, until a run has succeeded, and opens both ports on the internal
|
|
interface; the first successful run writes
|
|
/var/lib/vpn-router/setup.done, closes the ports and stops them. A
|
|
failed run leaves them running.
|
|
* The web service no longer has a starting phase: it creates its key and
|
|
database, then listens.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 04:00:00 +0200
|
|
|
|
vpn-router (0.8.0-1) unstable; urgency=medium
|
|
|
|
feature: the web service creates its key and database itself and shows its starting phase.
|
|
|
|
* vpn-router-web makes its signing key and creates the refresh tokens'
|
|
database on its first run, retrying every 15 seconds until PostgreSQL
|
|
answers; vpn-router-setup no longer creates them.
|
|
* Until then / and /status show the web service's phase and its failure,
|
|
with the state, the step and the failure of the last run of
|
|
vpn-router-setup, and every page answers 503.
|
|
* vpn-router-setup records its state, current step and failure in
|
|
/run/vpn-router/setup.json.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 03:00:00 +0200
|
|
|
|
vpn-router (0.7.1-1) unstable; urgency=medium
|
|
|
|
fix: a failing user directory or token database no longer leaves the tunnels down.
|
|
|
|
* vpn-router-setup brings up strongSwan and WireGuard before it provisions
|
|
the user directory and the token database. A failure of either no
|
|
longer stops the other steps; setup reports it and fails at the end.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 02:00:00 +0200
|
|
|
|
vpn-router (0.7.0-1) unstable; urgency=medium
|
|
|
|
feature: users sign in to the web service, and only members of admins manage the router.
|
|
|
|
* POST /auth signs a user in with the password, and the TOTP code for an
|
|
enrolled user, and answers a 5 minute access token and an 8 hour refresh
|
|
token; /auth/refresh renews them and /auth/logout revokes the refresh
|
|
token.
|
|
* /config, /users and /groups take tokens of users in the group admins,
|
|
and tokens of the new vpn-router-token, which has an admin claim and a
|
|
chosen lifetime. Only these may change the group admins.
|
|
* The tokens are signed with /etc/vpn-router/web.key, which
|
|
vpn-router-setup makes on the router; web.jwt_secret is ignored.
|
|
* Five failed logins lock an account for 15 minutes, for OpenVPN and
|
|
/auth. vpn-router-user unlock and POST /users/<name>/unlock end the
|
|
lockout, and the users show locked.
|
|
* /auth takes at most 10 calls a minute per client address; for calls from
|
|
web.trusted_proxies the address is read from X-Forwarded-For.
|
|
* Users enrolled for TOTP log in to OpenVPN with the password followed by
|
|
the code.
|
|
* Refresh tokens are kept in PostgreSQL, in the database web.database
|
|
names or in the vpn-router database vpn-router-setup creates. The
|
|
package depends on postgresql and python3-psycopg.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sun, 25 Oct 2026 01:00:00 +0200
|
|
|
|
vpn-router (0.6.0-1) unstable; urgency=medium
|
|
|
|
feature: users can be enrolled for TOTP one-time passwords.
|
|
|
|
* vpn-router-user otp-new makes a TOTP secret and its otpauth URI,
|
|
otp-enrol stores the secret, read from standard input, given a code of
|
|
it, and otp-remove removes it. list and every answer show whether a user
|
|
is enrolled, as otp.
|
|
* The web service enrols with POST, PUT and DELETE /users/<name>/otp.
|
|
* The secret is kept in the user's entry with the OATH-LDAP schema of
|
|
slapd's otp module; only the user manager account may set it, and no
|
|
one can read it. Logins do not ask for the codes.
|
|
* The package depends on python3-pyotp.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 23:30:00 +0200
|
|
|
|
vpn-router (0.5.9-1) unstable; urgency=medium
|
|
|
|
fix: package upgrades no longer ask the configuration questions.
|
|
|
|
* The configuration questions are asked only on a fresh installation and
|
|
by dpkg-reconfigure.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 21:00:00 +0200
|
|
|
|
vpn-router (0.5.8-1) unstable; urgency=medium
|
|
|
|
fix: an upgrade keeps the configuration and asks nothing.
|
|
|
|
* postinst passes on only the debconf answers that were given. The
|
|
defaults of questions never asked, such as platform none, no longer
|
|
replace settings of vpn-router.json.
|
|
* Without an answer that changes it, the configuration ucf is given is
|
|
vpn-router.json byte for byte, so an upgrade has no conflict to ask
|
|
about; settings the file leaves out keep their defaults when it is read.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 20:00:00 +0200
|
|
|
|
vpn-router (0.5.7-1) unstable; urgency=medium
|
|
|
|
feature: users have a first name, a last name and an e-mail address.
|
|
|
|
* vpn-router-user add needs --first-name, --last-name and --email, kept as
|
|
givenName, sn and mail, with cn set to the first and the last name.
|
|
vpn-router-user update changes them, and list and every answer show
|
|
them as first_name, last_name and email.
|
|
* POST /users needs first_name, last_name and email, and PUT
|
|
/users/<name> changes them.
|
|
* vpn-router-user answers in text: a table of the users, the client
|
|
profile or a short message, with failures on standard error. --json
|
|
gives the JSON answers. -h and --help show the commands and their
|
|
options.
|
|
* The web service manages users with vpnrouter_users, the module
|
|
vpn-router-user uses, instead of running vpn-router-user for each
|
|
request.
|
|
* Groups of users, kept as groupOfNames entries in ou=groups with a
|
|
description and at least one member. vpn-router-group lists, adds,
|
|
renames, describes and removes them and adds and takes out members, and
|
|
the web service serves the same under /groups. Removing a user takes it
|
|
out of its groups and is refused while it is the last member of one.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 19:00:00 +0200
|
|
|
|
vpn-router (0.5.6-1) unstable; urgency=medium
|
|
|
|
update: the status web service listens on port 7081 by default.
|
|
|
|
* web.port defaults to 7081.
|
|
* vpn-router-setup opens the Router Manager's port, 7080 by default, on
|
|
the internal interface.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 18:00:00 +0200
|
|
|
|
vpn-router (0.5.5-1) unstable; urgency=medium
|
|
|
|
feature: users and their certificates no longer need a P2S system enabled.
|
|
|
|
* vpn-router-setup provisions the user directory, the CA and its CRL once
|
|
a platform is chosen, whether or not OpenVPN or road-warrior access is
|
|
enabled. The server certificate is issued once wan.local_fqdn is set,
|
|
also for an existing CA that has none.
|
|
* /users and vpn-router-user manage users and issue and revoke their
|
|
certificates without a P2S system; only the OpenVPN client profile
|
|
needs OpenVPN.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 16:00:00 +0200
|
|
|
|
vpn-router (0.5.4-1) unstable; urgency=medium
|
|
|
|
feature: the firewall lets the Router Manager in on the internal interface.
|
|
|
|
* While vpn-router-manager is installed, vpn-router-setup opens its port,
|
|
port in /etc/vpn-router-manager/manager.json or 8090, on the internal
|
|
interface. Purging the package removes the rule.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 13:00:00 +0200
|
|
|
|
vpn-router (0.5.3-1) unstable; urgency=medium
|
|
|
|
fix: the status always shows the state of slapd.
|
|
|
|
* /status and the status page show the state of slapd whether or not
|
|
OpenVPN or road-warrior access is configured, since the package always
|
|
runs it.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 12:00:00 +0200
|
|
|
|
vpn-router (0.5.2-1) unstable; urgency=medium
|
|
|
|
fix: /config no longer shows secret options.
|
|
|
|
* The configuration shown by /config leaves out the secret options (psk,
|
|
jwt_secret, and options named like a password, token or key) instead of
|
|
showing them masked.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 11:00:00 +0200
|
|
|
|
vpn-router (0.5.1-1) unstable; urgency=medium
|
|
|
|
fix: the web service works in every state of the router.
|
|
|
|
* vpn-router-web works whether /etc/vpn-router/pki and
|
|
/etc/swanctl/x509crl exist or not; they exist only while OpenVPN or
|
|
road-warrior access is configured. The paths the unit may write are
|
|
used when they exist and ignored when they do not.
|
|
* vpn-router-web starts on its own and keeps running. Every 30 seconds a
|
|
discovery thread works out the internal address from vpn-router.json as
|
|
general.mode directs, with web.port and web.enabled, and starts, moves
|
|
or stops the server thread to match. Each request reads the token
|
|
secret, the features and the facts it shows. The service is no longer
|
|
ordered after vpn-router-setup, which no longer restarts it, and
|
|
web.json no longer holds the address, the port or the secret.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Sat, 24 Oct 2026 10:00:00 +0200
|
|
|
|
vpn-router (0.5.0-1) unstable; urgency=medium
|
|
|
|
* OpenVPN P2S access, set in the openvpn section (enabled, address_pool,
|
|
port, protocol). Clients need a certificate of the router CA and the
|
|
password of the user named in it; the password is checked against a
|
|
local LDAP directory by openvpn-auth-ldap.
|
|
* The users live in the package's own slapd database, dc=vpn-router,
|
|
dc=local, which vpn-router-setup provisions while OpenVPN or road-warrior
|
|
access is configured. slapd listens on its local socket only. Passwords
|
|
are stored as ARGON2 hashes, and a disabled user is locked with the
|
|
password policy.
|
|
* vpn-router-user lists, adds, disables, enables and removes users, sets
|
|
passwords and gives OpenVPN client profiles. Adding a user also issues
|
|
the user's client certificate; removing one revokes it.
|
|
* The web service manages users under /users, with the same token as
|
|
/config, and /status shows the OpenVPN clients.
|
|
* The CA gets a certificate revocation list when it is created, and an
|
|
existing CA without one gets one.
|
|
* Purging the package removes the firewall rules of the web service, which
|
|
it left behind before.
|
|
* The status page follows the browser's light or dark colour scheme,
|
|
uses a proportional font and reloads itself every minute.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 23:00:00 +0200
|
|
|
|
vpn-router (0.4.3-1) unstable; urgency=medium
|
|
|
|
* swanctl output with more closing than opening lines is read as not
|
|
available instead of failing the request.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 22:00:00 +0200
|
|
|
|
vpn-router (0.4.2-1) unstable; urgency=medium
|
|
|
|
* /config gives the IPsec connections and SAs as objects, read from
|
|
swanctl --pretty, and the routes as objects from ip -j, instead of
|
|
lines of text. The site-to-site and road-warrior state of /status is
|
|
counted from the same swanctl objects.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 21:30:00 +0200
|
|
|
|
vpn-router (0.4.1-1) unstable; urgency=medium
|
|
|
|
* Fix the start of vpn-router-setup hanging on a host that runs Docker.
|
|
vpn-router-setup restarted vpn-router-docker and waited for it, but that
|
|
unit was ordered after vpn-router-setup, so each waited for the other,
|
|
the installation of the package never finished and vpn-router-web was
|
|
never enabled or started. vpn-router-docker is no longer ordered after
|
|
vpn-router-setup, so vpn-router-setup still waits for it and the Docker
|
|
rules are in place when it ends. The restart of vpn-router-web is queued
|
|
without waiting.
|
|
* Start vpn-router-setup after docker.service, so that Docker is up when
|
|
the setup looks for it and does not start in parallel with it. The
|
|
ordering applies only when Docker is installed.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 20:10:00 +0200
|
|
|
|
vpn-router (0.4.0-1) unstable; urgency=medium
|
|
|
|
* Add the vpn-router-web service, a small status web service that uses only
|
|
the Python standard library. It listens on the internal address and on
|
|
web.port, 8080 by default. / shows the state of the router for people,
|
|
as plain text for curl and wget and as a Tailwind CSS page for a
|
|
browser, and /status shows the same as JSON: the state of the services,
|
|
the package version, whether Docker is installed, and the state of
|
|
site-to-site, road-warrior and WireGuard, with no configuration data.
|
|
* Add the web configuration section. web.enabled (true by default) and
|
|
web.port. vpn-router-setup opens the port on the internal interface in
|
|
UFW and restarts the service.
|
|
* Add /config to the status web service, for a client such as manage-ui. It
|
|
shows the configuration with its secrets masked, the interfaces,
|
|
addresses, identities and routes the router resolved, the IPsec
|
|
connections and SAs, the WireGuard peers (no keys) and the Docker rules.
|
|
It needs a JWT signed with HS256 by web.jwt_secret, with an exp claim
|
|
within ten minutes, and is not served while web.jwt_secret is not set.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 19:00:00 +0200
|
|
|
|
vpn-router (0.3.2-1) unstable; urgency=medium
|
|
|
|
* Accept an IPv4 or IPv6 address as remote.id and as wan.local_fqdn. The
|
|
identities are written to the strongSwan configuration as given, without
|
|
an @ added, and strongSwan reads an address as an IP identity and a name
|
|
as an FQDN. A value that starts with @ is refused with an error, since
|
|
strongSwan 5.0 and later need no @ to avoid resolving a name.
|
|
Road-warrior access still needs a name in wan.local_fqdn.
|
|
* Depend on strongswan-swanctl and charon-systemd 5.0 or later.
|
|
|
|
-- Slawomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 18:00:00 +0200
|
|
|
|
vpn-router (0.3.1-1) unstable; urgency=medium
|
|
|
|
* Ignore virtual interfaces when mode auto looks for the internal
|
|
interface. The Docker bridge docker0, which has an address, was counted
|
|
as a second internal interface, so vpn-router-setup and
|
|
vpn-router-docker failed on a host with Docker installed.
|
|
|
|
-- Sławomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 13:44:00 +0200
|
|
|
|
vpn-router (0.3.0-1) unstable; urgency=medium
|
|
|
|
* Secure the ports Docker publishes. Rules in a chain of their own,
|
|
VPN-ROUTER-DOCKER, entered by a jump at the top of DOCKER-USER, accept
|
|
IPsec protected traffic, TCP to docker.exposed_ports and established
|
|
connections from the external interface and drop the rest of it. Other
|
|
rules in DOCKER-USER are left alone. The rules cover IPv4 only.
|
|
* Add the docker configuration section. docker.mode is auto (the default,
|
|
secures Docker when docker.service is installed), on (requires Docker) or
|
|
off (removes the rules); docker.exposed_ports lists the TCP ports and port
|
|
ranges reachable from the external interface, none by default.
|
|
* Add the vpn-router-docker service, which applies the Docker rules after
|
|
docker.service starts and removes them when it stops. vpn-router-setup
|
|
restarts it while Docker runs, so a changed configuration takes effect.
|
|
* Installing Docker before this package is recommended. When Docker is
|
|
installed later, restart vpn-router-setup to apply the rules.
|
|
|
|
-- Sławomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 12:44:45 +0200
|
|
|
|
vpn-router (0.2.0-1) unstable; urgency=medium
|
|
|
|
* Change the configuration file to JSON, /etc/vpn-router/vpn-router.json.
|
|
Lists are arrays, booleans and the WireGuard listen port are native JSON
|
|
types, and unknown sections, unknown settings and wrong value types are
|
|
rejected.
|
|
* Replace remote.psk_b64 with remote.psk, holding the pre-shared key as a
|
|
plain string. remote.psk_file still takes precedence.
|
|
* Ship /usr/share/doc/vpn-router/vpn-router.json.example in place of
|
|
vpn-router.conf.example.
|
|
* Add platform "none" as the default, so installing the package changes
|
|
nothing on the machine until a platform is chosen.
|
|
* Add the mode setting (manual, interfaces, auto) controlling how much of
|
|
the network configuration is supplied and how much is read from the
|
|
system.
|
|
* Manage the configuration file with ucf, so dpkg-reconfigure reapplies
|
|
debconf answers without overwriting local edits.
|
|
* Apply NAT and forward rules to every local subnet, not only the first.
|
|
|
|
-- Sławomir Koszewski <slawek@koszewscy.waw.pl> Fri, 23 Oct 2026 08:00:06 +0200
|
|
|
|
vpn-router (0.1.0-1) unstable; urgency=medium
|
|
|
|
* Initial release.
|
|
|
|
-- Sławomir Koszewski <slawek@koszewscy.waw.pl> Tue, 26 May 2026 00:00:00 +0200
|