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.
ss
perintah jauh lebih mudah dan lebih umum daripada yang lain.Jawaban:
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
tcpkill
mempelajari 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 sepertitcpkill
.Cara lainnya (berdasarkan apa yang ingin Anda capai) adalah menggunakan
gdb
debugger untuk melampirkan proses yang memiliki soket / koneksi ini dan mengeluarkanclose()
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.
sumber
tcpkill
mungkin melakukannya untukmu. Di Ubuntu ada dalamdsniff
paket.Sesuatu seperti:
(atau
tcpdump
ekspresi suka lainnya untuk koneksi apa yang harus dimatikan).sumber
Di linux kernel> = 4.9 Anda dapat menggunakan
ss
perintah dari iproute2 dengan kunci-K
kernel harus dikompilasi dengan
CONFIG_INET_DIAG_DESTROY
opsi yang diaktifkan.sumber
tcpkill
tidak bisa bekerja). Namun, saya akui bahwa saya belum menginspeksikillcx
tetapi rasanya banyak perangkat lunak keamanan akan mencegahnya bekerja kecuali jika Anda memodifikasi iptables Anda untuk mengizinkan paket palsu ini lewat.sudo ss -K ....
di Ubuntu Bionic 18.04 LTS. Saya memilikitmux
proses yang macet pada ukuran layar kecil karena koneksi yang jauh, tetapi mati, tetapi tidak kehabisan waktu. Semua sudah diperbaiki!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?
sumber
tcpkill
tidak dapat menutup koneksi mati (digantung). Berbasislibpcap
, itu membangun paket untuk mengirimFIN
paket. 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.
sumber