แนวทางแก้ปัญหาของการยิงออกจาก Server เราไปโจมตีผู้อื่น

วิเคราะห์ปัญหา
การยิงออกไปยังข้างนอกเกิดจากสองสาเหตุหลัก ใหญ่ ๆ

  1. ลูกค้าจงใจใส่ script แล้วยิงคนอื่น
  2. ลูกค้าถูก Hack แล้ววาง Script ยิงผู้อื่น

การยิงมี 2 แบบคือ

  1. ยิงออกด้วย UDP อันนี้จะทำให้ให้ Traffic เต็ม ผมจะเจออันนี้ก่อนเป็นอันดับแรกเลยครับ ไม่ได้มีผลกับคนอื่นเท่านั้นแต่มีผลกับ Network เราด้วยครับ
  2. ยิงออกด้วย TCP อันนี้จะเป็นลักษณะไปเรียกเว็บอื่นๆ ส่วนใหญ่ผมจะไม่ค่อยเจอตัวนี้ครับ
    เพราะถ้าตัวนี้ยิงออกมากๆ Server มักจะไปก่อนเพราะ RAM ไม่พอ แต่ก็ไม่แน่เหมือนกันถ้ามันใช้ Socket

ที่นี้เราจะทำที่ไหนก็มีรูปแบบการทำ 2 แบบ
แบบแรก เป็น VPS ผู้มห้บริการควรทำที่เครื่องหลัก อย่าลืมตั้งกฎไว้ก่อนเราติดตั้ง Firewall ที่เครื่องหลัก หากต้องการเปิด port ไหนให้บอก
แบบที่ สองเป็นเครื่องของตนเองไม่ได้ลงเป็นแบบ VPS หรือเป็นเครื่องที่ตนเองเช่า VPS มาอีกทีหนึ่งครับ

วางแผน Firewall อันนี้วางแผนเฉพาะป้องกันเราไปโจมตีคนอื่นนะครับ ไม่ใช่ป้องกันคนอื่นโจมตีเรา (ป้องกันคนอื่นโจมตีเรามีเยอะลองหาดูใน gg)

  1. ตรวจสอบการใช้งาน UDP ว่าเราจำเป็นต้องใช้ Port อะไรบ้าง
    ตัวอย่างของผม
    • ผมต้องใช้ DNS Port 53 และใช้เรียก DNS 61.19.245.245 และ 61.19.245.245 เท่านั้น (DNS ของ CAT IDC ของคนอื่นก็ไปดูเอาเอง)
    • ผมต้องใช้ NTP Port 123 สำหรับ Update เวลา คือ IP 158.108.212.157 ใครใช้อันไหนก็ไปหา IP มา อันนี้ถ้าเป็น VPS ก็ไม่ต้องเพราะอ้างอิงเครื่องหลักอยู่แล้ว
      สรุปถ้าใช้งานอย่างเดียวก็มีแค่ UDP Port 53 เท่านั้นที่ต้องใช้ ดังนั้น Port อื่นๆ Block ได้เลย

กรณีเป็นเครื่อง VPS หรือตัวจริงที่ใช้งาน ให้ทำการเพิ่มคำสั่งดังนี้

เคลียข้อมูล iptables กรณีมี กฎอื่นๆ อยู่ก่อนหน้า ไม่ต้องใช้คำสั่งนี้

iptables -F

คำสั่งนี้เป็นคำสั่งของ Statfull Firewall เพื่อให้ข้อมูลที่เรียกเข้ามาทางฝั่ง INPUT ตอบกลับไปได้ เราจะ Block UDP ขาออกทั้งหมด ถ้าไม่มีคำสั่งนี้มันจะตอบกลับไม่ได้

iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

ต่อมาเปิดให้เรียก DNS ได้ 2 IP

iptables -A OUTPUT -d 61.19.245.245 -j ACCEEPT >> เรียก DNS1 ของ CAT
iptables -A OUTPUT -d 61.19.245.246 -j ACCEEPT >> เรียก DNS2 ของ CAT
iptables -A OUTPUT -d 8.8.8.8 -j ACCEEPT >> เรียก DNS ของ Google
iptables -A OUTPUT -d 8.8.4.4 -j ACCEEPT >> เรียก DNS ของ Google
iptables -A OUTPUT -p udp -j DROP >> Drop ขาออกด้วย UDP ทั้งหมด

เป็นอันว่า ป้องกันการยิงออกด้วย UDP ที่ได้ผลที่เดียวครับ ***ผมได้ใช้งานจริงอยู่ครับ หลายเดือนแล้วยังไม่พบปัญหาอะไรครับ

กรณีที่ผู้ให้บริการ VPS (openvz เป็นผู้จัดการเอง ลูกค้ามันไม่ค่อยจัดการหรอก) เขียนคำสั่งดังนี้ครับ

iptables -F
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

