Skip to main content

> Jitrak Blog

>_ Remote Access: Restrict Access with Cloudflare Access (3/3)

# เข้าเครื่องจากนอกบ้าน (3/3) — จำกัดผู้เข้าใช้ด้วย Cloudflare Access และ Email OTP จาก Zero Trust dashboard

@ Yosapol Jitrak | 7 Jun 2026 17:35

Series: เข้าเครื่องจากนอกบ้าน (3 ส่วน)

  1. Remote Access: Expose Services with Cloudflare Tunnel (1/3) — ติดตั้ง cloudflared สร้าง tunnel ทดสอบ expose localhost
  2. Remote Access: Auto-start After Reboot with systemd (2/3) — systemd คืออะไร ประยุกต์กับ cloudflared
  3. Remote Access: Restrict Access with Cloudflare Access (3/3) — Email OTP ผ่าน Zero Trust (บทความนี้)

แพลตฟอร์ม: การตั้ง Access ทำผ่าน Zero Trust dashboard — ไม่ผูก OS ของเครื่องที่รัน tunnel แต่ส่วน 1–2 ของ series สมมติว่า tunnel รันบน Linux ด้วย cloudflared (ใช้ได้บน macOS/Windows เช่นกัน)

Prerequisites

Cloudflare Access คืออะไร?

Tunnel ทำให้ service บ้านเข้าถึงได้จากอินเทอร์เน็ต — แต่ยังเปิดให้ใครก็ได้ที่รู้ URL เข้ามาได้ Cloudflare Access เป็นเลเยอร์ authentication ที่ Cloudflare Edge ตรวจสิทธิ์ก่อนส่ง request เข้า tunnel

sequenceDiagram
    actor User
    participant CF as Cloudflare Edge
    participant Access as Cloudflare Access
    participant Tunnel as cloudflared
    participant Server as Local Server

    User->>CF: https://app.example.com
    CF->>Access: Check authorization
    Access-->>User: Send Email OTP
    User->>Access: Verify OTP
    Access->>Access: Allow
    Access-->>CF: Establish tunnel session
    CF->>Tunnel: Forward request via tunnel
    Tunnel->>Server: Forward to localhost:3000
    Server-->>Tunnel: Response
    Tunnel-->>CF: Return via tunnel
    CF-->>User: Display page

Cloudflare Tunnel + Access workflow

Step 1: เปิด One-time PIN เป็น identity provider

ก่อนสร้าง application ต้องมี identity provider (IdP) อย่างน้อยหนึ่งตัวให้ Access ใช้ยืนยันตัวตน — guide นี้ใช้ Email OTP เพราะไม่ต้องตั้งค่าภายนอก

สำคัญ (บัญชีใหม่ตั้งแต่ พ.ค. 2026): ตอนนี้ Cloudflare ตั้ง Cloudflare account login เป็น default IdP ของบัญชี Zero Trust ที่สร้างใหม่ แทน One-time PIN (changelog) — ถ้าอยากใช้ Email OTP ตามบทนี้ ต้องเพิ่ม One-time PIN เอง

ไปที่ one.dash.cloudflare.com

  1. Settings (หรือ Integrations) → Identity providersAdd new
  2. เลือก One-time PINSave

ดูรายละเอียดที่ เอกสาร One-time PIN login

Tip: ถ้าองค์กรใช้ email scanner (เช่น Mimecast, Barracuda) ให้ whitelist [email protected] ไม่งั้น scanner อาจเปิดลิงก์ใน email ทำให้ OTP ถูกใช้ก่อนคุณกรอก

Step 2: สร้าง Access Application

ที่ one.dash.cloudflare.com

  1. Access controlsApplicationsCreate new application
  2. เลือก Self-hosted (เวอร์ชันใหม่อาจเขียนว่า Self-hosted and private) → Add public hostname
  3. เลือก Domain จาก dropdown แล้วใส่ subdomain ให้ตรงกับ hostname ที่ expose (app.yourdomain.com)
  4. Session Duration — เลือกอายุ token (เช่น 24 hours)
  5. ส่วน identity providers / authentication — เลือก One-time PIN (ที่เพิ่งเพิ่มใน Step 1)
  6. ตั้ง Policy (Access เป็น deny by default ต้องมี Allow policy อย่างน้อยหนึ่ง):
    • Policy name: Allow me only
    • Action: Allow
    • Add rule: Rule type = Include, Selector = Emails, Value = email ของคุณ
  7. กด Create / Add application

