SELF HOSTING

Hướng dẫn cài đặt Pangolin – Giải pháp Reverse Proxy thay thế Cloudflare Tunnel

Bạn đang vận hành một server tại nhà (Homelab) và muốn truy cập nó từ xa? Cách truyền thống là mở cổng (Port Forwarding) trên Router. Tuy nhiên, hành động này giống như việc bạn mở toang cửa sổ ngôi nhà của mình để mời kẻ trộm (hacker) vào.

Thế giới công nghệ đang chuyển dịch sang mô hình Zero Trust (Không tin bất kỳ ai), nơi mọi truy cập đều phải được xác thực danh tính. Pangolin chính là giải pháp mã nguồn mở tiên phong giúp bạn thực hiện điều này.

Pangolin là gì?

Pangolin là một Identity-Aware Tunneled Reverse Proxy. Nói đơn giản, nó giúp bạn đưa các ứng dụng nội bộ (như Home Assistant, Plex, Website cá nhân) ra Internet thông qua một đường hầm mã hóa an toàn, có tích hợp sẵn màn hình đăng nhập (SSO) để bảo vệ, mà không cần mở bất kỳ cổng nào tại nhà.

Nó là sự thay thế hoàn hảo cho Cloudflare Tunnel nếu bạn muốn kiểm soát 100% dữ liệu của mình (Self-hosted).

Kiến trúc hoạt động của Pangolin

Trước khi bắt tay vào cài đặt, hãy hiểu nhanh cách Pangolin hoạt động để tránh lỗi trong quá trình cấu hình. Hệ thống gồm 2 phần chính:

  1. Pangolin Server (VPS): Đóng vai trò là trung tâm, có địa chỉ IP công cộng. Nó chứa:
    • Pangolin Core: Giao diện quản lý (Dashboard).
    • Gerbil: Máy chủ WireGuard quản lý kết nối.
    • Traefik: Reverse Proxy xử lý lưu lượng web và SSL.
  2. Pangolin Client (Newt): Chạy tại mạng nội bộ (nhà bạn), tạo đường hầm kết nối tới VPS.

Hướng dẫn cài đặt Server (Trên VPS)

Chúng ta sẽ sử dụng Docker Compose để triển khai nhanh chóng và chuẩn xác.

Yêu cầu chuẩn bị

  • Một VPS chạy Linux (Ubuntu/Debian) với tối thiểu 2GB RAM.
  • Tên miền (Domain) đã trỏ về IP của VPS (Nên dùng Wildcard DNS, ví dụ: *.ban.com trỏ về IP).
  • Đã cài đặt Docker và Docker Compose.

Bước 1: Tạo file cấu hình

Tạo thư mục và file docker-compose.yml:

mkdir pangolin && cd pangolin
nano docker-compose.yml

Dán nội dung sau vào (đây là cấu hình đã được tối ưu hóa network):

services:
  # 1. CORE & DASHBOARD
  pangolin:
    image: fosrl/pangolin:latest
    container_name: pangolin
    restart: unless-stopped
    volumes:
      - ./config:/app/config
      - pangolin-data:/var/certificates
      - pangolin-data:/var/dynamic
    environment:
      - PANGOLIN_Encryption_Secret=HAY_THAY_DOI_CHUOI_NAY_BANG_32_KY_TU_NGAU_NHIEN
      - LOG_LEVEL=info
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3001/api/health"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - pangolin_net

  # 2. TUNNEL SERVER (GERBIL)
  gerbil:
    image: fosrl/gerbil:latest
    container_name: gerbil
    restart: unless-stopped
    depends_on:
      pangolin:
        condition: service_healthy
    command:
      - --reachableAt=http://gerbil:3004 
      - --generateAndSaveKeyTo=/var/config/key
      - --remoteConfig=http://pangolin:3001/api/v1/ 
    volumes:
      - ./config/:/var/config
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    ports:
      - "51820:51820/udp" # Cổng WireGuard
      - "443:443"         # Cổng Web HTTPS
      - "80:80"           # Cổng Web HTTP
    networks:
      - pangolin_net

  # 3. PROXY ENGINE (TRAEFIK)
  traefik:
    image: traefik:v3.4
    container_name: traefik
    restart: unless-stopped
    # QUAN TRỌNG: Chạy chung network namespace với Gerbil để hứng traffic từ tunnel
    network_mode: service:gerbil 
    depends_on:
      pangolin:
        condition: service_healthy
    command:
      - --providers.file.directory=/etc/traefik/dynamic
      - --providers.file.watch=true
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entryPoint.to=websecure
      - --entrypoints.web.http.redirections.entryPoint.scheme=https
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.myresolver.acme.tlschallenge=true
      - --certificatesresolvers.myresolver.acme.email=admin@email-cua-ban.com
      - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
    volumes:
      - ./letsencrypt:/letsencrypt
      - pangolin-data:/etc/traefik/dynamic:ro

volumes:
  pangolin-data:

networks:
  pangolin_net:
    driver: bridge

Bước 2: Khởi chạy

Chạy lệnh sau để kích hoạt hệ thống:

