วิธีการทำให้ซ็อกเก็ต TCP หมดเวลา


20

สำหรับการจำลองภัยพิบัติทางเครือข่ายของสภาพแวดล้อมเซิร์ฟเวอร์ของเราเรากำลังมองหาวิธีที่จะหมดเวลาซ็อกเก็ต TCP โดยเจตนา มีวิธีง่าย ๆ สำหรับซ็อกเก็ตที่มีอยู่หรือไม่? นอกจากนี้โปรแกรมกรณีทดสอบ C เล็ก ๆ น้อย ๆ จะเป็นบวก

เราได้ลองใส่อินเตอร์เฟสเครือข่ายระหว่างการอ่านบัฟเฟอร์ TCP และการอ่านจากทรัพยากรที่เชื่อมต่อแล้ว (samba)

เซิร์ฟเวอร์ทดสอบคือ Ubuntu 12.04.4

คำตอบ:


19

iptablesจะก่อให้เกิดการเชื่อมต่อออกไปหมดเวลาที่คุณสามารถใช้ เพียงเปิดใช้งานDROPกฎบนพอร์ตที่คุณต้องการปิดใช้งาน ดังนั้นเพื่อจำลองการหมดเวลาสำหรับเซิร์ฟเวอร์ Samaba ของคุณในขณะที่การเชื่อมต่อที่ใช้งานอยู่ดำเนินการดังต่อไปนี้บนเซิร์ฟเวอร์:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

DROPเป้าหมายจะไม่ตอบกับRSTแพ็คเก็ตหรือICMPข้อผิดพลาดไปยังผู้ส่งแพ็คเก็ตของ ลูกค้าจะหยุดรับแพ็คเก็ตจากเซิร์ฟเวอร์และหมดเวลาในที่สุด

ขึ้นอยู่กับว่าคุณiptablesกำหนดค่าอย่างไร / คุณอาจต้องการแทรกกฏที่สูงขึ้นในชุดINPUTกฎ


พยายามใช้ netcat (เพื่อฟัง / ส่งข้อมูล) และรอตลอดไป ... ไม่มีการหมดเวลา: / และฉันสามารถยืนยันข้อมูลที่ถูกทิ้ง ฉันยังเปลี่ยน/proc/sys/net/ipv4/tcp_keepalive_timeเป็นจำนวนน้อยมาก
er453r

@ er453r ลองเปิดใช้งานเอาต์พุต verbose ด้วย ncat -vเพื่อดูว่าncatกำลังทำอะไรอยู่ ฉันใช้เวลา 2m7.291s บน vanilla Ubuntu 12.04 และติดตั้งให้หมดเวลา
Creek

ถูก - ฉันไม่ได้ส่งอะไรผ่านซ็อกเก็ตในระหว่างการทดสอบครั้งแรก ในที่สุดฉันก็หมดเวลาในการเรียนรู้และอธิบายรายละเอียดด้านล่าง :)
er453r

16

คำตอบแรกนั้นถูกต้อง แต่ฉันค้นพบว่าการหมดเวลาเหล่านี้ทำงานอย่างไรคุณจึงสามารถสังเกตและทดสอบได้ (อย่าลืมบล็อกพอร์ต!)

มีพารามิเตอร์เคอร์เนลที่น่าสนใจที่สุด 4 ข้อที่จัดการกับการหมดเวลา TCP:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

ขณะนี้มี 2 สถานการณ์:

  1. ซ็อกเก็ตถูกเปิดและพยายามที่จะส่ง - จากนั้น (หากไม่มีการตอบสนองจากด้านอื่น ๆ ) ระบบพยายามtcp_retries2ครั้ง ด้วยค่าเริ่มต้นของการเกษียณจะใช้เวลาประมาณ 2 นาทีและซ็อกเก็ตหมดเวลา

  2. ซ็อกเก็ตเปิดและไม่ใช้งาน - จากนั้นข้อ จำกัด keepalive น่าสนใจ ด้วยระบบซ็อกเก็ตที่ไม่ได้ใช้งานจะรอtcp_keepalive_timeวินาทีและหลังจากนั้นลองtcp_keepalive_probesครั้งเพื่อส่ง TCP KEEPALIVE ในช่วงเวลาไม่tcp_keepalive_intvlกี่วินาที และหลังจากนั้นก็ทำให้ซ็อกเก็ตหมดเวลา


1
นอกจากนี้คุณสามารถตรวจสอบการหมดเวลานี้โดยใช้netstat -o
er453r
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.