Linux разорвать tcp соединение

Linux разорвать tcp соединение

Простите за тупой вопрос, но надо срочно, а я сижу и офигеваю от того, что непонимаю как это сделать.

Нужно (для тестировани демона) жестко порвать established tcp соединение.

P.S. На Винде это можео сделать с помощью TcpView от Sysinternal.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Оглавление

  • Как разорвать ESTABLISHED соединение? (Linux), jonatan, 12:56 , 14-Фев-06, (1)
  • Как разорвать ESTABLISHED соединение? (Linux), StSphinx, 13:28 , 14-Фев-06, (2)
    • Как разорвать ESTABLISHED соединение? (Linux), lomo, 15:57 , 14-Фев-06, (3)
      • Как разорвать ESTABLISHED соединение? (Linux), idle, 17:21 , 14-Фев-06, (4)

Сообщения по теме [Сортировка по времени, UBB]

netstat -tp | grep ESTABLISHED
kill PID

1. «Как разорвать ESTABLISHED соединение? (Linux)»
Сообщение от jonatan (ok) on 14-Фев-06, 12:56
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. «Как разорвать ESTABLISHED соединение? (Linux)»
Сообщение от StSphinx (??) on 14-Фев-06, 13:28

>Простите за тупой вопрос, но надо срочно, а я сижу и офигеваю
>от того, что непонимаю как это сделать.
>
>Нужно (для тестировани демона) жестко порвать established tcp соединение.
>
>
>P.S. На Винде это можео сделать с помощью TcpView от Sysinternal.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. «Как разорвать ESTABLISHED соединение? (Linux)»
Сообщение от lomo on 14-Фев-06, 15:57

нету такого в RHEL4ES ;-/ ну или я не нашел.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. «Как разорвать ESTABLISHED соединение? (Linux)»
Сообщение от idle (ok) on 14-Фев-06, 17:21

>
>>man tcpkill
>
>нету такого в RHEL4ES ;-/ ну или я не нашел.
Наверно имелось ввиду tcpdrop.

Источник

Убить tcp соединение в linux

У меня есть какое-то мертвое соединение в одном приложении, которое находится в зависшем состоянии, если клиентская машина мертва.

Есть ли способ прекратить эти опции из командной строки Linux без перезагрузки сервера?

После поиска я нашел решение под названием tcpkill. Но это не сработает для меня. Так как он постоянно блокирует этот ip.

Чтобы «убить» сокет, вы должны отправить пакет сброса TCP. Чтобы отправить его (и принять другую сторону), вы должны знать фактический порядковый номер TCP.

1) Уже упомянутый tcpkill метод изучает номер SEQ путем пассивного прослушивания в сети и ожидания получения действительных пакетов этого соединения. Затем он использует полученный номер SEQ для отправки пакетов RSET обеим сторонам. Однако, если соединение неактивно / зависло и данные не передаются, оно ничего не будет делать и будет ждать вечно.

2) Другой метод использует скрипт perl, который называется killcx ( ссылка на Sourceforge ). Это активно отправляет поддельные пакеты SYN и узнает номер SEQ из ответа. Затем он отправляет пакеты RSET так же, как tcpkill .

Альтернативный подход (основанный на том, чего вы хотите добиться) — использовать gdb отладчик для подключения к процессу, владеющему этим сокетом / соединением, и close() выполнять системный вызов от его имени — как подробно описано в этом ответе .

Если вы хотите работать только с зависшими соединениями (другая сторона не работает), существуют различные таймауты (например, TCP keepalive), которые должны автоматически закрывать такие соединения, если в системе правильно настроены.

Источник

Как можно сбросить tcp соединение ?

Как можно сбросить tcp соединение ? По netstat видно откуда и на какой порт, а вот как его принудительно убить.

Re: Как можно сбросить tcp соединение ?

Во-первых, можно через netstat -np определить какой процесс (его PID) связан с этим соединением и убить его, если конечно этот процесс больше не связан ни с каким соединением. Во-вторых, можно запретить прием/передачу пакетов в этом соединении с помощью firewall-а; тогда оно само отвалится (возможно по timeout-у, если использовать DROP/DENY). В-третьих, есть программа ettercap, она, при запуске в интерактивном режиме, имеет функцию «kill connection» (включить прослушивание пакетов, выбрать нужное соединение, пару раз нажать «k»).

Re: Как можно сбросить tcp соединение ?

гы-гы а в openbsd есть команда tcpdrop.

Re: Как можно сбросить tcp соединение ?

