Cloud Firewall และ VPC บน DigitalOcean: ปิดช่องโหว่เครือข่ายให้ Droplet ตั้งแต่ระดับโครงสร้าง
คู่มือ Cloud Firewalls (ฟรี) และ VPC private network ของ DigitalOcean ตั้งกฎ inbound/outbound ด้วย tag, จำกัด SSH ตาม IP, แยกฐานข้อมูลไว้ในเครือข่ายภายใน และใช้ร่วมกับ UFW และ Docker
สองแนวคิดที่ต้องรู้
- Cloud Firewall — ไฟร์วอลล์ที่ทำงาน *นอกเครื่อง* ที่ชั้นเครือข่ายของ DigitalOcean กรองแพ็กเก็ตก่อนถึง Droplet
- VPC (Virtual Private Cloud) — เครือข่ายส่วนตัวในภูมิภาคเดียวกัน ให้ Droplet คุยกันด้วย IP ภายในโดยไม่ผ่านอินเทอร์เน็ตสาธารณะ
ทั้งสองอย่างเสริมกันและเสริม UFW ภายในเครื่อง ตามหลัก "defense in depth" ที่อธิบายใน คู่มือความปลอดภัยเซิร์ฟเวอร์
Cloud Firewall คืออะไร
- ใช้งานได้โดยไม่มีค่าใช้จ่ายเพิ่ม (ตามที่ DigitalOcean ระบุ ณ เวลาที่เขียน)
- เป็นแบบ stateful ตอบกลับของการเชื่อมต่อที่อนุญาตแล้วผ่านได้เอง
- กฎ inbound (เข้า) และ outbound (ออก) แยกกัน
- ผูกกับ Droplet ได้ทั้งแบบเลือกทีละเครื่อง หรือแบบ tag (แนะนำ)
- ไม่กินทรัพยากร CPU/RAM ของ Droplet
- มีผลทันทีโดยไม่ต้องรีสตาร์ตเครื่อง
ทำไมต้องมีทั้ง Cloud Firewall และ UFW
| หัวข้อ | Cloud Firewall | UFW |
|---|---|---|
| ทำงานที่ | นอกเครื่อง (ระดับเครือข่าย) | ในระบบปฏิบัติการ |
| จัดการหลายเครื่องพร้อมกัน | ได้ (ผ่าน tag) | ต้องตั้งทีละเครื่อง |
| ถูกข้ามโดย Docker publish port | ไม่ถูกข้าม | ถูกข้ามได้ (iptables ของ Docker) |
| ถ้าแฮกเกอร์ได้ root | แก้กฎไม่ได้จากในเครื่อง | แก้ได้ |
เพราะ Docker จัดการ iptables เอง พอร์ตที่ publish จึงอาจเปิดสู่โลกแม้ UFW ปิดไว้ Cloud Firewall จึงเป็นด่านที่เชื่อถือได้กว่าสำหรับเครื่องที่รัน Docker ดู ติดตั้ง Docker บน Droplet
สร้าง Cloud Firewall ทีละขั้น
- Control Panel → Networking → Firewalls → Create Firewall
- ตั้งชื่อ เช่น
web-basic - ตั้ง Inbound Rules
- ตั้ง Outbound Rules (ปกติเปิดไว้ตามค่าเริ่มต้นได้)
- ใส่ชื่อ tag ใน "Apply to Droplets" เช่น
web - ติด tag
webให้ Droplet ที่ต้องการ
ชุดกฎ inbound พื้นฐานสำหรับเว็บ
| Type | Protocol | Port | Sources |
|---|---|---|---|
| SSH | TCP | 22 | IP ที่ทำงานของคุณ (หรือ VPN) |
| HTTP | TCP | 80 | All IPv4, All IPv6 |
| HTTPS | TCP | 443 | All IPv4, All IPv6 |
| ICMP | ICMP | - | All (ถ้าต้องการ ping ตรวจสอบ) |
พอร์ตอื่นที่ไม่ใส่ในรายการถูกปฏิเสธโดยอัตโนมัติ (default deny)
จำกัด SSH ให้เฉพาะ IP ของคุณ
ถ้าอินเทอร์เน็ตที่บ้านเป็น IP ไดนามิก ให้ใช้ VPN หรือ bastion host (เครื่องกลางที่มี IP คงที่) เป็นทางเข้า เพื่อไม่ต้องเปิดพอร์ต 22 ให้ทั้งโลก ลดการสแกนรหัสผ่านอัตโนมัติได้มาก ควบคู่กับ SSH key และปิดการล็อกอินด้วยรหัสผ่าน
ใช้ tag จัดกลุ่มเครื่อง
| tag | บทบาท | กฎเด่น |
|---|---|---|
web | เซิร์ฟเวอร์เว็บ | 80/443 เปิดสาธารณะ |
db | ฐานข้อมูล | 5432/3306 เปิดเฉพาะจาก tag web |
admin | เครื่องดูแลระบบ | 22 จาก IP ของทีม |
กฎ "Sources" ใส่ tag อื่น ได้ ทำให้ฐานข้อมูลรับการเชื่อมต่อเฉพาะจากเว็บเซิร์ฟเวอร์ที่ติด tag web เท่านั้น เครื่องใหม่ที่ติด tag จะได้กฎอัตโนมัติ
VPC: เครือข่ายส่วนตัว
ทุกบัญชีมี VPC เริ่มต้นต่อภูมิภาค และ Droplet ใหม่จะอยู่ใน VPC นั้นโดยอัตโนมัติ Droplet ใน VPC เดียวกันคุยกันผ่าน private IP (เช่นช่วง 10.x.x.x)
ประโยชน์
- ฐานข้อมูลไม่ต้องเปิดพอร์ตออกอินเทอร์เน็ตสาธารณะ
- เวลาแฝงต่ำและปลอดภัยกว่า
- ทราฟฟิกระหว่างเครื่องใน VPC ไม่นับเป็น bandwidth สาธารณะตามเอกสารของ DigitalOcean (ตรวจเงื่อนไขล่าสุดในหน้า Pricing/Docs)
- จัดแยกสภาพแวดล้อม เช่น production กับ staging ด้วย VPC คนละอัน
ตัวอย่างสถาปัตยกรรม 3 ชั้น
อินเทอร์เน็ต
│ (80/443)
[Load Balancer]
│ private IP
[web-1] [web-2] ← tag: web
│ private IP (3306/5432)
[db-1] ← tag: db (ไม่มี public rule)
ดู คู่มือ Load Balancer สำหรับตัวบาลานซ์ด้านบน และ คู่มือ Managed Databases ถ้าใช้ฐานข้อมูลแบบ Managed ซึ่งรองรับ Trusted Sources (จำกัดว่าเครื่องใดเชื่อมต่อได้)
ดู private IP
ip -4 addr show eth1
curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address
(ชื่ออินเทอร์เฟซอาจต่างกันตาม image ใช้ ip addr เพื่อดูทั้งหมด)
ตัวอย่าง: ใช้ doctl สร้างไฟร์วอลล์
doctl compute firewall create \
--name web-basic \
--tag-names web \
--inbound-rules "protocol:tcp,ports:22,address:203.0.113.5/32 protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \
--outbound-rules "protocol:tcp,ports:all,address:0.0.0.0/0,address:::/0 protocol:udp,ports:all,address:0.0.0.0/0,address:::/0 protocol:icmp,address:0.0.0.0/0,address:::/0"
แทน 203.0.113.5 ด้วย IP จริงของคุณ ตรวจ syntax ล่าสุดด้วย doctl compute firewall create --help
ข้อผิดพลาดที่พบบ่อย
- ล็อกตัวเองออกจากเครื่อง: ตั้ง SSH ให้ IP ผิดแล้วเข้าไม่ได้ ใช้ Recovery Console ใน Control Panel เข้าเครื่องและแก้กฎ ก่อนแก้ให้เปิด console ไว้อีกหน้าต่างทดสอบ
- ลืมเปิดพอร์ต 80 ตอนขอ SSL: Let's Encrypt แบบ HTTP-01 ต้องเข้าพอร์ต 80 ได้ ดู Deploy Node.js บน Droplet
- เปิดฐานข้อมูลสู่ 0.0.0.0/0: ห้ามทำ จำกัดเป็น tag หรือ private IP
- ลืมติด tag กับเครื่องใหม่: เครื่องที่ไม่มีไฟร์วอลล์ผูกอยู่ไม่ถูกกรองที่ชั้นนี้
- ปิด outbound ทั้งหมดโดยไม่ตั้งใจ: ทำให้ apt update, DNS และ API ภายนอกใช้ไม่ได้
- คิดว่า Cloud Firewall แทนการอัปเดตระบบ: ไม่ใช่ ต้อง patch เป็นประจำเสมอ
รายการตรวจก่อนเปิดใช้งานจริง
- [ ] SSH ใช้ key และปิดรหัสผ่าน
- [ ] Cloud Firewall ผูกกับทุกเครื่อง (ผ่าน tag)
- [ ] ฐานข้อมูลไม่มี public access
- [ ] UFW เปิดใช้เป็นชั้นเสริม
- [ ] ตั้ง alert เมื่อทราฟฟิกผิดปกติ ดู Monitoring และ Alerts
- [ ] มีแผนสำรองข้อมูล ดู Backups และ Snapshots
คำถามที่พบบ่อย
Cloud Firewall ป้องกัน DDoS ได้ไหม
ไม่ใช่เครื่องมือป้องกัน DDoS โดยตรง แต่ช่วยลดพื้นผิวการโจมตีโดยปิดพอร์ตที่ไม่ใช้ สำหรับเว็บสาธารณะที่ถูกโจมตีหนักควรพิจารณา CDN/WAF เพิ่มเติม
ต้องจ่ายเพิ่มสำหรับ VPC ไหม
ไม่มีค่าใช้จ่ายเพิ่มสำหรับตัว VPC ตามเอกสาร ณ เวลาที่เขียน ตรวจเงื่อนไขล่าสุดที่ ราคา DigitalOcean ทุกบริการ
ย้าย Droplet ข้าม VPC ได้ไหม
ปกติทำผ่านการสร้าง snapshot แล้วสร้าง Droplet ใหม่เข้า VPC ที่ต้องการ หรือใช้ฟีเจอร์ย้ายตามที่ Control Panel รองรับ ณ ขณะนั้น
บริการใดบ้างที่ใช้กับ Cloud Firewall ได้
ใช้กับ Droplet เป็นหลัก บริการอื่นอย่าง Managed Database มีระบบ Trusted Sources ของตัวเอง ส่วน App Platform ดู คู่มือ App Platform