Bagaimana cara menyingkirkan soket dalam status FIN_WAIT1?

18

Saya memiliki port yang diblokir oleh proses yang harus saya bunuh. (daemon telnet kecil yang jatuh). Proses ini terbunuh dengan sukses tetapi port tersebut masih dalam status 'FIN_WAIT1'. Itu tidak keluar dari itu, batas waktu untuk itu tampaknya ditetapkan untuk 'satu dekade'.

Satu-satunya cara yang saya temukan untuk membebaskan port adalah me-reboot seluruh mesin, yang merupakan sesuatu yang tidak ingin saya lakukan.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

Adakah yang tahu bagaimana saya bisa membebaskan port ini tanpa me-reboot?

Gert M
sumber

Jawaban:

18
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed

# restore the value of tcp_max_orphans whatever it was before. 
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# verify with 
netstat -an|grep FIN_WAIT1
IdaWong
sumber
2
itu akan meningkatkan jawaban untuk pertama-tama membuat catatan $whateveritwassebelum menimpanya.
diperiksa
7

Anda harus dapat mengatur batas waktu dengan /proc/sys/net/ipv4/tcp_fin_timeout.

Sepertinya tidak ada cara untuk membersihkan soket secara manual.

innaM
sumber
6
Jawaban ini tidak benar. tcp_orphan_retries memengaruhi FIN_WAIT1, tcp_fin_timeout memengaruhi FIN_WAIT2.
suprjami
suprjami benar, tcp_fin_timeout memengaruhi FIN_WAIT2. Yang hanya dipicu saat menggunakan SO_LINGER.
Matt
@innaM Bisakah Anda menghapus jawaban ini? Itu tidak benar dan mengumpulkan downvotes. Saya melihat bahwa Anda masih aktif, oleh karena itu sepertinya masuk akal untuk menghapus jawabannya.
Andrew B
@Andrew B: Tampaknya tidak mungkin menghapus jawaban yang diterima.
innaM
6

Tampaknya pengaturan tcp_orphan_retries mengontrol berapa banyak upaya yang akan dilakukan sebelum port tanpa server dilepaskan. Itu 0 di sini, setelah mengaturnya ke 1 port hilang.

HTH

pengguna64877
sumber
1
Terkait erat: 0 adalah default yang berarti 8. serverfault.com/a/408882/152073
Andrew B
5

/proc/sys/net/ipv4/tcp_fin_timeoutadalah batas waktu status FIN-WAIT-2, bukan FIN-WAIT-1. Anda harus pergi dengan rute tcpkill atau Anda dapat mencoba bermain dengan waktu keepalive di bawah /proc/sys/net/ipv4/tcp_keepalive_*untuk memaksa pembunuhan oleh SO.

Ryan Ahearn
sumber
2

Jalankan langkah-langkah ini di bawah ID root dan sudah jelas bagi saya:

Abadikan pengaturan kernel untuk diubah dalam suatu variabel

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

Tetapkan sementara anak yatim maks ke 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Periksa untuk memastikan bahwa port yang bermasalah tidak lagi digunakan

$ netstat -np|grep 9716

Tunggu sedikit dan ulangi langkah di atas jika perlu sampai perintah di atas tidak mengembalikan baris

Atur ulang parameter kernel tcp_max_orphans kembali ke nilai asli dari variabel di atas

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
Rad Mandapati
sumber
Hai, Selamat Datang di Serverfault. Saya mengedit posting Anda untuk menjadikan pemformatan jawaban Anda lebih konsisten dengan jawaban lain di situs ini. Untuk jawaban Anda berikutnya, jangan gunakan judul sebanyak yang Anda lakukan di sini dan pertimbangkan untuk mengambil jawaban lain sebagai templat untuk jawaban Anda sendiri. Terima kasih atas kontribusi Anda. Nikmati perjalanan Anda di serverfault.
Richard
1

FIN_WAIT1

Aplikasi pada mesin lokal telah menutup koneksi. Indikasi ini telah dikirim ke mesin jarak jauh.

Aplikasi Anda telah menutup sisi sambungannya, soketnya sekarang menunggu sisi jarak jauh untuk mengkonfirmasi penutupan itu. Jika Anda memiliki masalah dengan banyak soket yang ditahan di FIN_WAIT1 maka Anda harus mengikuti saran Manni di atas.

Dave Cheney
sumber
0

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 opsi CONFIG_INET_DIAG_DESTROY diaktifkan.

via /unix//a/511691/43898

eri
sumber
-4

ini dapat membantu:

net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 2
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0
wkf1436
sumber
6
Mungkin membantu jika Anda menjelaskan apa itu semua. Kami adalah profesional, dan karenanya, kami tidak secara membabi buta merekatkan dan berharap ini membantu.
Michael Hampton