12/04/2026 18:17น.

EP.87 การเพิ่มฟีเจอร์การป้องกันการโจมตี DDoS ใน WebSocket Server
#Go
#Golang
#WebSocket
#DDoS
#ความปลอดภัย
WebSocket Server คือหัวใจสำคัญของแอปพลิเคชันแบบเรียลไทม์ เช่น ระบบแชท, เกมออนไลน์ หรือการแจ้งเตือนทันที แต่เมื่อระบบเปิดให้เชื่อมต่อจากผู้ใช้จำนวนมาก ก็มีความเสี่ยงต่อการถูกโจมตี เช่น:
- DDoS (Distributed Denial-of-Service)
- Connection Flood
- Malformed Frame Attack
บทความนี้จะพาคุณเรียนรู้ เทคนิคการป้องกัน WebSocket Server ให้แข็งแกร่งและพร้อมสำหรับใช้งานจริงใน production 🌐
☠️ ประเภทของการโจมตีที่พบบ่อยใน WebSocket
| ประเภทการโจมตี | คำอธิบาย |
|---|---|
| DDoS (Distributed Denial-of-Service) | การส่งคำขอจำนวนมากจากหลายแหล่งพร้อมกัน เพื่อทำให้เซิร์ฟเวอร์ล่ม |
| Connection Flood | การเปิด WebSocket connection จำนวนมากจาก IP เดียว (หรือหลาย IP) จนใช้ทรัพยากรเกินกำลัง |
| Malformed Frame Attack | การส่งข้อมูลที่ไม่เป็นไปตามมาตรฐาน WebSocket เพื่อให้ server crash หรือค้าง |
🔒 วิธีป้องกัน WebSocket Server
1. จำกัดจำนวน Connection ต่อ IP
ใช้ Rate Limiting หรือ Connection Throttling เพื่อควบคุมไม่ให้ client เชื่อมต่อมากเกินไป
✅ ตัวอย่าง Go Code (Fiber + WebSocket):
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/websocket/v2"
"sync"
)
var connections = make(map[string]int)
var mu sync.Mutex
const maxConnectionsPerIP = 5
func main() {
app := fiber.New()
app.Get("/ws", websocket.New(func(c *websocket.Conn) {
ip := c.RemoteAddr().String()
mu.Lock()
connections[ip]++
if connections[ip] > maxConnectionsPerIP {
mu.Unlock()
c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.ClosePolicyViolation, "Too many connections"))
c.Close()
return
}
mu.Unlock()
defer func() {
mu.Lock()
connections[ip]--
mu.Unlock()
c.Close()
}()
for {
_, msg, err := c.ReadMessage()
if err != nil {
break
}
c.WriteMessage(websocket.TextMessage, msg)
}
}))
app.Listen(":8080")
}
🔍 อธิบาย: ใช้ map เก็บจำนวน connection ต่อ IP และปฏิเสธทันทีเมื่อเกินลิมิต
2. ตรวจจับ Malformed Frames
โค้ด WebSocket ควรจับ error ที่เกิดจาก frame ที่ไม่ถูกต้อง เพื่อป้องกันไม่ให้ server ค้าง
✅ ตัวอย่างโค้ด:
for {
messageType, msg, err := c.ReadMessage()
if err != nil {
if websocket.IsCloseError(err, websocket.CloseProtocolError) {
fmt.Println("Malformed frame detected from:", c.RemoteAddr())
}
break
}
fmt.Println("Received message:", string(msg))
c.WriteMessage(messageType, msg)
}
🔍 อธิบาย: ตรวจสอบ error ว่าเป็น protocol error หรือไม่ เพื่อ logging และ block client ได้หากจำเป็น
3. ใช้ Firewall หรือ Reverse Proxy ป้องกันภายนอก
นอกจากโค้ดแล้ว ควรใช้ระบบหน้าด่านเพื่อกรอง traffic ที่ผิดปกติ เช่น:
| เครื่องมือ | การใช้งาน |
|---|---|
| NGINX / Cloudflare | Rate limiting, IP block, DoS mitigation |
| iptables | Limit connection ต่อ IP |
| Cloud WAF | ป้องกัน DDoS และ WebSocket attack โดยเฉพาะ |
✅ ตัวอย่าง Config NGINX:
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
location /ws {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
limit_conn addr 5; # จำกัด connection ต่อ IP
}
}
🧠 สรุปสิ่งที่ได้เรียนรู้
- WebSocket Server ต้องเผชิญความเสี่ยงจาก DDoS และ malformed traffic
- ควรจำกัดการเชื่อมต่อต่อ IP และตรวจจับ frame ที่ไม่ถูกต้อง
- ใช้ firewall หรือ reverse proxy ร่วมด้วยเพื่อป้องกันระดับ network
✅ เมื่อป้องกันครบทั้งในระดับโค้ดและโครงสร้างระบบ — WebSocket Server ของคุณจะ พร้อมใช้งานจริง ปลอดภัย และรับโหลดหนักได้
🚀 ท้าให้ลอง
- ทดลองรัน WebSocket Server พร้อม limit IP
- ส่ง frame ผิดรูปแบบเพื่อทดสอบระบบ
- ลอง deploy ระบบผ่าน Cloudflare และทดสอบ rate limit
🔜 อีพีต่อไป
EP.88: การสร้างระบบแชทรองรับหลายห้อง (Multi-room Chat Management)
เรียนรู้วิธีสร้างแชทหลายห้องแยกกัน พร้อมจัดการสมาชิกในแต่ละห้อง และรองรับ real-time communication อย่างมีประสิทธิภาพ!
อ่านบทความ Series อื่นๆ
🔵 Facebook: https://www.facebook.com/superdev.academy.th
🔴 YouTube : Superdev Academy
📸 Instagram: Superdev Academy
🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH
🌐 Website: https://www.superdevacademy.com/