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

18

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

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

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

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

Герт М
источник

Ответы:

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
источник
2
это улучшило бы ответ, чтобы сначала записать его $whateveritwasперед перезаписью.
проверял
7

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

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

InnaM
источник
6
Этот ответ не правильный. tcp_orphan_retries влияет на FIN_WAIT1, tcp_fin_timeout влияет на FIN_WAIT2.
suprjami
suprjami верно, tcp_fin_timeout влияет на FIN_WAIT2. Который срабатывает только при использовании SO_LINGER.
Мэтт
@innaM Можете ли вы удалить этот ответ? Это не правильно и накапливать отрицательные голоса. Я вижу, что вы все еще активны, поэтому, кажется, имеет смысл удалить ответ.
Эндрю Б
@ Андрей Б: Кажется, что невозможно удалить принятые ответы.
InnaM
6

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

НТН

user64877
источник
1
Тесно связано: 0 по умолчанию, что означает 8. serverfault.com/a/408882/152073
Эндрю Б
5

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

Райан Ахерн
источник
2

Выполнение этих шагов под 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
Рад Мандапати
источник
Привет, добро пожаловать в Serverfault. Я отредактировал ваше сообщение, чтобы форматирование вашего ответа более соответствовало другим ответам на этом сайте. Для вашего следующего ответа, пожалуйста, не используйте столько заголовков, сколько вы использовали здесь, и рассмотрите возможность использования других ответов в качестве шаблона для ваших собственных ответов. Спасибо за ваш вклад, хотя. Наслаждайтесь поездкой на сервере.
Ричард
1

FIN_WAIT1

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

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

Дейв Чейни
источник
0

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

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

через /unix//a/511691/43898

эри
источник
-4

это может помочь:

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
источник
6
Это может помочь, если вы объясните, что все это такое. Мы профессионалы, и поэтому мы не слепо вкручиваем вещи и надеемся, что это поможет.
Майкл Хэмптон