it-swarm-ru.tech

Как избавиться от сокетов в состоянии FIN_WAIT1?

У меня есть порт, который заблокирован процессом, который мне нужно убить. (маленький демон telnet, который разбился). Процесс был успешно завершен, но порт все еще находится в состоянии 'FIN_WAIT1'. Это не выходит из этого, время для этого, кажется, установлено в "десятилетие".

Единственный способ освободить порт - это перезагрузить всю машину, что, разумеется, я не хочу делать.

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

Кто-нибудь знает, как я могу разблокировать этот порт без перезагрузки?

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

Вы должны быть в состоянии установить время ожидания с помощью /proc/sys/net/ipv4/tcp_fin_timeout.

Кажется, нет никакого способа очистить сокет вручную.

7
innaM

Кажется, параметр tcp_Orphan_retries контролирует, сколько попыток будет сделано до освобождения порта без сервера. Здесь было 0, после установки 1 порты исчезли.

НТН

6
user64877

/proc/sys/net/ipv4/tcp_fin_timeout - это время ожидания состояния FIN-WAIT-2, а не FIN-WAIT-1. Вам следует пойти по маршруту tcpkill, или вы можете попробовать поиграть со временем активности в /proc/sys/net/ipv4/tcp_keepalive_* чтобы заставить убить SO.

5
Fabricio González

Выполнение этих шагов под root ID, и это прояснилось для меня:

Захват настройки ядра для изменения в переменной

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

Временно установите максимальное число сирот на 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Убедитесь, что проблемный порт больше не используется

$ netstat -np|grep 9716

Подождите немного и повторите шаг, если это необходимо, пока команда не вернет никаких строк

Сбросить параметр ядра tcp_max_orphans обратно к исходному значению из переменной выше

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

FIN_WAIT1

Приложение на локальной машине закрыло соединение. Индикация этого была отправлена ​​на удаленный компьютер.

Ваше приложение закрыло свою сторону соединения, теперь сокет ждет, пока удаленная сторона подтвердит это закрытие. Если у вас есть проблема с большим количеством этих сокетов, хранящихся в FIN_WAIT1, тогда вы должны следовать совету Манни выше.

1
Dave Cheney

В ядре Linux> = 4.9 вы можете использовать команду ss из iproute2 с ключом -K

ss -K dst 192.168.1.214 dport = 49029 ядро ​​должно быть скомпилировано с включенной опцией CONFIG_INET_DIAG_DESTROY.

через https://unix.stackexchange.com/a/511691/43898

0
eri