Tooling & Cloud Công Cụ & Đám Mây Docker + Ngrok Docker + Ngrok

Cloud Dev Sandbox (Ubuntu Ngrok SSH) Môi Trường Sandbox Đám Mây (Ubuntu Ngrok SSH)

A containerized Ubuntu 22.04 development environment with automated Ngrok TCP tunneling, deployable on Railway, Render, or Docker hosts for ephemeral cloud computing. Môi trường phát triển container hóa Ubuntu 22.04 với cơ chế tự động thiết lập đường hầm TCP qua Ngrok, triển khai linh hoạt trên Railway, Render hoặc Docker VPS cho các tác vụ kiểm thử tức thì.

Role
DevOps Engineer Kỹ Sư DevOps
Date
Tech Stack
Docker Ubuntu 22.04 Ngrok Bash SSH Cloud Automation
Ubuntu Ngrok SSH Docker Container

1. 🎯 The Engineering Problem

Developers frequently need isolated, ephemeral Linux environments to test builds, reproduce CI/CD bugs, or execute resource-intensive CLI tasks. However:

  1. Inbound Port Blocking on Modern PaaS: Modern container platforms (Railway, Render, Koyeb, Fly.io) expose only HTTP/HTTPS egress ports by default. Direct inbound SSH traffic on port 22 is blocked behind strict Carrier-Grade NAT (CGNAT) and firewall layers.
  2. Dedicated Cloud VPS Expense: Renting dedicated cloud VMs with static public IPv4 addresses for brief 15-minute diagnostic tasks incurs unnecessary recurring hosting costs.
  3. Complex Tunnel Setup: Manually logging into a web console, configuring reverse proxies, and transferring SSH keys slows down fast debugging iterations.

Ubuntu Ngrok SSH automates the entire lifecycle: launching a containerized Ubuntu 22.04 environment that establishes a secure Ngrok TCP reverse tunnel at boot, streaming the connection string directly to the container console.


2. 🏗️ Reverse Tunneling Architecture

flowchart LR
    DevTerminal["Local Developer Terminal\n(ssh user@0.tcp.ngrok.io -p 12345)"] -->|Encrypted SSH Connection| NgrokEdge["Ngrok Global Edge Server\n(Public TCP Relay)"]
    
    subgraph CloudPaaS ["Ephemeral Container Host (Railway / Render / Docker VPS)"]
        NgrokEdge -->|"Secure Outbound Reverse Tunnel (Port 443)"| NgrokAgent["Ngrok Tunnel Agent"]
        NgrokAgent -->|Forward to Local Port 22| SSHDaemon["OpenSSH Server (sshd)"]
        SSHDaemon --> Shell["Isolated Ubuntu 22.04 Sandbox"]
    end

