Iptables ที่ไว้ป้องกัน DoS attack นะครับ
ตัวอย่างข้างล่างเป็น rule ที่ใช้กับ web , http protocol port 80
#iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
#iptables -A INPUT -p tcp --dport 80 -j DROP
อธิบายได้ดังนี้ ครับ
-m limit: เป็นการบอกให้ ใช้ค่า limit ได้
–limit 25/minute: Limit นี้อนุญาตให้รับได้แค่ 25 packet ต่อ 1 นาที. ถ้ามาเกินนี้ drop (ตรงนี้สามารถปรับได้ตาม limit ของแต่ละ app และทรัพยากรบนเครื่องเรานะครับ ) เป็นการ limit packet นะครับ ไม่ใช่ limit connection per IP
(ค่า default –limit คือ 3/hour)
–limit-burst 25: คือประมาณบอกว่ามี Token เท่าไรในอยู่ในตระกร้าในที่นี้คือมี 100 token ถ้า packet เข้ามาเป็น 100 packet ต่อนาที ระบบ burst จะทำการเก็บpacket เข้ากับ token ที่เข้ามาใส่ช่องไว้แค่ 25 ช่องส่วนที่เหลือคือ 75 packet จะ ตกไปที่ rule อื่นใน chain ต่อไป ถ้า rule ใน chain นั้นคือ rule ที่ทำการ drop ก็จะ drop packet ที่เกินมานั้นในช่วง 1 นาทีนั้น ตาม rule บันทัดที่สอง (ค่า default --limit-burst คือ 5)
เมื่อไรที่ token ใหม่จะถูก เติมลงตระกร้าอีกครั้ง : คำตอบคือขึ้นอยู่กับค่า --limit คือ เมื่อขึ้น นาทีใหม่ ก็จะมี token เปิดรับได้ 25 token ในทุกๆนาทีใหม่
ถ้าต้องการที่จะ limit connection per ip ก็ ใช้ร่วมกับ connlimit + hashlimit ครับผม
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
อธิบายคือ จะทำการ reject connection เมื่อมี connection จาก ip เดียวกันเข้ามา 5 / second แต่ถ้าจะป้องกัน DDoS ต้องใช้ hashlimit ช่วยครับ จะสามารถระบุ limit per ip หรือจะเป็น per IP + Port ได้ครับผม
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit 45/sec --hashlimit-burst 60 --hashlimit-mode srcip --hashlimit-name DDOS --hashlimit-htable-size 32768 --hashlimit-htable-max 32768 --hashlimit-htable-gcinterval 1000 --hashlimit-htable-expire 100000 -j ACCEPT
#อ่านเพิ่มเติม
http://www.linuxmantra.com/2012/07/iptables-limit.htmlhttp://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO-7.htmlhttp://thelowedown.wordpress.com/2008/07/03/iptables-how-to-use-the-limits-module/