จากนี้เมื่อมีคนเข้า URL จะถูก redirect ไปหน้า Cloudflare Access ก่อน ระบบส่ง OTP ไปยัง email verify แล้วจึงเข้าได้

Note: Cloudflare Access รองรับ identity provider หลายแบบ เช่น GitHub, Google, Azure AD, Okta ฯลฯ — guide นี้ใช้ Email OTP เป็นตัวอย่างเพราะไม่ต้องตั้งค่าเพิ่ม

Tip (ความปลอดภัย): เอกสาร Cloudflare แนะนำให้สร้าง Access application ก่อน เปิด tunnel route — แต่ใน series นี้เราเปิด tunnel ตั้งแต่ post 38 ทำให้ช่วงก่อนตั้ง Access (post นี้) URL เปิดให้ใครก็ได้ที่รู้ที่อยู่ ถ้ากังวล ให้หยุด tunnel ไว้ก่อนจนกว่าจะตั้ง Access เสร็จ (self-hosted public app)

ทดสอบ

เปิด incognito window แล้วเข้า https://app.yourdomain.com — ควรเห็นหน้า Cloudflare Access login แทนหน้าเว็บ service โดยตรง

หลัง verify OTP สำเร็จ จะเห็นหน้าเว็บ service ตามปกติ session คงอยู่ตาม Session Duration ที่ตั้งไว้

Troubleshooting

ปัญหาสาเหตุวิธีแก้
หน้า login บอกว่าส่ง email แต่ไม่ได้รับEmail ไม่อยู่ใน Allow policy — Cloudflare จะไม่ส่ง แต่ยังขึ้นว่าส่งแล้ว (กัน account enumeration)ตรวจว่า email ตรงกับ Allow policy เป๊ะ ๆ
ได้รับ email ช้า / ไปอยู่ spamEmail อยู่ใน spam หรือถูก mail security กรองเช็ค spam/junk และ whitelist [email protected]
This One-Time PIN has already been usedEmail scanner เปิดลิงก์ก่อน หรือ OTP ถูกใช้ไปแล้ว (ใช้ได้ครั้งเดียว)กด Request new code และ allowlist [email protected] ใน scanner
OTP ใช้ไม่ได้ / หมดอายุOTP มีอายุ 10 นาที และใช้ได้ครั้งเดียว ขอใหม่จะยกเลิกอันเก่ากด Request new code แล้วกรอกภายใน 10 นาที
เข้า URL แล้วไม่เห็นหน้า AccessPolicy ยังไม่ applyรอ 1–2 นาที หรือลอง incognito อีกครั้ง
OTP verify แล้วได้ 403Email ไม่อยู่ใน policyเพิ่ม email ใน Allow policy หรือตรวจ typo

สรุป Series: เข้าเครื่องจากนอกบ้าน

ทำครบ 3 ส่วนแล้วได้:

  • เปิด tunnel expose service — ด้วย Cloudflare Tunnel (1/3)
  • รันอัตโนมัติหลัง reboot — ด้วย systemd (2/3)
  • จำกัดผู้เข้าใช้ — ด้วย Cloudflare Access (3/3)

สิ่งที่ได้รวม:

  • ไม่ต้องมี public IP — ทำงานได้แม้ ISP ใช้ CG-NAT
  • ไม่ต้อง port forward — ปลอดภัยกว่าวิธีเดิม
  • HTTPS ฟรี — Cloudflare จัดการ certificate ให้อัตโนมัติ
  • Cloudflare Access ฟรี — Zero Trust free plan รองรับได้ถึง 50 users เพิ่ม Email OTP login ได้ทันที (Cloudflare Access pricing)
  • Auto-restart ด้วย systemd — ไม่ต้องมา start manual ทุกครั้ง
~/shortcuts

> Keyboard shortcuts

  • Toggle this help?H
  • Back to topT
  • Scroll downJ
  • Scroll upK
  • Forward (newer post or next page)F
  • Back (older post or previous page)B
  • Go homeG
  • Close helpEsc