The open source, self-hosted business VPN
Octelium is a free and open source, self-hosted zero trust access platform. For a team it behaves as a zero-config VPN with single sign-on: people install one client, sign in with the accounts they already have, and reach the internal resources they are authorized for by name. What each of them may reach is decided per request rather than by the network they land on.
- Free and open source
- Designed for self-hosting
- Works with your existing SSO
kind: Service
metadata:
name: wiki
spec:
mode: HTTP
config:
upstream:
url: http://10.0.6.18:3000kind: IdentityProvider
metadata:
name: okta
spec:
oidc:
issuerURL: https://acme.okta.com
clientID: 0oa1abcdefghij
clientSecret:
fromSecret: okta-client-secretkind: Policy
metadata:
name: employees
spec:
rules:
- effect: ALLOW
condition:
all:
of:
- match: ctx.user.spec.type == "HUMAN"
- match: '"employees" in ctx.user.spec.groups'A unified secure access platform
Secure humans, workloads and AI agents with one model for identity, authorization, connectivity, credentials and visibility.
- Unified access platform
One architecture for client-based zero-config VPN-like access over WireGuard and QUIC tunnels and clientless access over browsers for humans and OAuth2 access for workloads.
Read more - L7-aware access control
Identity-based, application-layer aware ABAC access control with policy-as-code via CEL and OPA, applied on a per-request basis.
Read more - Secretless access
Dynamic secretless access where teams and AI agents access protected infrastructure without ever holding a credential.
Read more - Unified identity management
Teams, workloads and AI agents share the same model for identity management, access control, and auditing.
Read more - Real-time visibility and auditing
OpenTelemetry-native, real-time, application-layer-aware visibility and structured logging.
Read more - GitOps-friendly management
Octelium is administered like Kubernetes. Define your resources in YAML files, store them in a Git repository.
Read more
One architecture for both ways of reaching a resource
Each resource is protected by an identity-aware proxy that provides application-layer-aware access control, secretless access, and visibility. People reach Services through two equivalent modes, and the same Policies apply to both.
- Client-based access over WireGuard and QUIC tunnels, which behaves as a zero-config VPN: a single stable route, stable private dual-stack addresses, and automatic private DNS.
- Clientless BeyondCorp access for humans via browsers and for workloads over standard OAuth2 and bearer authentication, with no client or SDK.
- A Service upstream can also be an address that is only reachable from the side of a connected host, which covers offices, private clouds and equipment behind NAT with no inbound port anywhere.
kind: Service
metadata:
name: wiki
spec:
mode: HTTP
config:
upstream:
url: http://10.0.6.18:3000kind: Service
metadata:
name: wiki
spec:
mode: HTTP
isPublic: true
config:
upstream:
url: http://10.0.6.18:3000kind: Namespace
metadata:
name: internal
spec:
authorization:
policies:
- employees
inlinePolicies:
- spec:
rules:
- effect: DENY
condition:
match: '"contractors" in
ctx.user.spec.groups'Layer-7 aware access control with policy-as-code
Access is authorized on a per-request basis, using CEL or Open Policy Agent, against the identity behind the request and the content of the request itself rather than the network path it arrived on.
- Groups from your identity provider drive the decision, combined with device posture, session type and time in the same expression, and Policies attach to a Service, a Namespace, a User or a Group.
- Native FIDO2 and WebAuthn passkeys, TOTP and TPM 2.0 authenticators can be required after a sign-in through enforcement rules, so a phishing-resistant factor is enforced where it matters.
- Zero standing privileges. No permanent admins or superuser Users. All access is explicitly allowed by a Policy that can be tied by time and context.
kind: Policy
metadata:
name: sensitive
spec:
rules:
- effect: ALLOW
condition:
all:
of:
- match: ctx.user.spec.type == "HUMAN"
- match: ctx.session.status.type == "CLIENT"
- match: ctx.device.status.osType in ["MAC", "WINDOWS"]
- match: '"finance" in ctx.user.spec.groups'kind: Policy
metadata:
name: read-only
spec:
rules:
- effect: ALLOW
condition:
all:
of:
- match: ctx.request.http.method == "GET"
- match: ctx.request.http.path.startsWith("/docs")
- match: '"employees" in ctx.user.spec.groups'kind: ClusterConfig
metadata:
name: cluster-config
spec:
authenticator:
authenticationEnforcementRules:
- condition:
match: ctx.session.status.isBrowser
effect: ENFORCE
- condition:
match: '"finance" in ctx.user.spec.groups'
effect: ENFORCECredentials that are never distributed
Application-layer credentials are stored in the Cluster as Secrets and injected into the upstream connection once a request is authorized. A tunnel on its own does nothing about the API keys, database passwords and private keys that a team accumulates.
- Covers HTTP API keys and access tokens, SSH passwords and private keys, PostgreSQL and MySQL passwords, kubeconfigs, RDP credentials and mTLS client certificates.
- Protected public resources are covered as well as private ones, so a SaaS API or a hosted database can be reached by the team without the key leaving the Cluster.
- Revoking access is a Policy change rather than a credential rotation across every system a person could reach.
kind: Service
metadata:
name: stripe
spec:
mode: HTTP
config:
upstream:
url: https://api.stripe.com
http:
auth:
bearer:
fromSecret: stripe-api-keykind: Service
metadata:
name: pg-prod
spec:
mode: POSTGRES
port: 5432
config:
upstream:
url: postgres://10.0.4.21:5432
postgres:
user: analytics_ro
database: analytics
auth:
password:
fromSecret: pg-passwordkind: Service
metadata:
name: bastion
spec:
mode: SSH
port: 22
config:
upstream:
url: ssh://10.0.2.14
ssh:
user: deploy
auth:
privateKey:
fromSecret: bastion-keyA unified identity model for humans and workloads
Human and workload Users share the same identity management, authentication, access control and visibility model. The servers, CI jobs and agents that reach the same internal resources are not a separate system to administer.
- People authenticate through any OpenID Connect or SAML 2.0 identity provider, or GitHub OAuth2, with native FIDO2 and WebAuthn passkeys, TOTP and TPM 2.0 authenticators available on top of it.
- Workloads authenticate with authentication tokens, with the OAuth2 client credentials flow, or secretlessly with federated OIDC assertions from GitHub Actions, cloud providers and Kubernetes clusters.
- The MCP and LLM gateway modes extend the same identity, policy and audit model to the tools and model providers that AI agents reach.
- Cordium, built on Octelium, provides isolated sandboxes for agents and developers, where processes reach authorized Services through the Workspace identity with no secrets inside the sandbox.
kind: IdentityProvider
metadata:
name: github-actions
spec:
oidcIdentityToken:
issuerURL: https://token.actions.githubusercontent.com
audience: https://example.comkind: User
metadata:
name: ci-runner
spec:
type: WORKLOAD
groups:
- cikind: Service
metadata:
name: openai
spec:
mode: LLM
isPublic: true
config:
upstream:
url: https://api.openai.com
llm:
protocol: OPENAI
auth:
bearer:
fromSecret: openai-api-keyReal-time visibility at the application layer
OpenTelemetry-ready, application-layer aware, structured auditing and visibility emitted to your OpenTelemetry OTLP receivers, where they can be exported to your log management and SIEM tools.
- Application-layer-aware visibility with logs that include HTTP requests and responses, database queries, SSH session recordings, DNS question names, MCP methods and tool names, and LLM operations and token usage.
- Logs are exported over OpenTelemetry OTLP in real-time to SIEM providers you already operate.
A scalable platform that also deploys your workloads
A Cluster runs on Kubernetes and uses it to scale its own data plane, place Service proxies across Gateways, and run containerized applications that the Cluster itself deploys.
- Gateways scale horizontally rather than each one imposing a fixed ceiling on the traffic and the number of connections it can carry.
- Managed containers deploy, scale and serve containerized applications as Service upstreams, which covers internal tools the team would otherwise have to host somewhere else.
- The Cluster is managed declaratively. Resources are defined in YAML, kept in a Git repository, and applied with a single octeliumctl apply that reproduces the entire Cluster state.
$ octeliumctl apply ./cluster
Secret: okta-client-secret Updated
Secret: pg-password Updated
IdentityProvider: okta Updated
Policy: employees Created
Group: employees Created
Group: finance Updated
Service: wiki.internal Created
Service: bastion Created
Service: pg-prod.db Created
Namespace: internal Created
Cluster Core resources successfully applied
7 resources created
3 resources updated
ClusterConfig updatedWhat it looks like from each side
A business VPN is used by everyone in the organization and operated by a small number of people. These are the two experiences it has to serve at once.
One client, one sign-in, and resources that are reachable by name.
- Install the octelium client on Windows, macOS or Linux, or use nothing at all for resources published in a browser.
- Sign in with the same account and the same multi-factor prompts they already use elsewhere.
- Reach every authorized resource by a stable private name, with no routes, addresses or profiles to configure.
- Never receive an API key, a database password or an SSH private key in order to do their job.
- Ask for time-bound access to something they do not normally need, and have it approved rather than granted permanently.
One declarative configuration, reviewable in Git and reproducible.
- Define Services, Policies, Groups and Secrets in YAML and apply the whole Cluster state with a single command.
- Express access as attributes of identity, device and request rather than as addresses, subnets and firewall rules.
- Hold every upstream credential in the Cluster, so offboarding is a Policy change rather than a rotation exercise.
- Stream identity-aware, application-layer audit logs over OpenTelemetry into the SIEM the organization already runs.
- Scale Gateways horizontally on Kubernetes instead of sizing an appliance to peak concurrent users.
The same platform capabilities ship with every deployment, whichever way you use it.
Frequently asked
- What does a person actually install?
- One CLI, the octelium client, on Windows, macOS or Linux. Running octelium connect signs them in through your identity provider and brings up the tunnel. From then on every resource they are authorized for has a stable private name that resolves automatically, so there is nothing to configure per resource and nothing to reconfigure when an upstream address changes.
- Do people have to install anything at all?
- Not necessarily. HTTP-based resources can be published clientlessly over HTTPS, where a person signs in through your identity provider in a browser and reaches the application directly. The same Service can be reachable both ways at once, under the same Policies, which is useful for contractors, unmanaged devices and mobile access.
- Can I keep my existing identity provider?
- Yes. Any OpenID Connect or SAML 2.0 identity provider is supported, as well as GitHub OAuth2. Group membership from the provider drives access decisions. Octelium additionally provides native FIDO2 and WebAuthn passkeys, TOTP and TPM 2.0 authenticators that can be required through policy on sensitive Services, independently of what the identity provider itself enforces.
- What happens when somebody leaves?
- Removing them in your identity provider ends their ability to authenticate, and their Sessions can be revoked directly. Because upstream credentials such as API keys, database passwords and SSH private keys are held by the Cluster and never distributed, there is no separate rotation exercise across every system that person could reach.
- Does it need dedicated hardware?
- No. An Octelium Cluster runs on Kubernetes, on infrastructure you already operate. The quick installer provisions a complete single-node Cluster, including Kubernetes itself, on one fresh Linux VM with 2 vCPUs, 2 GB of RAM and a domain you own, which is enough for a small team. Larger deployments run on scalable managed or on-premise Kubernetes installations, where Gateways scale horizontally.
- Is Octelium free and open source?
- Yes. Octelium is free and open source and is designed for single-tenant self-hosting. There is no proprietary cloud-based control plane, and it is not a limited edition of a separate paid product. An enterprise package is available for organizations that need capabilities such as a web console, SCIM provisioning and secret encryption at rest, and it is free for personal, homelab and evaluation use.
Related solutions
Zero Trust Network Access
Octelium as a complete ZTNA and BeyondCorp platform for humans, workloads and AI agents on a single architecture.
Read moreWireGuard remote access VPN
Zero-config WireGuard tunnels with a single stable route, dual-stack addressing and automatic private DNS.
Read moreOpen source BeyondCorp
Clientless, identity-aware access to internal applications for humans in a browser and for workloads over OAuth2.
Read moreDeploy Octelium on your own infrastructure in minutes
Free and open source. Self-hosted. No vendor lock-in.