Cloudflare Access alternative

The open source, self-hosted alternative to Cloudflare Access

Octelium is a free and open source, self-hosted zero trust access platform. It runs entirely on infrastructure you operate, and provides clientless access to internal applications, client-based access over WireGuard and QUIC, layer-7 aware access control on a per-request basis, and dynamic secretless access.

  • Free and open source
  • Designed for self-hosting
service.yaml
A ServiceEach protected resource is a Service. Publishing it to browsers is one field.
A Service. Each protected resource is a Service. Publishing it to browsers is one field.
kind: Service
metadata:
  name: wiki
spec:
  mode: HTTP
  isPublic: true
  config:
    upstream:
      url: http://10.0.9.20:3000
    http:
      auth:
        bearer:
          fromSecret: wiki-token
A Policy. Access is authorized per request, from identity, context and the request itself.
kind: Policy
metadata:
  name: api-read
spec:
  rules:
    - effect: ALLOW
      condition:
        all:
          of:
            - match: ctx.request.http.method == "GET"
            - match: '"partners" in ctx.user.spec.groups'
            - match: ctx.session.status.isBrowser
Anonymous public access. A containerized application the Cluster deploys itself and serves to the public internet.
kind: Service
metadata:
  name: site
spec:
  mode: HTTP
  isPublic: true
  isAnonymous: true
  config:
    upstream:
      container:
        port: 8080
        image: ghcr.io/acme/site:1.2.0
service-private.yaml
A private resourceAn internal application behind NAT, with no inbound port opened anywhere.
A private resource. An internal application behind NAT, with no inbound port opened anywhere.
kind: Service
metadata:
  name: wiki
spec:
  mode: HTTP
  config:
    upstream:
      url: http://10.0.9.20:3000
A generic TCP application. Anything that is not an HTTP application is reached over the tunnel just the same.
kind: Service
metadata:
  name: nats
spec:
  mode: TCP
  port: 4222
  config:
    upstream:
      url: tcp://10.0.9.31:4222
Private DNS. The Cluster private DNS is itself a Service, so name resolution follows the same model.
kind: Service
metadata:
  name: corp-dns
spec:
  mode: DNS
  port: 53
  config:
    upstream:
      url: dns://10.0.9.10
policy-http.yaml
HTTPMethod, path, headers and query parameters are all part of the request context.
HTTP. Method, path, headers and query parameters are all part of the request context.
kind: Policy
metadata:
  name: api-read
spec:
  rules:
    - effect: ALLOW
      condition:
        all:
          of:
            - match: ctx.request.http.method == "GET"
            - match: ctx.request.http.path.startsWith("/v1/")
            - match: '"partners" in ctx.user.spec.groups'
Request body. A serialized JSON body is available to Policies, so the payload itself can be authorized.
kind: Policy
metadata:
  name: orders-create
spec:
  rules:
    - effect: ALLOW
      condition:
        all:
          of:
            - match: ctx.request.http.method == "POST"
            - match: ctx.request.http.bodyMap.amount < 5000
Identity and device. Device attributes, Session type and Group membership sit in the same expression.
kind: Policy
metadata:
  name: sensitive
spec:
  rules:
    - effect: DENY
      condition:
        not:
          match: ctx.device.status.osType in ["MAC"]
    - effect: ALLOW
      condition:
        match: '"security" in ctx.user.spec.groups'
service-saas.yaml
A protected SaaS APIThe API key stays in the Cluster. Users and workloads call the API without ever holding it.
A protected SaaS API. The API key stays in the Cluster. Users and workloads call the API without ever holding it.
kind: Service
metadata:
  name: stripe
spec:
  mode: HTTP
  isPublic: true
  config:
    upstream:
      url: https://api.stripe.com
    http:
      auth:
        bearer:
          fromSecret: stripe-api-key
mTLS. A client certificate is held as a Secret and presented upstream on the User's behalf.
kind: Service
metadata:
  name: nats
spec:
  mode: TCP
  config:
    upstream:
      url: tls://10.0.9.31:9090
    tls:
      clientCertificate:
        fromSecret: nats-client-cert
A credential chosen per request. The upstream account is selected from identity, so one Service serves several privilege levels.
kind: Service
metadata:
  name: billing
spec:
  mode: HTTP
  dynamicConfig:
    configs:
      - name: finance
        upstream:
          url: https://api.example.com
        http:
          auth:
            bearer:
              fromSecret: apikey-finance
    rules:
      - condition:
          match: '"finance" in ctx.user.spec.groups'
        configName: finance
service-mcp.yaml
An MCP gatewayAn MCP server published with a pinned protocol version and validated browser origins.
An MCP gateway. An MCP server published with a pinned protocol version and validated browser origins.
kind: Service
metadata:
  name: tools-mcp
spec:
  mode: MCP
  isPublic: true
  config:
    upstream:
      url: http://10.0.9.44:8080
    mcp:
      endpoint: /mcp
      protocol:
        requireVersion: true
      cors:
        allowOriginStringMatch:
          - https://client.example.com
Inference authorization. The model, the token ceiling and whether tools are declared are all authorized per request.
kind: Policy
metadata:
  name: llm-limits