docker compose up -d

Sau vài phút, hãy truy cập vào http://IP-VPS-CUA-BAN. Bạn sẽ thấy giao diện cài đặt ban đầu để tạo tài khoản Admin và cấu hình tên miền gốc.

Hướng dẫn kết nối Client (Tại nhà)

Bây giờ, hãy kết nối mạng nội bộ của bạn với Server vừa tạo.

  1. Truy cập Dashboard Pangolin trên VPS, vào mục Sites -> Add Site.
  2. Lưu lại Site IDSite Secret.
  3. Trên máy chủ tại nhà (ví dụ: Raspberry Pi), chạy container Newt:
docker run -d --name newt \
  --restart always \
  --network host \
  fosrl/newt:latest \
  --id=SITE_ID_CUA_BAN \
  --secret=SITE_SECRET_CUA_BAN \
  --endpoint=https://domain-cua-ban.com
LƯU Ý: 
--network host giúp Newt dễ dàng nhìn thấy các thiết bị khác trong mạng LAN của bạn.

Nếu Dashboard báo trạng thái Site chuyển sang màu xanh lá cây (Online), chúc mừng bạn đã tạo thành công đường hầm bảo mật!

Cấu hình bảo mật và Public dịch vụ

Public một ứng dụng (Ví dụ: Portainer)

Giả sử Portainer của bạn đang chạy ở IP 192.168.1.100:9000.

  1. Vào Dashboard -> Resources -> Add Resource.
  2. Name: Portainer Home.
  3. Domain: portainer.domain-cua-ban.com.
  4. Target: Chọn Site bạn vừa kết nối.
  5. Destination: http://192.168.1.100:9000.
  6. Bấm Save. Ngay lập tức, bạn có thể truy cập Portainer qua tên miền với HTTPS (SSL) tự động.

Kích hoạt xác thực (SSO)

Để ngăn người lạ truy cập, hãy bật tính năng xác thực:

  1. Vào Identity Providers, cấu hình Google hoặc GitHub OAuth.
  2. Quay lại Resource Portainer, bật “Enable Authentication”.Bây giờ, ai muốn vào Portainer sẽ phải đăng nhập bằng Google Account mà bạn cho phép.

Pro Tip: Tối ưu SEO cho Blog chạy qua Proxy

Nếu bạn dùng Pangolin để chạy Blog, vấn đề lớn nhất là: Làm sao chặn người lạ nhưng vẫn mở cửa cho Google Bot để SEO?

Pangolin hỗ trợ tính năng Context-Aware Policies (Chính sách nhận biết ngữ cảnh) để giải quyết vấn đề này.

Cách cấu hình:

  1. Vào Access Policies, tạo Policy mới.
  2. Tạo Rule cho Bot:
    • Match: Header User-Agent chứa Googlebot.
    • Action: Bypass Authentication (Cho qua không cần đăng nhập).
  3. Tạo Rule mặc định:
    • Match: Tất cả (Any).
    • Action: Authenticate (Bắt buộc đăng nhập).

Cảnh báo: Hãy sử dụng cẩn thận để tránh bị Google phạt lỗi Cloaking. Nội dung Bot thấy và người dùng thấy (sau khi đăng nhập) không nên quá khác biệt về mặt cấu trúc.

CẢNH BÁO:
Hãy sử dụng cẩn thận để tránh bị Google phạt lỗi Cloaking. Nội dung Bot thấy và người dùng thấy (sau khi đăng nhập) không nên quá khác biệt về mặt cấu trúc.

So sánh nhanh: Pangolin vs. Cloudflare Tunnel

Tiêu chíPangolinCloudflare Tunnel
Quyền riêng tưDữ liệu 100% trên VPS của bạnDữ liệu đi qua mạng lưới Cloudflare
Chi phíTốn tiền thuê VPSMiễn phí (gói cơ bản)
Tốc độPhụ thuộc vị trí VPS (Kiểm soát được)Phụ thuộc Routing của Cloudflare
Mở Port tại nhàKhôngKhông
Độ khóTrung bình (Cần biết Docker)Dễ

Pangolin là một bước tiến tuyệt vời cho cộng đồng Self-hosted. Nó mang lại sức mạnh bảo mật của doanh nghiệp lớn (Zero Trust) vào một giao diện thân thiện, dễ sử dụng. Nếu bạn coi trọng quyền riêng tư dữ liệu và muốn làm chủ hạ tầng mạng của mình, Pangolin là sự lựa chọn không thể bỏ qua.

Bạn đã sẵn sàng nâng cấp hệ thống Homelab của mình chưa?

Hãy thử cài đặt theo hướng dẫn trên và chia sẻ trải nghiệm (hoặc lỗi nếu gặp phải) ở phần bình luận bên dưới nhé!

Duy Nghiện
Hãy làm khán giả, đừng làm nhân vật chính :)

You may also like

Nhận thông báo qua email
Nhận thông báo cho
guest

0 Bình luận
Mới nhất
Cũ nhất Nhiều like nhất
Phản hồi nội tuyến
Xem tất cả bình luận