Identity enforced before access
Users authenticate through Cloudflare Access before reaching the Guacamole application. Cloudflare becomes the first control point and primary external kill switch.
SECURITY ARCHITECTURE CASE STUDY
A self-hosted remote access platform that uses Cloudflare Access, Cloudflare Tunnel, Apache Guacamole, Docker, PostgreSQL, and segmented Proxmox lab networks to provide browser-based SSH and RDP access without exposing inbound management ports to the public internet.
PROBLEM
The lab needed a reliable way to administer internal systems from outside the home network. Exposing SSH, RDP, Proxmox management, or other administrative services directly to the internet would increase risk and create unnecessary attack surface. A traditional VPN could provide connectivity, but it would also create broader network trust than needed for browser-based operational access.
The goal was to build an access path that enforced identity before application access, kept management services internal, supported both SSH and RDP workflows, and remained recoverable after outages or host restarts.
ARCHITECTURE
flowchart LR
U[User Browser] --> A[Cloudflare Access]
A --> P[Allow Policy]
P --> T[Cloudflare Tunnel]
T --> G[Guacamole]
G --> B[Bastion]
B --> I[Internal Systems]
Users authenticate through Cloudflare Access before reaching the Guacamole application. Cloudflare becomes the first control point and primary external kill switch.
SSH, RDP, and administrative services remain internal. Cloudflare Tunnel maintains an outbound-only connection to the edge instead of requiring inbound firewall openings.
SECURITY CONTROLS
External access is gated by an identity-aware policy layer using SSO, MFA, explicit allow rules, and default-deny behavior.
The access path is established through an outbound tunnel, avoiding direct inbound exposure of SSH, RDP, or virtualization management interfaces.
Guacamole acts as a browser-based broker for SSH and RDP sessions, keeping users from directly touching internal service ports.
Internal systems still require native authentication after the user passes Cloudflare and Guacamole access checks.
OPERATING MODEL
Access can be granted or revoked at the Cloudflare policy layer and separately managed inside Guacamole for application-level authorization.
The bastion and internal targets sit behind the access broker, keeping administrative workflows separated from direct public exposure.
Restart behavior, service dependencies, container state, tunnel status, and authentication paths were treated as part of the system design.
Browser-based access reduces client-side setup requirements and makes the lab easier to demonstrate, validate, and operate from different locations.
ENGINEERING CHALLENGES
Restarts and outages required checking the tunnel, container state, Guacamole application path, backend database availability, and the relationship between the reverse path and local services.
Failures were isolated across Cloudflare Access policy, tunnel routing, Guacamole application behavior, Docker networking, and internal target reachability.
The design separates Cloudflare identity access from Guacamole authorization and final endpoint credentials, reducing reliance on any single access control.
Recovery steps, user access workflows, revocation steps, and operating assumptions were captured so the platform could be maintained instead of rediscovered after each issue.
VALIDATION
OUTCOME
The final design provides identity-aware remote access without exposing management ports directly to the internet. It also creates a stronger operating model for demos, administration, recovery, and future lab expansion because the access path is documented, layered, and designed around explicit trust boundaries.
Management access is brokered through Cloudflare Access and Guacamole instead of being exposed directly through public inbound firewall rules.
The platform supports repeatable remote administration and easier lab demonstrations from a browser-based workflow.
LESSONS LEARNED
The access model works best when every access path is explicitly documented and unauthorized traffic fails closed by default.
The architecture was not complete until restart behavior, service checks, revocation, and troubleshooting steps were documented.