У меня есть какое-то мертвое соединение в одном приложении, которое находится в зависшем состоянии, если клиентская машина мертва.
->192.168.1.214:49029 (ESTABLISHED)
Есть ли способ прекратить эти опции из командной строки Linux без перезагрузки сервера?
После поиска я нашел решение под названием tcpkill. Но это не сработает для меня. Так как он постоянно блокирует этот ip.
ss
команды гораздо проще и более общий, чем другие.Ответы:
Первоначально из: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcbly-kill-established-tcp.html
Чтобы «убить» сокет, вы должны отправить пакет сброса TCP. Чтобы отправить его (и принять другую сторону), вы должны знать фактический порядковый номер TCP.
1) Уже упомянутый
tcpkill
метод изучает номер SEQ путем пассивного прослушивания в сети и ожидания получения действительных пакетов этого соединения. Затем он использует полученный номер SEQ для отправки пакетов RSET обеим сторонам. Однако, если соединение неактивно / зависло и данные не передаются, оно ничего не будет делать и будет ждать вечно.2) Другой метод использует скрипт perl, который называется
killcx
( ссылка на Sourceforge ). Это активно отправляет поддельные пакеты SYN и узнает номер SEQ из ответа. Затем он отправляет пакеты RSET так же, какtcpkill
.Альтернативный подход (основанный на том, чего вы хотите добиться) - использовать
gdb
отладчик для подключения к процессу, владеющему этим сокетом / соединением, иclose()
выполнять системный вызов от его имени - как подробно описано в этом ответе .Если вы хотите работать только с зависшими соединениями (другая сторона не работает), существуют различные таймауты (например, TCP keepalive), которые должны автоматически закрывать такие соединения, если в системе правильно настроены.
источник
tcpkill
может сделать это для вас. В Ubuntu это вdsniff
пакете.Что-то вроде:
(или какое-либо другое
tcpdump
подобное выражение для того, какое соединение убить).источник
В ядре Linux> = 4.9 вы можете использовать
ss
команду из iproute2 с ключом-K
ядро должно быть скомпилировано с
CONFIG_INET_DIAG_DESTROY
включенной опцией.источник
tcpkill
не может работать). Тем не менее, я признаю, что я не проверял,killcx
но кажется, что многие защитные программы не позволят этому работать, если вы не измените свои iptables, чтобы пропустить эти поддельные пакеты.sudo ss -K ....
на Ubuntu Bionic 18.04 LTS. У меня былtmux
процесс, который завис на экране небольшого размера из-за удаленного, но неработающего, но не по тайм-ауту соединения. Все исправлено!Делай - как root
netstat -tunp|grep 49029
. В последнем столбце выходных данных должны быть указаны PID и имя программы процесса, ответственного за это соединение.Если вам повезет, есть только один процесс для этого соединения.
Если вам не повезло, все усложняется (PID отвечает не только за одно соединение). Что это за услуга?
Почему вы хотите прекратить эту сессию?
источник
tcpkill
не может закрыть мертвое (зависшее) соединение. Основаноlibpcap
, это конструирует пакет к отправленномуFIN
пакету. Если соединение уже разорвано, оно не может получить правильный порядковый номер.Единственный способ - закрыть процесс, так что делает везде - НЕ БЕЗОПАСНО.
источник