Linux'ta tcp bağlantısı kesiliyor


49

İstemci makinesi ölmüşse, asıl durumda olan bir uygulamada bazı ölü bağlantılarım var.

->192.168.1.214:49029 (ESTABLISHED)

Sunucuyu yeniden başlatmadan bu seçeneği linux komut satırından sonlandırmanın bir yolu var mı?

Aramadan sonra tcpkill adında bir çözüm buldum. Ama bu benim için işe yaramayacak. Kalıcı olarak bu ipi engeller.


ssKomutu kullanmanın cevabı diğerlerinden daha kolay ve geneldir.
nealmcb

Yanıtlar:


35

Aslen: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html

Bir soketi "öldürmek" için, bir TCP sıfırlama paketi göndermelisiniz. Göndermek (ve diğer tarafça kabul edilmek) için, gerçek TCP sıra numarasını bilmeniz gerekir.

1) Bahsedilen tcpkillyöntem, SEQ numarasını ağa pasif olarak takarak ve bu bağlantının geçerli paketlerinin gelmesini bekleyerek öğrenir. Daha sonra her iki tarafa da RSET paketleri göndermek için öğrenilen SEQ numarasını kullanır. Ancak bağlantı boş / askıda ve veri akışı yoksa, hiçbir şey yapmaz ve sonsuza dek bekler.

2) Başka bir yöntem de denilen perl betiğini kullanır killcx( Sourceforge'a bağlantı ). Bu aktif olarak sahte SYN paketleri gönderir ve SEQ numarasını cevaptan öğrenir. Daha sonra RSET paketlerini aynı şekilde gönderir tcpkill.

Alternatif olarak yaklaşım (elde etmek istediğiniz şeye dayanarak), gdbbu sokette / bağlantıya sahip olan bir işleme eklemek için bu hata ayıklayıcısını kullanmak ve close()bu cevabın ayrıntılarında açıklandığı gibi sistem çağrısı yapmaktır .

Yalnızca askıya alınmış bağlantılarla (diğer taraf ölü) uğraşmak istiyorsanız, sistemde doğru şekilde yapılandırılmışsa bu bağlantıları otomatik olarak kapatması gereken çeşitli zaman aşımları (örneğin, TCP koruma) vardır.


TCP soketini sadece dosya tanıtıcısı (fd) ile kapatırsak çalışır mı? fd>> -
Alexander Gonchiy

@AlexanderGonchiy canlı bağlantılar için işlemin paketlere yanıt vermesini önler, böylece bağlantının zaman aşımına uğramasına neden olur. Boş bağlantılar için hiçbir şey olmazdı. Çekirdeği fd kapattığında ağa bir şey gönderirse emin değilim.
Marki555

Sıra numarasını kokladım. O zaman ne yapmalıyım?
kullanıcı3132194

18

tcpkillsenin için yapabilir. Ubuntu'da dsniffpakette.

Gibi bir şey:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(ya da tcpdumphangi bağlantının kesileceği gibi başka bir ifade gibi).


4
Bu yalnızca bağlantı bir şey iletiyorsa çalışır.
Asılı

17

Linux kernel> = 4.9 sskomutunda iproute2 komutunu tuş ile kullanabilirsiniz.-K

ss -K dst 192.168.1.214 dport = 49029

Çekirdek CONFIG_INET_DIAG_DESTROYetkin seçenekle derlenmelidir .


1
Linux için, boşta bağlantılara sahipseniz ( tcpkillişe yaramadıysa) bu gerçekten en iyi yol ve tek yol . Ancak, denetlemediğimi itiraf edeceğim, killcxancak bir çok güvenlik yazılımının ipuçlarınızı bu sahtecili paketlerin geçmesine izin verecek şekilde değiştirmediğiniz sürece çalışmasını engelleyeceğini hissediyorum.
Seth Robertson

Teşekkürler! sudo ss -K ....Ubuntu Bionic 18.04 LTS'de bir cazibe gibi çalıştı . tmuxUzak, ancak ölü, ancak zaman aşımına uğramış bir bağlantı nedeniyle küçük bir ekran boyutunda sıkışmış bir işlem vardı . Hepsi düzeltildi!
nealmcb

6

Yap - kök olarak netstat -tunp|grep 49029. Çıktının son sütunu, size bu bağlantıdan sorumlu işlemin PID'sini ve program adını göstermelidir.

Şanslıysanız, sadece bu bağlantı için tek bir işlem var.

Eğer şanssızsanız daha karmaşık hale gelir (PID sadece bir bağlantıdan daha fazla sorumludur). Bu ne tür bir hizmet?

Neden bu oturumu sonlandırmak istiyorsun?


8
Bu işlemi öldüremem. Gearman sunucusudur. Sadece bağlantıyı kapatmak istiyorum.
Vivek Goel

0

tcpkillÖlü (askıya alınmış) bir bağlantıyı kapatamaz. Bu temel libpcap, gönderilen bir paket oluşturmak FINpaket. Bağlantı zaten kesildi, doğru sıra numarası alınamıyor.

Tek yol, süreci kapatmak, her yerde yapar, SPOF DEĞİLDİR.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.