spec:
  rules:
    - effect: ALLOW
      condition:
        all:
          of:
            - match: ctx.request.llm.model == "gpt-5-mini"
            - match: ctx.request.llm.maxOutputTokens < 4096
            - match: '"agents" in ctx.user.spec.groups'
Secretless workload identity. Workloads authenticate with OIDC assertions issued by the platform running them.
kind: IdentityProvider
metadata:
  name: gitlab-ci
spec:
  oidcIdentityToken:
    issuerURL: https://gitlab.com
    audience: https://example.com
Visibility and auditing

Real-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.

Read about visibility and auditing
AccessLogOTLP
ALLOWjane@acme.comwikiHTTPGET /docs/onboarding 200, browser session
DENYcontractor-3billingHTTPPOST /v1/refunds policy=orders-create
ALLOWci-runnerstripeHTTPGET /v1/charges, credential injected upstream
ALLOWlinus@acme.comcorp-dnsDNSquestion=internal.acme.com type=A
ALLOWagent-07tools-mcpMCPtools/call name=search_docs
octeliumctl
octeliumctl apply ./cluster
$ octeliumctl apply ./cluster
Secret: stripe-api-key Updated
Secret: wiki-token Updated
IdentityProvider: okta Updated
Policy: api-read Created
Policy: llm-limits Created
Group: partners Updated
Service: wiki Created
Service: stripe Created
Service: tools-mcp Created
Namespace: public Created
Cluster Core resources successfully applied
 7 resources created
 3 resources updated

 ClusterConfig updated
Comparison

Octelium and Cloudflare Access, capability by capability

Both products are described from the same structured capability dataset used across this site, with the same evidentiary standard applied to each. Emerging and experimental features are marked as partial regardless of vendor.

Capability comparison

Dataset reviewed August 2026

A curated view of the dataset, including the rows where Octelium is stronger, the rows where it is not, and the rows where the two are equivalent. The complete capability matrix, with search and filters, is one click away.

Architecture

Architecture

Octelium
Kubernetes-native identity-aware proxy/gateway architecture in which policy evaluation is separated from enforcement, with client-based WireGuard/QUIC access, clientless BeyondCorp access, declarative resources, and self-hosted control/data planes.
Cloudflare Access / Tunnel
SaaS edge proxy/SASE architecture. cloudflared connectors and/or WARP clients connect private resources and users to Cloudflare's global network. Access policies apply at Cloudflare-controlled edge/control plane.

Authentication

Native FIDO2 / Passkey

Native means implemented by the platform itself, not merely delegated to an external IdP.

Octelium
NativeFIDO2/Passkey/WebAuthnN with attestation and hardware-resistant authenticator checks
Cloudflare Access / Tunnel
NoGenerally delegated to IdP.

Workload Identity

Octelium
OIDC assertions / workload identity
Cloudflare Access / Tunnel
Service tokens / mTLS / Access apps

Anonymous / Public Access

Octelium
Yes
Cloudflare Access / Tunnel
No

SCIM Provisioning

Automated user/group lifecycle provisioning via SCIM, beyond just login-time IdP federation.

Octelium
SCIM 2.0 compliant
Cloudflare Access / Tunnel
SCIM via Access / IdP

Authorization & Policy

Policy Model

Octelium
Layer-7 aware ABAC with policy-as-code via CEL and OPA
Cloudflare Access / Tunnel
Access rules, geolocation and Gateway policies.

Policy-as-Code

Octelium
CEL + OPA
Cloudflare Access / Tunnel
Terraform/API; not a CEL/OPA product-native policy runtime

Per-Request Authz

For L7 products, this means each HTTP/gRPC/API/K8s request can be evaluated. For overlays, session/connection policy is not counted as per-request. This modeling choice structurally favors L7 gateways over network overlays.

Octelium
Yes
Cloudflare Access / Tunnel
For Access-protected HTTP/MCP/web flows; not equivalent for all private network flows

L7-Aware Policies

Octelium
HTTP, gRPC, K8s, DB, SSH, mTLS-related context
Cloudflare Access / Tunnel
Strong HTTP/web policy; not DB/K8s query/verb semantics

Zero Standing Privilege / JIT

Indicates strong architectural support for minimizing standing privilege; not an absolute claim that privileged access cannot exist.

Octelium
StrongDesigned to minimize static privilege through identity/policy-scoped access.
Cloudflare Access / Tunnel
Partial

Access Requests / Approvals

First-class request-and-approve / break-glass workflows (reviewers, time-bound grants), as opposed to static policy alone.

Octelium
Access requests + approvalsFirst-class access request and approval workflow, in addition to policy/identity-scoped access that can be time-bound.
Cloudflare Access / Tunnel
Policy + approvals via integrations; not a native PAM request workflow

Device Posture

Octelium
TPM/FIDO2/device attributes
Cloudflare Access / Tunnel
Yes

L7 Protocol Awareness & Secretless Access

SSH

Octelium
Secretless / embedded SSH patterns
Cloudflare Access / Tunnel
Browser/CLI access patterns

PostgreSQL

