pengembangan-web-mp-pd.com

Bagaimana cara menyingkirkan soket dalam status FIN_WAIT1?

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 saya tidak ingin 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?

20
Gert M
# 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
19
IdaWong

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

Tampaknya tidak ada cara untuk menghapus soket secara manual.

7
innaM

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

6
user64877

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

5

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 garis

Reset parameter kernel tcp_max_orphans kembali ke nilai asli dari variabel di atas

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
2
Rad Mandapati

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 FIN_WAIT1 maka Anda harus mengikuti saran Manni di atas.

1
Dave Cheney

Pada kernel linux> = 4.9 Anda dapat menggunakan perintah ss 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 https://unix.stackexchange.com/a/511691/43898

0
eri