Membunuh koneksi tcp di linux

49

Saya memiliki beberapa koneksi mati dalam satu aplikasi yang dalam keadaan hang jika mesin klien mati.

->192.168.1.214:49029 (ESTABLISHED)

Apakah ada cara untuk menghentikan opsi ini dari baris perintah linux tanpa me-restart server?

Setelah pencarian saya menemukan solusi yang disebut sebagai tcpkill. Tetapi itu tidak akan berhasil untuk saya. Karena secara permanen memblokir ip itu.

Vivek Goel
sumber
Jawaban menggunakan ssperintah jauh lebih mudah dan lebih umum daripada yang lain.
nealmcb

Jawaban:

35

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

Untuk "membunuh" soket, Anda harus mengirim paket reset TCP. Untuk mengirimnya (dan diterima oleh pihak lain), Anda harus mengetahui nomor urut TCP yang sebenarnya.

1) Metode yang telah disebutkan tcpkillmempelajari nomor SEQ dengan mengendus secara pasif pada jaringan dan menunggu paket yang valid dari koneksi ini tiba. Kemudian ia menggunakan nomor SEQ yang dipelajari untuk mengirim paket RSET ke kedua sisi. Namun jika koneksi idle / hanged dan tidak ada data yang mengalir, itu tidak akan melakukan apa-apa dan akan menunggu selamanya.

2) Metode lain menggunakan skrip perl yang disebut killcx( tautan ke Sourceforge ). Ini secara aktif mengirimkan paket-paket SYN palsu dan mempelajari nomor SEQ dari jawabannya. Ini kemudian mengirimkan paket RSET dengan cara yang sama seperti tcpkill.

Cara lainnya (berdasarkan apa yang ingin Anda capai) adalah menggunakan gdbdebugger untuk melampirkan proses yang memiliki soket / koneksi ini dan mengeluarkan close()syscall atas namanya - sebagaimana dirinci dalam jawaban ini .

Jika Anda hanya ingin berurusan dengan koneksi yang digantung (sisi lain sudah mati), ada berbagai timeout (TCP keepalive misalnya), yang akan secara otomatis menutup koneksi tersebut jika dikonfigurasi dengan benar pada sistem.

Marki555
sumber
Apakah akan berhasil jika kita hanya menutup soket TCP dengan deskriptor file (fd)? exec fd> & -
Alexander Gonchiy
@AlexanderGonchiy untuk koneksi langsung itu akan mencegah proses untuk merespon paket, sehingga akan menyebabkan koneksi ke timeout. Untuk koneksi diam tidak akan terjadi apa-apa. Saya tidak yakin apakah kernel akan mengirim sesuatu ke jaringan saat menutup fd.
Marki555
Saya telah mengendus nomor urut. Apa yang harus saya lakukan?
user3132194
18

tcpkillmungkin melakukannya untukmu. Di Ubuntu ada dalam dsniffpaket.

Sesuatu seperti:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(atau tcpdumpekspresi suka lainnya untuk koneksi apa yang harus dimatikan).

jcv
sumber
4
Ini hanya berfungsi jika koneksi mentransmisikan sesuatu. Ini tidak akan berfungsi untuk koneksi TCP
hang
17

Di linux kernel> = 4.9 Anda dapat menggunakan ssperintah dari iproute2 dengan kunci-K

ss -K dst 192.168.1.214 dport = 49029

kernel harus dikompilasi dengan CONFIG_INET_DIAG_DESTROYopsi yang diaktifkan.

Pavel
sumber
1
Untuk linux, ini benar-benar cara terbaik dan cukup banyak satu-satunya cara jika Anda memiliki koneksi idle ( tcpkilltidak bisa bekerja). Namun, saya akui bahwa saya belum menginspeksi killcxtetapi rasanya banyak perangkat lunak keamanan akan mencegahnya bekerja kecuali jika Anda memodifikasi iptables Anda untuk mengizinkan paket palsu ini lewat.
Seth Robertson
Terima kasih! Bekerja seperti pesona sudo ss -K ....di Ubuntu Bionic 18.04 LTS. Saya memiliki tmuxproses yang macet pada ukuran layar kecil karena koneksi yang jauh, tetapi mati, tetapi tidak kehabisan waktu. Semua sudah diperbaiki!
nealmcb
6

Lakukan - sebagai root netstat -tunp|grep 49029. Kolom terakhir dari output akan menunjukkan kepada Anda PID dan nama program dari proses yang bertanggung jawab untuk koneksi itu.

Jika Anda beruntung ada satu proses untuk koneksi itu saja.

Jika Anda beruntung itu menjadi lebih rumit (PID bertanggung jawab atas lebih dari satu koneksi itu). Layanan apa ini?

Mengapa Anda ingin mengakhiri sesi itu?

Nils
sumber
8
Saya tidak bisa membunuh proses itu. Ini adalah server gearman. Saya ingin menutup koneksi saja.
Vivek Goel
0

tcpkilltidak dapat menutup koneksi mati (digantung). Berbasis libpcap, itu membangun paket untuk mengirim FINpaket. Jika koneksi sudah mati, tidak bisa mendapatkan nomor urut yang benar.

Satu-satunya cara adalah dengan menutup proses, sehingga membuat di mana-mana BUKAN SPOF.

selalu
sumber