DDoS กับเกมออนไลน์เป็นเรื่องปกติ

สองสามสี่สัปดาห์ที่ผ่านมาวุ่นวายกับงานจูน firewall ให้รองรับผู้เล่นเกมเกือบแสน concurrent user มาครับ

สิ่งที่พบคือ… พอผู้เล่นเยอะขนาดนี้ การใช้งานปกติก็แทบจะเป็นการ DDoS ระบบอยู่แล้ว ที่โจมตีกันมาก็เลยดูน้อยไปเลย สุดท้ายก็ไปหาทางจัดการให้ firewall รองรับการทำงานปกติได้เยอะขึ้นก็พอ

ที่ INOX เรามีทีมวิจัยพัฒนาการตั้งค่า Firewall โดย iptables บน Linux เพื่อให้มีประสิทธิภาพสูงที่สุด บนเครื่องเซิร์ฟเวอร์ราคาไม่แพง ที่ทางเราพิสูจน์มาแล้วว่า สามารถป้องกันการโจมตีหนักๆ ได้จริง และยังสามารถรองรับการใช้งานสูงมากๆ โดยที่ Latency แทบไม่เพิ่มอีกด้วย

ปัจจุบัน ด้วย server ราคาไม่เกิน 50,000 บาท เราสามารถทำให้รองรับการโจมตีได้ถึง 10Gbps หรือ Packet Rate ระดับ 5 ล้าน packet ต่อวินาทีได้โดยไม่มีผลกระทบใดๆ ต่อการใช้งานปกติเลย

(ส่วนอาการ lag อันนี้พบว่าเป็นที่ปัญหาการรองรับผู้ใช้งานของ software server เองครับ ต่อสายแลนเล่นหลัง firewall ยัง lag เลย — น้ำตาจะไหล)

การ์ดแลนสำคัญมาก

ประสิทธิภาพการรองรับปริมาณการใช้งานขึ้นอยู่กับการ์ดแลนที่ใช้งานเป็นหลัก ความสามารถที่ควรจะมีในการ์ดแลนที่ใช้งานบนเครื่อง Firewall ที่สำคัญที่สุดเลยคือ

  1. multiqueue interface: เพื่อให้สามารถใช้งาน multi core CPU ได้เต็มที่
  2. interrupt moderation: เพื่อลดปริมาณการทำงานของ CPU ในขณะที่มีปริมาณ packet สูงๆ

สำหรับการ์ดแลน Gigabit ทางเราใช้งานเฉพาะการ์ดแลน Intel I210 ขึ้นไปเท่านั้น และใน Firewall Generation ล่าสุดก็ได้เปลี่ยนมาเป็น Intel I350 แล้วเพื่อประสิทธิภาพที่ดียิ่งขึ้น

รับมือ SYN flood (และ TCP flood อื่นๆ)

การโจมตีระบบที่พบส่วนใหญ่เป็นการปลอมแปลง packet เพื่อสร้างการเชื่อมต่อใหม่เข้ามาจำนวนมากๆ ซึ่งการทำงานปกติของ server จะเป็นลักษณะนี้

  1. OS ได้รับ packet SYN ตรวจสอบแล้วมี application เปิดรอรับการเชื่อมต่ออยู่
  2. OS แจ้ง application ไปว่ามีการเชื่อมต่อใหม่เข้ามา
  3. application ตัดสินใจรับ (accept) การเชื่อมต่อ แจ้งไปหา OS
  4. OS ตอบกลับด้วย SYNACK และรอ ACK ตอบกลับจาก client
  5. ได้รับ ACK จาก client แล้ว application ได้รับแจ้งว่าการเชื่อมต่อสมบูรณ์ พร้อมรับส่งข้อมูล

ปัญหาใหญ่คือ application จะต้องรอการ ACK จาก client เพื่อให้การรับการเชื่อมต่อสมบูรณ์ ทำให้เมื่อเกิดการปลอมแปลง packet เพื่อขอเชื่อมต่อใหม่ปลอมๆ แล้ว application จะต้องรอไปเรื่อยๆ ทำให้ไม่สามารถรองรับผู้ใช้งานปกติได้

ในการนี้ Firewall จึงได้มีการพัฒนาระบบเพื่อให้ “รับไปก่อน แล้วค่อยแก้ทีหลัง” คือ

  1. Firewall ได้รับ packet SYN แล้ว ตอบ SYNACK ไปทันที รอการตอบ ACK กลับมา
  2. ถ้ามี ACK กลับมาแสดงว่าเป็นการเชื่อมต่อจาก client จริง Firewall ก็จะส่ง SYN ไปหา application เพื่อแจ้งการเชื่อมต่อใหม่
  3. เข้ากระบวนการปกติตามด้านบน

ซึ่งบน Linux ใหม่ๆ ก็รองรับความสามารถดังกล่าวแล้วในชื่อ iptables SYNPROXY โดยบน CentOS 7 ขึ้นไป หลังจากปิดการทำงานของ firewalld แล้ว สามารถตั้งค่าได้ดังนี้

  1. ปรับการทำงานของ iptables ให้อยู่ใน mode strict
sysctl -w net.netfilter.nf_conntrack_tcp_loose=0

2. ปิดการ track การขอเชื่อมต่อใหม่ (SYN) ของ iptables (แก้ — เป็นเครื่องหมายขีดสองตัวด้วยนะฮะ)

iptables -t raw -A PREROUTING -p tcp -m tcp — syn -j CT — notrack

3. เปิดใช้ SYNPROXY สำหรับทุกการเชื่อมต่อใหม่

iptables -A INPUT -p tcp -m conntrack — ctstate INVALID,UNTRACKED -j SYNPROXY — sack-perm — timestamp — wscale 7 — mss 1460

4. สั่งให้ DROP packet ที่ไม่ผ่าน SYNPROXY ทั้งหมด

iptables -A INPUT -m conntrack — ctstate INVALID -j DROP

หรือในกรณีที่เป็นเครื่อง Firewall ที่คั่นกลางระหว่างเครื่อง server จริงก็สามารถแก้ข้อ 3,4 จาก INPUT เป็น FORWARD ได้ และอย่าลืมตรวจสอบ routing table ของเครื่อง Firewall ให้ถูกต้องด้วยครับ

Like what you read? Give icez network a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.