การดู : 0

12/04/2026 18:17น.

EP.87 การเพิ่มฟีเจอร์การป้องกันการโจมตี DDoS ใน WebSocket Server

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 / CloudflareRate limiting, IP block, DoS mitigation
iptablesLimit 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/