लिनक्स में टीएलसी कनेक्शन को मारना


49

मेरे पास एक एप्लिकेशन में कुछ मृत कनेक्शन हैं जो क्लाइंट मशीन के मृत होने पर फांसी की स्थिति में हैं।

->192.168.1.214:49029 (ESTABLISHED)

क्या सर्वर को पुनरारंभ किए बिना लिनक्स कमांड लाइन से इन विकल्प को समाप्त करने का एक तरीका है?

खोज के बाद मुझे समाधान मिला जिसे tcpkill कहा जाता है। लेकिन यह मेरे लिए काम नहीं करेगा। चूंकि यह स्थायी रूप से उस आईपी को ब्लॉक करता है।


ssकमांड का उपयोग करने पर जवाब दूसरों की तुलना में बहुत आसान और अधिक सामान्य है।
nealmcb

जवाबों:


35

मूल रूप से: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html

सॉकेट को "मारने" के लिए, आपको एक टीसीपी रीसेट पैकेट भेजना होगा। इसे भेजने के लिए (और दूसरी तरफ से स्वीकार किया जाना चाहिए), आपको वास्तविक टीसीपी अनुक्रम संख्या पता होना चाहिए।

1) पहले से ही उल्लिखित tcpkillविधि नेटवर्क पर निष्क्रिय रूप से सूँघकर एसईक्यू नंबर सीखती है और इस कनेक्शन के वैध पैकेट के आने की प्रतीक्षा करती है। फिर यह दोनों पक्षों को RSET पैकेट भेजने के लिए सीखे गए SEQ नंबर का उपयोग करता है। हालाँकि यदि कनेक्शन निष्क्रिय है / लटका हुआ है और कोई डेटा प्रवाहित नहीं है, तो यह कुछ भी नहीं करेगा और हमेशा के लिए प्रतीक्षा करेगा।

2) एक अन्य विधि perl स्क्रिप्ट का उपयोग करती है जिसे killcx( Sourceforge के लिए लिंक ) कहा जाता है । यह सक्रिय रूप से स्पूफ किए गए SYN पैकेट भेजता है और उत्तर से SEQ नंबर सीखता है। इसके बाद यह उसी तरह से RSET पैकेट भेजता है tcpkill

वैकल्पिक रूप से दृष्टिकोण (जो आप प्राप्त करना चाहते हैं उसके आधार पर) gdbइस सॉकेट / कनेक्शन के स्वामित्व वाली प्रक्रिया में संलग्न करने के लिए डिबगर का उपयोग करना है और close()अपनी ओर से syscall जारी करना है - जैसा कि इस उत्तर में विस्तृत है ।

यदि आप केवल लटके हुए कनेक्शन (दूसरा पक्ष मर चुका है) से निपटना चाहते हैं, तो विभिन्न समयबाह्य हैं (उदाहरण के लिए टीसीपी रखने योग्य), जो सिस्टम पर ठीक से कॉन्फ़िगर होने पर ऐसे कनेक्शन को स्वचालित रूप से बंद कर देना चाहिए।


यदि हम इसकी फाइल डिस्क्रिप्टर (fd) द्वारा टीसीपी सॉकेट को बंद कर देते हैं तो क्या यह काम करेगा? exec fd> & -
अलेक्जेंडर गोंचिए

लाइव कनेक्शन के लिए @AlexanderGonchiy यह पैकेट का जवाब देने के लिए प्रक्रिया को रोक देगा, इसलिए यह कनेक्शन को टाइमआउट करने का कारण होगा। निष्क्रिय कनेक्शन के लिए कुछ भी नहीं होगा। मुझे यकीन नहीं है कि अगर कर्नेल fd को बंद करने पर नेटवर्क को कुछ भी भेजेगा।
मार्किस ५५

मैंने अनुक्रम संख्या सूँघ ली है। तब मुझे क्या करना चाहिए?
user3132194

18

tcpkillआप के लिए यह कर सकता है। उबंटू में यह dsniffपैकेज में है।

कुछ इस तरह:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(या कुछ अन्य की tcpdumpतरह अभिव्यक्ति के लिए क्या कनेक्शन को मारने के लिए)।


4
यह तभी काम करता है जब कनेक्शन कुछ भी प्रसारित कर रहा हो। यह लटका / निष्क्रिय टीसीपी कनेक्शन के लिए काम नहीं करेगा (विवरण के लिए मेरा उत्तर देखें)
मार्कियू ५५

17

लिनक्स कर्नेल पर = = 4.9 आप ssकुंजी के साथ iproute2 से कमांड का उपयोग कर सकते हैं-K

ss -K dst 192.168.1.214 dport = 49029

कर्नेल को CONFIG_INET_DIAG_DESTROYसक्षम विकल्प के साथ संकलित करना होगा ।


1
लिनक्स के लिए, यह वास्तव में सबसे अच्छा तरीका है और बहुत ही एकमात्र तरीका है यदि आपके पास निष्क्रिय कनेक्शन हैं ( tcpkillकाम नहीं कर सकता)। हालाँकि, मैं मानता हूँ कि मैंने निरीक्षण नहीं किया है, killcxलेकिन ऐसा लगता है कि बहुत सारे सुरक्षा सॉफ़्टवेयर काम करने से रोकेंगे, जब तक कि आप इन ख़राब पैकेटों की अनुमति देने के लिए अपने iptables को संशोधित नहीं करते।
सेठ रॉबर्टसन

धन्यवाद! sudo ss -K ....उबंटू बायोनिक 18.04 एलटीएस पर एक आकर्षण की तरह काम किया । मेरे पास एक ऐसी tmuxप्रक्रिया थी जो छोटे स्क्रीन आकार में रिमोट, लेकिन मृत होने के कारण अटक गई थी, लेकिन समयबद्ध कनेक्शन नहीं थी। सब तय!
20

6

करो - जड़ के रूप में netstat -tunp|grep 49029। आउटपुट का अंतिम कॉलम आपको उस कनेक्शन के लिए जिम्मेदार प्रक्रिया का पीआईडी ​​और कार्यक्रम का नाम दिखाना चाहिए।

यदि आप भाग्यशाली हैं तो बस उस कनेक्शन के लिए एक ही प्रक्रिया है।

यदि आप अशुभ हैं तो यह अधिक जटिल हो जाता है (पीआईडी ​​केवल एक कनेक्शन से अधिक के लिए जिम्मेदार है)। यह किस तरह की सेवा है?

आप उस सत्र को समाप्त क्यों करना चाहते हैं?


8
मैं उस प्रक्रिया को नहीं मार सकता। यह गियरमैन सर्वर है। मैं सिर्फ कनेक्शन बंद करना चाहता हूं।
विवेक गोयल

0

tcpkillएक मृत (फांसी) कनेक्शन को बंद नहीं कर सकते। यह आधारित है libpcap, यह एक पैकेट को भेजे गए FINपैकेट का निर्माण करता है । यदि कनेक्शन पहले से ही मृत है, तो उसे सही अनुक्रम संख्या नहीं मिल सकती है।

एकमात्र तरीका प्रक्रिया को बंद करना है, इसलिए हर जगह बनाता है SPOF नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.