> Во-вторых, можно запретить прием/передачу пакетов в этом соединении с помощью firewall-а;

хм.. надо попробовать — я где-то читал, что для уже установленных tcp-соединений новое, добавленное уже после установления этих соединений, правило не действует. т.е. это правило будет действовать только на соединения инициируемые после добавления данного правила..

а вообще, close() для сокета и/или порта есть? есть. значит надо найти как его использовать. т.е. я думаю, что необходимая «ручка» есть — надо её лишь найти..

Re: Как можно сбросить tcp соединение ?

$ apt-cache show cutter

Description: disconnect routed IP connections Cutter will send packets to both ends of a tcp/ip connection to close the connection. It is designed to be used on a Linux router to disconnect unwanted connections

Re: Как можно сбросить tcp соединение ?

10x!
у гугля я чё-то не сумел выпытать ничего внятного. видать плохо спрашивал 🙁

Источник

Закрытие TCP-коннекта операционной системой

Хочу разобрать все случаи когда ОС(т.е. инициатор не приложение и не другой хост) может перевести TCP-коннект в состояние из ESTABLISHED в другое.

Считаем, что TCP keepalive выключен.

Вариант 1. Соединение установлено(ESTABLISHED), все корректно, но никто не собирается передавать данные. Разорвется ли такое соединение когда-нибудь?

Вариант 2. Тоже самое, но перерубился кабель где-то по середине, по факту 100% потерть пакетов. Один из процессов активно пишет в сокет. Разорвет ли такое соединение операционка? На каком хосте?

Глобальный вопрос: а сколько может висеть неактивный, но ESTABLISHED сокет?

Пруфы и ссылки разделы rfc очень бы помогли.

1) до смерти процесса. На длительность соединения нет ограничений.

2) тот кто пишет в сокет получит ошибку через некоторое время.

Спасибо за ответ

2) тот кто пишет в сокет получит ошибку через некоторое время.

Я так понимаю это будет в момент когда закончится буфер отправки внутри ОС + какое-то время, так?

1) это если не было разрывов 🙂

2) если очередной tcp-keep-alive не дойдет, то раньше. Но узнать можно только читая/пиша вроде бы.

upd: без кипалайва только хардкор, да.

Вот в этом и вопрос. Отсутствие разрывов, когда никто не пишет и не читает вроде как эквивалентно полной потере сегментов на этом соединении, так?

Первое(4.6.3. Таймер закрытия связи) да, такой вариант есть.Это корректное завершение через close и дополнительный таймаут на блуждающие пакеты. Хорошо описано например в http://kalinin.ru/programming/network/29_10_00.shtml

Второе я так понял про keep alive

К сожалению, не нашел там варианты которые описал в начале. Т.е. FIN никто никому не посылал.

Я немного про другое. Может ли сокет висеть скажем пару суток, если из состояния [ESTABLISHED ESTABLISHED] начать 100% дроп сегментов туда обратно + один сокет только ждет чтения, а второй уже ничего не может послать(из-за дропа или иных причин)?

Если честно не знаю, тут просто нужно проверить и всё.

То есть пишущая сторона пишет, но не получает ACK? Тогда писатель заметит, читатель — нет. Интервал через сколько заметит читатель — зависит от конкретной реализации. Вряд ли это где специфицированно. Файрволы так могут делать. http://en.wikipedia.org/wiki/Black_hole_(networking)

В моем случае про пишущую сторону мало что известно — это внешний сервис. А клиент(мое приложение) только ждало данные и делало это трое суток. С той стороны их уже не писали(проверял через tcpdump), а сокет продолжал висеть в состоянии ESTABLISHED.

Не очень понятно насколько это нормально(с точки зрения rfc) и каким параметром это регулируется и регулируется ли вообще.

За термин black hole спасибо, может по нему, что-нибудь найдется.

Нет, когда кончится буфер, то процесс будет приостановлен, а когда закончится таймауты у TCP, то процессу будет возвращен код ошибки на write()/send() и в некоторых случаях SIGPIPE.

С SIGPIPE сталкивался, но глубоко не копал. Не помнишь названия этого таймаута? Или документа в котором он описан?

Только пинговать надо писателя. Больше ничего. Чем keep-alive не нравится? Он для этого и придуман. Твое соединение может отрезать кто-нибудь по середине, например какой-нибудь роутер, но тебе может ничего и не прислать.

Может и нравится 🙂 Надо выяснить что произошло сейчас и потом уже решать наиболее удобным способом.