3. ⚙️ Key Technical Decisions

  • Outbound Reverse Tunneling: Because container platforms allow arbitrary outbound HTTPS traffic, Ngrok initiates an outbound tunnel back to Ngrok edge relays. This completely bypasses container NAT restrictions and firewalls without requiring a public IPv4 address.
  • Automated Daemon Supervisor (entrypoint.sh): A lightweight bash supervisor boots sshd, executes ngrok tcp 22, queries Ngrok’s local API (http://127.0.0.1:4040/api/tunnels) to extract the dynamic public TCP URL, and logs the formatted ssh command directly to stdout.
  • Clean Signal Handling & Non-Root Access: Traps SIGTERM and SIGINT to gracefully shut down background daemons, ensuring zero zombie processes upon container shutdown.

4. 💻 Core Implementation Highlights

#!/bin/bash
set -e

echo "[INIT] Starting OpenSSH Server..."
service ssh start

if [ -n "$NGROK_AUTH_TOKEN" ]; then
    echo "[INIT] Authenticating Ngrok Token..."
    ngrok config add-authtoken "$NGROK_AUTH_TOKEN" > /dev/null 2>&1

    echo "[INIT] Establishing Reverse TCP Tunnel on Port 22..."
    ngrok tcp 22 --log=stdout > /dev/null &
    
    # Wait for Ngrok local API to initialize
    sleep 3

    # Query dynamic public endpoint
    TUNNEL_URL=$(curl -s http://127.0.0.1:4040/api/tunnels | grep -o 'tcp://[^"]*' | sed 's/tcp:\/\///')
    
    if [ -n "$TUNNEL_URL" ]; then
        HOST=$(echo "$TUNNEL_URL" | cut -d':' -f1)
        PORT=$(echo "$TUNNEL_URL" | cut -d':' -f2)
        echo "=================================================="
        echo " 🚀 SSH TUNNEL READY!"
        echo " Connect with: ssh root@$HOST -p $PORT"
        echo "=================================================="
    fi
else
    echo "[WARN] NGROK_AUTH_TOKEN not provided. Tunneling disabled."
fi

# Keep container alive and forward signals
exec tail -f /dev/null

5. 📊 Results & Developer Utility

  • Instant Terminal Access in < 15 Seconds: Container boots and outputs the SSH command within seconds of deployment.
  • Zero Public IP Costs: Runs seamlessly on free or low-tier ephemeral container platforms without paying for dedicated IPv4 allocations.
  • Complete Isolation: Provides a throwaway Linux environment for testing dangerous scripts and builds.

1. 🎯 Bối Cảnh & Thách Thức Kỹ Thuật

Lập trình viên thường xuyên cần môi trường Linux biệt lập, tạm thời (ephemeral) để kiểm thử lệnh terminal, gỡ lỗi CI/CD hoặc chạy các tác vụ biên dịch nặng. Tuy nhiên:

  1. Các nền tảng PaaS chặn kết nối SSH vào: Các dịch vụ như Railway, Render, Koyeb hay Fly.io chỉ cho phép truy cập qua cổng HTTP/HTTPS. Cổng SSH 22 bị chặn sau nhiều lớp tường lửa và mạng NAT (Carrier-Grade NAT) của nhà cung cấp.
  2. Chi phí thuê VPS có IP tĩnh: Thuê máy chủ ảo VPS riêng có địa chỉ IPv4 công khai chỉ để thử nghiệm vài câu lệnh trong 15 phút gây lãng phí chi phí duy trì hàng tháng.
  3. Cấu hình đường hầm thủ công mất thời gian: Phải mở bảng điều khiển web, cấu hình thủ công reverse proxy và copy khóa SSH làm gián đoạn luồng làm việc.

Ubuntu Ngrok SSH tự động hóa toàn bộ quy trình: khởi chạy container Ubuntu 22.04, tự động mở đường hầm đảo ngược Ngrok TCP lúc khởi động và in sẵn câu lệnh SSH ra màn hình log.


2. 🏗️ Kiến Trúc Đường Hầm Đảo Ngược (Reverse Tunnel)

flowchart LR
    DevTerminal["Màn Hình Terminal Của Bạn\n(ssh user@0.tcp.ngrok.io -p 12345)"] -->|Kết Nối SSH Đã Mã Hóa| NgrokEdge["Máy Chủ Trung Gian Ngrok Edge\n(Public TCP Relay)"]
    
    subgraph CloudPaaS ["Hạ Tầng Container Đám Mây (Railway / Render / Docker VPS)"]
        NgrokEdge -->|"Đường Hầm Chiều Ra Outbound (Cổng 443)"| NgrokAgent["Tiến Trình Ngrok Agent"]
        NgrokAgent -->|Chuyển Tiếp Tới Cổng Nội Bộ 22| SSHDaemon["Dịch Vụ OpenSSH (sshd)"]
        SSHDaemon --> Shell["Môi Trường Ubuntu 22.04 Cô Lập"]
    end

3. ⚙️ Các Quyết Định Kỹ Thuật Then Chốt

  • Kỹ thuật Đường hầm đảo chiều Outbound: Vì các nền tảng đám mây luôn cho phép kết nối mạng chiều ra (Outbound HTTPS), Ngrok khởi tạo kết nối ngược về cụm máy chủ trung gian. Điều này giúp vượt qua 100% tường lửa NAT mà không cần IP tĩnh công khai.
  • Tiến trình giám sát tự động (entrypoint.sh): Script khởi động sẽ bật dịch vụ sshd, kích hoạt ngrok tcp 22, tự động truy vấn API cục bộ của Ngrok (http://127.0.0.1:4040/api/tunnels) để lấy địa chỉ Host/Port động và in câu lệnh SSH trực tiếp ra log stdout.
  • Bắt tín hiệu hệ thống (Signal Trapping): Bắt các tín hiệu dừng tiến trình SIGTERMSIGINT để tắt dịch vụ an toàn, tránh tạo ra tiến trình rác (zombie processes) khi dừng container.

4. 💻 Đoạn Code Cốt Lõi Minh Họa

#!/bin/bash
set -e

echo "[INIT] Đang khởi động dịch vụ OpenSSH..."
service ssh start

if [ -n "$NGROK_AUTH_TOKEN" ]; then
    echo "[INIT] Xác thực Token Ngrok..."
    ngrok config add-authtoken "$NGROK_AUTH_TOKEN" > /dev/null 2>&1

    echo "[INIT] Thiết lập đường hầm TCP đảo ngược cho cổng 22..."
    ngrok tcp 22 --log=stdout > /dev/null &
    
    # Chờ API cục bộ của Ngrok sẵn sàng
    sleep 3

    # Truy vấn lấy endpoint công khai động
    TUNNEL_URL=$(curl -s http://127.0.0.1:4040/api/tunnels | grep -o 'tcp://[^"]*' | sed 's/tcp:\/\///')
    
    if [ -n "$TUNNEL_URL" ]; then
        HOST=$(echo "$TUNNEL_URL" | cut -d':' -f1)
        PORT=$(echo "$TUNNEL_URL" | cut -d':' -f2)
        echo "=================================================="
        echo " 🚀 ĐƯỜNG HẦM SSH ĐÃ SẴN SÀNG!"
        echo " Kết nối ngay: ssh root@$HOST -p $PORT"
        echo "=================================================="
    fi
else
    echo "[CẢNH BÁO] Chưa cung cấp NGROK_AUTH_TOKEN."
fi

# Giữ container hoạt động liên tục
exec tail -f /dev/null

5. 📊 Kết Quả Đạt Được & Giá Trị Thực Chiến

  • Kết nối Terminal trong 15 Giây: Container khởi động và trả về câu lệnh SSH sẵn sàng sử dụng chỉ sau vài giây.
  • Tiết kiệm 100% chi phí IPv4: Chạy mượt mà trên các gói container miễn phí mà không cần trả tiền mua IP tĩnh.
  • Môi trường cách ly tuyệt đối: Phục vụ hoàn hảo cho việc thử nghiệm các script nguy hiểm hoặc gỡ lỗi môi trường không sợ hỏng máy chủ chính.