บังคับไว้เลยถ้า VPS ลูกๆ จะใช้ DNS ให้ใช้ได้แค่ 4 ตัวนี้เท่านั้น กรณีเป็น ISP อื่น ก็เปลี่ยนไปตามแต่ละรายไปครับ
iptables -A FORWARD -d 61.19.245.245 -j ACCEEPT
iptables -A FORWARD -d 61.19.245.246 -j ACCEEPT
iptables -A FORWARD -d 8.8.8.8 -j ACCEEPT
iptables -A FORWARD -d 8.8.4.4 -j ACCEEPT

iptables -A FORWARD -p udp -s IP-VPS-1 -j DROP
iptables -A FORWARD -p udp -s IP-VPS-2 -j DROP
iptables -A FORWARD -p udp -s IP-VPS-3 -j DROP


iptables -A FORWARD -p udp -s IP-VPS-XX -j DROP

ส่วน TCP ผมยังไม่เอามาพูดในที่นี่ รอผมรวบรวมข้อมูลได้ทั้หมดก่อนจะเอามาเล่าให้ฟังอีกที

ปล. ผมไม่ใช่เซียนอะไร อาจมีข้อผิดพลาดในการเขียน รบกวนท่านเทพอื่นๆ อย่าถือสา และรบกวนแนะนำปรับปรุง script ให้ดีอีกนะครับ

[B]เข้ามาเก็บข้อมูลครับ ขอบคุณสำหรับเนื้อหาดีดีครับ[/B]

ถ้าเวปโฮสติ้ง ผมใช้
-A OUTPUT -p udp -m owner --uid-owner apache -m udp -j DROP
-A OUTPUT -p udp -m owner --gid-owner apache -m udp -j DROP
ถ้าเป็น debian ก็เปลี่ยน apache เป็น www-data นะครับ
ถ้าเป็น directadmin ก็เปลี่ยน apache เป็น access

ถ้า VPS ผม Limit ขาออก 20Mbps ยิงได้ยิงไปฮะ - -"

เป็นแนวทางที่ดีครับ ผมไม่รู้ใช้ได้ กับ FCGI หรือ ruid หรือเปล่า เพราะมัน run ด้วย user ตัวเอง

ส่วนการ Limit ไว้ 20 Mbps vps นั้นๆ จะใช้งานไม่ได้เลย ถ้า traffic มันต็ม ในช่วงที่มันยิง ที่สำคัญเรายังสนับสนุนการยิงออกถึง 20 Mbps ถ้ามันมีหลายๆ IP ช่วยกันยิง ก็มากเกินพอที่จะทำให้ traffic เต็มได้ อย่าลืมนะครับ บางที่การยิงออกไป เจ้าของ VPS เองไม่ใช่คนก่อปัญหา แต่คนก่อปัญหาคือ ผู้ใช้ hosting ครับ

ใช่ไงครับ แต่การจะ Support ลูกค้าของลูกค้าอีกทีนึงผมก็ไม่ไหวอ่ะ อย่างน้อยถ้าเกิดปัญหา vps master ก็ไม่เป็นไรแต่ node นั้นรับไปคนเดียว

ไม่งั้นก็ shape เฉพาะ udp :slight_smile: 5mbps ก็อยู่แล้ว

http://www.icez.net/blog/76175/0154-script-limit-bandwidth-udp

โหลดไฟล์ได้ที่ http://www.thzhost.com/files/udplimiter

สั่ง

wget -O /etc/init.d/udplimiter http://www.thzhost.com/files/udplimiter
chkconfig udplimiter on

เปิดไฟล์ /etc/init.d/udplimiter มาแก้ IF=eth0 เป็นชื่อ device แล้วสั่ง

service udplimiter start

ได้เลยฮะ

อันนี้น่าลองจังครับ

ผมเทสแล้ว tcp ใช้ได้ปกติ วิ่งทะลุสายได้สบายๆ ฮะ ส่วน udp flood ออกจะโดน cap ไว้ไม่เกิน 5mbps … ถ้าเป็น vps สั่งที่เครื่องแม่ก็ได้นะ แต่แก้จาก 5mbit เป็น 15 หรือ 20mbit ราวๆ นั้นน่าจะพอ

ทีนี้ปัญหาคือ… ถ้ามีตัวลูกยิงจนเต็ม limit เนี่ย มันจะพลอยทำให้ vps node อื่นใช้ udp ไม่ได้ไปด้วย ทำให้ resolve dns ไม่ออกเอาฮะ

นั่นแหละครับ ที่กลัว resolve dns ไม่ออก แต่คงไม่เกิดหรอก เพราะพวกมันยิงไม่ออก มันก็คงไม่อยากยิงล่ะ แต่ขอบคุณมากๆ ครับ วิธีนี้ก็เทพไปอีกแบบครับ

ผมคงต้องไปหาอ่านเรื่อง tc แล้วละครับ เผื่อประยุคใช้เรื่องอื่นๆ บ้าง

ขอบคุณมากครับ ^^

เม้นแรกพิมพ์ตกนิดนึงนะครับ

ACCEEPT อ่ะครับ จริงๆต้องเป็น ACCEPT