ฆ่าการเชื่อมต่อ tcp ใน linux


49

ฉันมีการเชื่อมต่อที่ตายแล้วในแอปพลิเคชั่นเดียวซึ่งอยู่ในสภาพแขวนคอถ้าไคลเอ็นต์เครื่องตาย

->192.168.1.214:49029 (ESTABLISHED)

มีวิธีการยกเลิกตัวเลือกเหล่านี้จากบรรทัดคำสั่ง linux โดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์หรือไม่

หลังจากค้นหาฉันพบวิธีแก้ปัญหาที่เรียกว่าเป็น tcpkill แต่มันจะไม่ทำงานสำหรับฉัน เนื่องจากเป็นการบล็อกไอพีอย่างถาวร


คำตอบในการใช้ssคำสั่งนั้นง่ายกว่าและทั่วไปกว่าคำสั่งอื่น ๆ
nealmcb

คำตอบ:


35

มีพื้นเพมาจาก: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html

หากต้องการ "ฆ่า" ซ็อกเก็ตคุณต้องส่งแพ็กเก็ต TCP รีเซ็ต ในการส่ง (และได้รับการยอมรับจากอีกด้านหนึ่ง) คุณต้องรู้หมายเลขลำดับ TCP จริง

1) tcpkillวิธีที่กล่าวถึงแล้วเรียนรู้หมายเลข SEQ โดยการดมกลิ่นในเครือข่ายและรอแพ็กเก็ตที่ถูกต้องของการเชื่อมต่อนี้ที่จะมาถึง จากนั้นจะใช้หมายเลข SEQ ที่เรียนรู้เพื่อส่งแพ็กเก็ต RSET ไปยังทั้งสองฝั่ง อย่างไรก็ตามหากการเชื่อมต่อไม่ได้ใช้งาน / ถูกแขวนและไม่มีกระแสข้อมูลจะไม่ทำอะไรเลยและจะรอตลอดไป

2) วิธีอื่นใช้สคริปต์ Perl ที่เรียกว่าkillcx( ลิงก์ไปยัง Sourceforge ) สิ่งนี้จะส่งแพ็คเก็ต SYN ปลอมแปลงอย่างแข็งขันและเรียนรู้หมายเลข SEQ จากคำตอบ จากนั้นจะส่งแพ็คเก็ต RSet tcpkillเช่นเดียวกับ

อีกวิธีหนึ่ง (ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ) คือการใช้gdbดีบักเกอร์เพื่อแนบกับกระบวนการที่เป็นเจ้าของซ็อกเก็ต / การเชื่อมต่อนี้และออกclose()syscall ในนามของมัน - ดังรายละเอียดในคำตอบนี้

หากคุณต้องการจัดการกับการเชื่อมต่อแบบแขวนคอ (อีกด้านหนึ่งตาย) มีการหมดเวลาต่างๆ (TCP keepalive เป็นต้น) ซึ่งควรปิดการเชื่อมต่อดังกล่าวโดยอัตโนมัติหากกำหนดค่าไว้อย่างถูกต้องในระบบ


มันจะทำงานถ้าเราเพียงแค่ปิดซ็อกเก็ต TCP โดย file descriptor (fd) หรือไม่? exec fd> & -
Alexander Gonchiy

@AlexanderGonchiy สำหรับการเชื่อมต่อสดมันจะป้องกันไม่ให้กระบวนการตอบสนองต่อแพ็คเก็ตดังนั้นมันจะทำให้การเชื่อมต่อหมดเวลา สำหรับการเชื่อมต่อที่ไม่ได้ใช้งานจะไม่มีอะไรเกิดขึ้น ฉันไม่แน่ใจว่าเคอร์เนลจะส่งอะไรไปยังเครือข่ายเมื่อปิด fd หรือไม่
Marki555

ฉันดมหมายเลขลำดับแล้ว ฉันควรทำอย่างไร
user3132194

18

tcpkillอาจทำเพื่อคุณ ใน Ubuntu มันอยู่ในdsniffแพ็คเกจ

สิ่งที่ต้องการ:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(หรืออื่น ๆtcpdumpเช่นการแสดงออกสำหรับสิ่งที่เชื่อมต่อกับการฆ่า)


4
ใช้งานได้เฉพาะในกรณีที่การเชื่อมต่อกำลังส่งสัญญาณอะไร มันจะไม่ทำงานสำหรับการเชื่อมต่อ TCP แบบแขวน / ไม่ได้ใช้งาน (ดูคำตอบของฉันสำหรับรายละเอียด)
Marki555

17

บนเคอร์เนล linux> = 4.9 คุณสามารถใช้ssคำสั่งจาก iproute2 พร้อมคีย์-K

ss -K dst 192.168.1.214 dport = 49029

เคอร์เนลจะต้องรวบรวมด้วยCONFIG_INET_DIAG_DESTROYตัวเลือกเปิดใช้งาน


1
สำหรับ linux นี่เป็นวิธีที่ดีที่สุดและเป็นวิธีเดียวถ้าคุณมีการเชื่อมต่อที่ไม่ได้ใช้งาน ( tcpkillไม่สามารถใช้งานได้) อย่างไรก็ตามฉันจะยอมรับว่าฉันไม่ได้ตรวจสอบkillcxแต่รู้สึกว่าซอฟต์แวร์รักษาความปลอดภัยจำนวนมากจะป้องกันไม่ให้ทำงานเว้นแต่คุณจะแก้ไข iptables ของคุณเพื่ออนุญาตให้แพ็คเก็ตปลอมเหล่านี้ผ่านได้
Seth Robertson

ขอบคุณ! ทำงานอย่างมีเสน่ห์ด้วยsudo ss -K ....บน Ubuntu Bionic 18.04 LTS ฉันมีtmuxกระบวนการที่ติดอยู่ที่หน้าจอขนาดเล็กเนื่องจากการเชื่อมต่อระยะไกล แต่ตาย แต่ไม่ได้หมดเวลาเชื่อมต่อ แก้ไขแล้ว!
nealmcb

6

ทำ - ตามที่รูnetstat -tunp|grep 49029ท คอลัมน์สุดท้ายของผลลัพธ์ควรแสดง PID และชื่อโปรแกรมของกระบวนการที่รับผิดชอบการเชื่อมต่อนั้น

หากคุณโชคดีมีกระบวนการเดียวสำหรับการเชื่อมต่อนั้น

หากคุณโชคไม่ดีมันจะซับซ้อนมากขึ้น (PID รับผิดชอบมากกว่าแค่การเชื่อมต่อเดียว) นี่เป็นบริการอะไร

เหตุใดคุณต้องการยกเลิกเซสชันนั้น


8
ฉันไม่สามารถฆ่ากระบวนการนั้นได้ มันเป็นเซิร์ฟเวอร์เกียร์แมน ฉันต้องการที่จะปิดการเชื่อมต่อ
Vivek Goel

0

tcpkillไม่สามารถปิดการเชื่อมต่อตาย (แขวน) มันขึ้นอยู่กับlibpcapมันสร้างแพ็คเก็ตเพื่อส่งFINแพ็คเก็ต หากการเชื่อมต่อนั้นตายไปแล้วจะไม่สามารถรับหมายเลขลำดับที่ถูกต้องได้

วิธีเดียวคือปิดกระบวนการดังนั้นการทำทุกที่ไม่ใช่การหลอกลวง

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