Твое соединение может отрезать кто-нибудь по середине, например какой-нибудь роутер, но тебе может ничего и не прислать.

Вот мне нужно понимание, что ОС на это никак не реагирует(даже большим с таймаутом) и это поведение стандартно, а не ОС глючит. И что решить мне это надо на уровне приложения, может быть и через keep-alive.

Думаю, что TCP-стек для такого как раз и придумал keep-alive, который даже включен по умолчанию.

В системе он есть, однако для коннекта эта опция не задается по умолчанию похоже. Проверил программу по ссылке: http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/programming.html

Вывод на centos и gentoo одинаковый:

setsockopt( SO_RCVTIMEO / SO_SNDTIME ) ?

Да, это тоже вариант.

Меня изначально смутило, что сокет провисел на чтении три дня без передачи данных и скорее всего смерти отправителя. И возник вопрос, нормально ли это, нет ли таймаута системного на это. Пока я не нахожу подтверждения, что это не нормально. Но пока не видел соответствующей документации.

2) О проблемах на канальном уровне всегда сообщает железка. ОС тут ни при чем. В контексте Ethernet, если разрыв будет совсем близко к хосту — сразу выкинет ошибку. Если разрыв между маршутизаторами, то соединения будут висеть у обоих сторон до тех пор пока маршутизатор не вернет ответ в духе host unreachable. Чтобы словить этот момент раньше отправки данных или перед их получением был придуман keep-alive. Без последнего сокет работает по таймаутам: RTO (rfc 793 параграф 3.7) и пользовательские таймауты.

что такое TCP-стек?

закрыть сокет ОС может только в случае, если процесс, который отвечает за этот дескриптор приказал долго жить. если твои сервер с клиентом сами будут настойчиво держать соединение (не закрывать даже при получении ошибок при отправке, а пытаться еще и еще раз отправлять), то даже разрывы физического соединения не будут помехой.

Ах да. есть еще один сценарий — ОС опустила ифейс. Тогда, да, сокетам хана. Собственно сейчас этим балуются всякие Network-manager’ы, которые реагируют на изменение состояния физического линка.

Но в остальном. ты можешь выдернуть шланг из обеих машин и воткнуть на совершеннолетие твоего ребенка, спустя много лет, и если ОС с софтом все это время работали без остановки, то данные вновь полетят по этому TCP линку.

Источник

как вручную разорвать tcp соединение?

Собственно вопрос возник.

Есть приложение , устанавливающее множество tcp соединений одновременно. Как в линуксе разорвать какое то конкретное соединение (например зная PID или src/dst порт) , оставив при этом остальные соединения активными?

пс: Только ненадо спрашивать зачем это надо. И говорить что это все неправильно, лишено смысло и поэтому тупо и ненужно.

Re: как вручную разорвать tcp соединение?

В хекс редакторе сформировать FIN ответ с нужным номером фрейма и послать, делов то.

Re: как вручную разорвать tcp соединение?

iptables. закрой порт и открой обратно;)

Re: как вручную разорвать tcp соединение?

гм. есть tcpkill — часть dsniff, есть cutter, но он только для роутеров.

Re: как вручную разорвать tcp соединение?

Re: как вручную разорвать tcp соединение?

>> В хекс редакторе сформировать FIN ответ с нужным номером фрейма и послать, делов то.

приведи пример для соединения 192.168.0.2:51021->192.168.0.1:254

Re: как вручную разорвать tcp соединение?

>> iptables. закрой порт и открой обратно;)

>>quaternion (*) (10.01.2009 0:27:39)

почему оно должно разорваться в этом случае? по таймауту? я правильно понимаю?

Re: как вручную разорвать tcp соединение?

Ну что , товарищи линуксоидики , не существует значит способа разрыва тцп соединения? а вот в Виндовс есть утилита , tcpview , и не обязательно для нее делаться рутером , и перелопачивать всякие дсснифы и в хексредакторах забивать тцп пакеты , чтобы потом их! отправить самому же себе (хаха ,это вообще как такое возможно в трезвом уме то?)) что бы всего лиш разорвать тцп соединение! Ха ХА , вот поистине сетевая ось :)) Или может я не там написал? Может здесь просто слишком низкий уровень , и это делается очень просто но просто напросто никто не знает как это делается 😉 .

Re: как вручную разорвать tcp соединение?

Вот он, виндотролль — слепой, не умеющий читать маны неграмотный идиот.
‘tcpkill’ работает.

Источник

Читайте также:  Служба узла средство построения конечных точек windows audio грузит процессор
Оцените статью