Series: เข้าเครื่องจากนอกบ้าน (3 ส่วน)
- Remote Access: Expose Services with Cloudflare Tunnel (1/3) — ติดตั้ง cloudflared สร้าง tunnel ทดสอบ expose localhost
- Remote Access: Auto-start After Reboot with systemd (2/3) — systemd คืออะไร ประยุกต์กับ cloudflared
- 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
- ทำตาม เข้าเครื่องจากนอกบ้าน (1/3): Cloudflare Tunnel จน tunnel ใช้งานได้
- ทำตาม เข้าเครื่องจากนอกบ้าน (2/3): systemd จน tunnel รันอัตโนมัติ
- รู้ hostname ที่ expose แล้ว (ตัวอย่าง
app.yourdomain.com)
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

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
- Settings (หรือ Integrations) → Identity providers → Add new
- เลือก One-time PIN → Save
ดูรายละเอียดที่ เอกสาร One-time PIN login
Tip: ถ้าองค์กรใช้ email scanner (เช่น Mimecast, Barracuda) ให้ whitelist
[email protected]ไม่งั้น scanner อาจเปิดลิงก์ใน email ทำให้ OTP ถูกใช้ก่อนคุณกรอก
Step 2: สร้าง Access Application
- Access controls → Applications → Create new application
- เลือก Self-hosted (เวอร์ชันใหม่อาจเขียนว่า Self-hosted and private) → Add public hostname
- เลือก Domain จาก dropdown แล้วใส่ subdomain ให้ตรงกับ hostname ที่ expose (
app.yourdomain.com) - Session Duration — เลือกอายุ token (เช่น 24 hours)
- ส่วน identity providers / authentication — เลือก One-time PIN (ที่เพิ่งเพิ่มใน Step 1)
- ตั้ง Policy (Access เป็น deny by default ต้องมี Allow policy อย่างน้อยหนึ่ง):
- Policy name:
Allow me only - Action:
Allow - Add rule: Rule type =
Include, Selector =Emails, Value = email ของคุณ
- Policy name:
- กด 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 ช้า / ไปอยู่ spam | Email อยู่ใน spam หรือถูก mail security กรอง | เช็ค spam/junk และ whitelist [email protected] |
This One-Time PIN has already been used | Email scanner เปิดลิงก์ก่อน หรือ OTP ถูกใช้ไปแล้ว (ใช้ได้ครั้งเดียว) | กด Request new code และ allowlist [email protected] ใน scanner |
| OTP ใช้ไม่ได้ / หมดอายุ | OTP มีอายุ 10 นาที และใช้ได้ครั้งเดียว ขอใหม่จะยกเลิกอันเก่า | กด Request new code แล้วกรอกภายใน 10 นาที |
| เข้า URL แล้วไม่เห็นหน้า Access | Policy ยังไม่ apply | รอ 1–2 นาที หรือลอง incognito อีกครั้ง |
| OTP verify แล้วได้ 403 | Email ไม่อยู่ใน 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 ทุกครั้ง