Octelium
Secretless + query-aware policy/logging
Cloudflare Access / Tunnel
Private network/proxy connectivity; not query-aware secretless DB gateway

Kubernetes

Octelium
Secretless + verb/resource/namespace policy
Cloudflare Access / Tunnel
Can protect access paths; not native K8s verb/resource authz gateway

RDP

Octelium
with clientless secretless browser access
Cloudflare Access / Tunnel
Browser-based RDP and client modes

DNS

Octelium
Native private DNS mode
Cloudflare Access / Tunnel
Gateway DNS filtering / private networking DNS patterns

Transport & Networking

WireGuard Data Plane

Whether the product's own client/data plane is built on WireGuard, versus a proprietary or TLS-based transport.

Octelium
Kernel / userspaceWireGuard via kernel module, TUN, or unprivileged userspace (wireguard-go) implementations.
Cloudflare Access / Tunnel
WARPWARP uses a WireGuard-derived transport (BoringTun) alongside MASQUE/HTTP3; not a standard WireGuard mesh.

Visibility, Auditing & Observability

OpenTelemetry-Native

Octelium
Yes
Cloudflare Access / Tunnel
No

L7-Aware Access Logs

Octelium
HTTP/gRPC/K8s/DB/SSH identity-aware logs
Cloudflare Access / Tunnel
HTTP/access/gateway logs; not DB query logs

SSH Session Recording

Octelium
Yes
Cloudflare Access / Tunnel
No

Access Methods

Client-Based VPN / Overlay

Octelium
WireGuard / QUIC
Cloudflare Access / Tunnel
WARP client

Clientless Browser Access

Octelium
Yes
Cloudflare Access / Tunnel
Yes

Workload OAuth2 / Bearer

Octelium
Yes
Cloudflare Access / Tunnel
Service tokens / Access service auth

Private DNS

Octelium
Yes
Cloudflare Access / Tunnel
Private DNS/Gateway patterns, not MagicDNS-style product focus

Dynamic Configuration

Dynamic Credential Selection

Octelium
Yes
Cloudflare Access / Tunnel
No

SaaS / Public Cloud API Access

Secretless SaaS API Access

Octelium
Yes
Cloudflare Access / Tunnel
No

AI / MCP / Agent Compatibility

AI / LLM Gateway

Octelium
Native LLM Service modeProtocol-aware OpenAI/Anthropic gateway: validated operations, per-request authorization on model, tools and token limits, CEL-based model selection, and token usage in access logs.
Cloudflare Access / Tunnel
Workers/AI products exist; Access/Tunnel is not primarily an LLM gateway

MCP Gateway / MCP Access

Octelium
Native MCP Service modeProtocol-aware MCP gateway: JSON-RPC method and tool-level authorization, protocol version pinning, origin validation, and managed-container MCP upstreams.
Cloudflare Access / Tunnel
Cloudflare Access can protect MCP servers

Deploy Containers / PaaS

Octelium
Yes
Cloudflare Access / Tunnel
No

Scalability & Cloud-Nativeness

High Availability

Octelium
K8s-native HA model
Cloudflare Access / Tunnel
Global edge

Openness & Self-Hosting

Fully Self-Hosted

Octelium
Yes
Cloudflare Access / Tunnel
No

Server Code Open Source

Octelium
Yes
Cloudflare Access / Tunnel
No

No Mandatory Proprietary Cloud

Octelium
Yes
Cloudflare Access / Tunnel
No

Data Sovereignty

Octelium
Yes
Cloudflare Access / Tunnel
NoTraffic/control plane depend on Cloudflare's network for core workflows.
Questions

Frequently asked

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.
Where does my traffic actually terminate?
Inside your own Cluster, on infrastructure you operate, in the regions you choose. Clientless access is served by an internet-facing proxy that is part of your Cluster, and client-based access runs over WireGuard or QUIC tunnels directly to it. There is no third party in the data path and no external control plane deciding whether a request is allowed.
Do I need to open inbound ports for private resources?
No. A resource behind NAT can be served through a connected Octelium client or container running next to it, so nothing has to be exposed and no firewall rule has to be added. Public clientless access is published from the Cluster itself rather than from the network the upstream sits on.
How does clientless access work for workloads?
Workloads reach publicly published Services over HTTPS using the standard OAuth2 client credentials flow or bearer authentication, in any programming language, with no client and no special SDK. Human Users reach the same Services in a browser after authenticating with your identity provider.
Can I publish public websites and APIs with it?
Yes. A Service can be made publicly and anonymously accessible, which turns the Cluster into a hosting platform for upstreams served from anywhere, including containerized applications that the Cluster deploys and scales itself. Anonymous Services can still apply authorization rules over the request path, method, headers and body.
Do I need to know Kubernetes to run it?
An Octelium Cluster runs on top of Kubernetes, but you do not need Kubernetes experience to install, operate or use it. The quick installer provisions a complete single-node Cluster, including Kubernetes itself, on one fresh Linux VM/server and a domain you own. Production Clusters run on scalable managed or on-premise Kubernetes installations.
Get started

Deploy Octelium on your own infrastructure in minutes

Free and open source. Self-hosted. No vendor lock-in.