Автор Тема: tcp kill на established (idle) conneciton  (Прочетена 4373 пъти)

Breakfist

  • Напреднали
  • *****
  • Публикации: 84
    • Профил
tcp kill на established (idle) conneciton
« -: Mar 25, 2015, 00:07 »
Здравейте. Доста време търся ефективен начин за "убиване" на TCP връзки.
tcpkill по принцип ми върши не лоша работа, но е безполезен ако връзката е idle.

Ограничавам достъпа до 20 established паралелни връзки чрез iptables, но понякога се случва да увисне някоя връзка. Потребителя не може да я затвори, а аз също не мога да я дропя с tcpkill, защото не извършва никакъв трафик. При теста, който проведох, оставям отворено приложението (да вземем дори SSH за пример) без да извършвам някакво действие - tcpkill не работи. Напиша ли каквото и да е, в момента в който изпрати някаква информация и отчете трафик drop-ва връзката моментално. Въпросът е, как мога да отрежа и idle връзка?

Благодаря предварително на отзовалите се :)
Активен

d1saster

  • Напреднали
  • *****
  • Публикации: 182
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #1 -: Mar 25, 2015, 00:45 »
Killcx : close a TCP connection (for Linux)

Killcx is a Perl script to close a TCP connection under Linux, whatever its state is (half-open, established, waiting or closing state).

This killcx tool is taking a different approach and tries to generate traffic on the wire to discover what the ACK and SEQ numbers are. Once it forces the peer to replay to its spoofed traffic it kills the TCP session immediately after.

http://killcx.sourceforge.net/

« Последна редакция: Mar 25, 2015, 00:47 от d1saster »
Активен

Breakfist

  • Напреднали
  • *****
  • Публикации: 84
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #2 -: Mar 25, 2015, 00:51 »
Вече го пробвах - не се случват нещата и при него..

Цитат
killcx v1.0.3 - (c)2009-2011 Jerome Bruandet - http://killcx.sourceforge.net/

[PARENT] checking connection with [ClientIP:21881]
[PARENT] found connection with [ServerIP:9148] (ESTABLISHED)
[PARENT] forking child
[PARENT] sending spoofed SYN to [ServerIP:9148] with bogus SeqNum
[PARENT] no response from child, operation may have failed
[PARENT] => you may try using 'lo' as interface parameter
[PARENT] killing child [15730] and exiting program
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: tcp kill на established (idle) conneciton
« Отговор #3 -: Mar 25, 2015, 00:51 »
А, d1saster ме преварил :) Тогава да кажа, че можеш да убиваш неактивните връзки и като убиваш родителския процес (неудобно, ако се очаква да има и активни връзки в този момент, които го ползват) или процеса на tty-а (не е задължително да има такъв).
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Breakfist

  • Напреднали
  • *****
  • Публикации: 84
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #4 -: Mar 25, 2015, 00:53 »
Да спра процеса е най-лесно, но се получава, че заради 1 човек спирам достъпа на други 300 :) Не е практично.
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: tcp kill на established (idle) conneciton
« Отговор #5 -: Mar 25, 2015, 00:59 »
Не виждам смисъла от заниманието, ама все пак таймаутите се контролират през procfs и има много вариации на темата според сценария. TCP стека е доста комплексно нещо. Понеже ме мързи да ровя документация, а и не мисля да се ровя вместо теб, ще направя нещо много по-полезно, мисля да ти обясня в общият случай как се случват нещата, за да няма разочарования.

Първо, има два варианта, при които една TCP връзка би "увиснала" в ESTABLISHED състояние - когато отсрещната страна се отсвири или когато отстрещната страна не се е отсвирила, но няма трафик, т.е връзката е установена, но е idle. Първият случай е много лесен за разрешаване - директно, има си procfs врътка, контролираща колко време трябва да мине преди връзката да се затвори ако няма никаква активност. Този таймаут по дефолт е доста висок, в рамките на няколко часа в честия случай, макар че това варира от дистрибуция до дистрибуция.

По-проблемен е случая обаче в който някой сокет е "маркиран" чрез setsockopt() да е keepalive сокет. В този случай, след изтичане на таймаута, връзката не се затваря, вместо това периодично се засилват празни TCP пакети и се чака ACK отсреща. Ако след няколко опита няма потвърждения, връзката се затваря. Колко да се чака и колко опита да се правят е също въпрос на procfs врътки, чиито имена не знам наизуст. При това положение, ако отсрещната страна се е отсвирила, връзката все пак ще се затвори. Обаче има и следващ вариант - отсрещната страна не се е отсвирила, но нарочно държи връзката idle, защото няма какво да прати или не иска да праща нищо, но въпреки това отговаря на keepalive пакетите (което може да е напълно вероятен евентуален DoS сценарий в някакъв специфичен случай). Което апропо обикновено също е и случая със ssh клиенти или сървъри с конфигурирани брутално високи таймаути. Е тогава нещата много загрубяват - в добрия случай софтуерът е така любезен да ти предостави възможност да конфигурираш таймаутите (sshd поне го прави). В случая в който не го прави, може би варианта остава ползването на някое шашаво iptables разширение, което може да match-ва трафик по timestamp-и в conntrack таблицата, не може да няма такова. Ако това ти се вижда странно, разбери че TCP стека в линукс ядрото не може да влиза в ролята на полицай, има си съвсем легитимни случаи където някоя TCP връзка да може да е idle с дни наред и щом като потребителския софтуер го е изискал, тогава да си чупи главата.

Та не знам точно какъв е твоя случай и кое точно виждаш като проблем. За мен лично това ограничение от 20 установени TCP връзки ми се вижда малко странно.
Активен

"Knowledge is power" - France is Bacon

Breakfist

  • Напреднали
  • *****
  • Публикации: 84
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #6 -: Mar 25, 2015, 01:12 »
Софтуера има възможност за закриване на "увисналите" връзки. Именно keepalive проверките ги затварят след 2 минути неактивност, което ме устройва до известна степен. Проблемът е, че в клиентския софтуер, който прави комуникацията със сървъра има бъг, при който на моменти, при определен сценарий запазва background връзки активни, които отговарят на keepalive запитванията. Потребителите ми са с ниска (при някои от тях дори клоняща към нула) култура в тези среди и не могат да ги затворят сами от машините си, което ме принуждава да търся начин да ги прекратя от страна на сървъра.
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: tcp kill на established (idle) conneciton
« Отговор #7 -: Mar 25, 2015, 01:26 »
Добре де, на клиентите не може ли да им се конфигурира също таймаут за неактивност? Keepalive нещата така да го кажем не се "броят" като активност по мрежата, payload-а им е с нулева големина. С други думи ако те получат keepalive пакет от сървъра, това не би трябвало да го отчитат като "активност" върху сокета. Макар че знам ли и аз - операционни системи много, имплементации на TCP стека много.
Активен

"Knowledge is power" - France is Bacon

Breakfist

  • Напреднали
  • *****
  • Публикации: 84
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #8 -: Mar 25, 2015, 01:37 »
Не виждам как бих могъл да го направя таймаута в клиентското приложение - не е open source, а разработчика е спрял поддръжката му преди години.
Дори и с нулев обем, явно отговора е достатъчен, за сървъра, за да запази връзката отворена. tcpkill не върши работа, когато сървър-клиент е само с keepalive заявки. Докато клиента е на idle не го закача. В момента, в който изпратя каквато и да е информация, дори нещо просто като това да си проверя пинга, tcpkill го засича и drop-ва връзката моментално. При клиента обаче когато остане като background не изпраща дори това, така че на теория може да стои и с часове отворена - в момента решаваме проблема, като крайния потребител рестартира мрежовата си свързаност (или компютъра директно, че му е по-лесно :)). Без да го направи обаче, връзката остава отворена и запълва лимита от 20 връзки, който споменах в предните си публикации. Връзката пък е established, така че не виждам как бих могъл да променя и правилото в iptables, за да не засяга idle връзките.. Задънена улица ми се вижда на мен, за това и ми се наложи да потърся помощ тук, от по-компетентни лица.
Активен

KPETEH

  • Напреднали
  • *****
  • Публикации: 584
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #9 -: Mar 25, 2015, 10:57 »
Защо не пробваш с CUTTER ? Обикновено работи по следния начин като изпраща FIN -> ACK -> RST , за да прекъсне връзката. Виж официалния сайт на линка долу :

http://www.digitage.co.uk/digitage/software/linux-security/cutter
Активен

Най-добрата страна на алчността е способността и да стопява коефициента на интелигентност дори на най-умния човек.

laskov

  • Напреднали
  • *****
  • Публикации: 2974
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #10 -: Mar 25, 2015, 17:21 »
Да спра процеса е най-лесно, но се получава, че заради 1 човек спирам достъпа на други 300 :) Не е практично.
И на всичките тези 300 ли го има този проблем???
Брой им връзките и като станат повече от х за даден клиент му пращай едно съобщение да си рестартира клиента :)
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

programings

  • Напреднали
  • *****
  • Публикации: 211
  • Distribution: Arch Linux, BunsenLabs Linux, FreeBSD
  • Window Manager: XFCE, MATE, Openbox
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #11 -: Mar 25, 2015, 22:33 »
Добре де, conntrack -D (след инсталация на conntrack-tools) не върши ли работа?
« Последна редакция: Mar 25, 2015, 22:35 от programings »
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: tcp kill на established (idle) conneciton
« Отговор #12 -: Mar 25, 2015, 23:38 »
Не виждам как бих могъл да го направя таймаута в клиентското приложение - не е open source, а разработчика е спрял поддръжката му преди години.
Дори и с нулев обем, явно отговора е достатъчен, за сървъра, за да запази връзката отворена. tcpkill не върши работа, когато сървър-клиент е само с keepalive заявки. Докато клиента е на idle не го закача. В момента, в който изпратя каквато и да е информация, дори нещо просто като това да си проверя пинга, tcpkill го засича и drop-ва връзката моментално. При клиента обаче когато остане като background не изпраща дори това, така че на теория може да стои и с часове отворена - в момента решаваме проблема, като крайния потребител рестартира мрежовата си свързаност (или компютъра директно, че му е по-лесно :)). Без да го направи обаче, връзката остава отворена и запълва лимита от 20 връзки, който споменах в предните си публикации. Връзката пък е established, така че не виждам как бих могъл да променя и правилото в iptables, за да не засяга idle връзките.. Задънена улица ми се вижда на мен, за това и ми се наложи да потърся помощ тук, от по-компетентни лица.

Лошо. Добре де, а защо все пак е лимита от 20 връзки? В смисъл от сървърна страна при това положение освен ако няма някаква много специална причина, не виждам проблем и 2000 idle връзки да държа отворени. Иначе доста глупавото решение е да рестартирам сървърното приложение през някакъв период от време, но е простотия това, защото ще го отнесат легитимни клиенти
Активен

"Knowledge is power" - France is Bacon

Breakfist

  • Напреднали
  • *****
  • Публикации: 84
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #13 -: Mar 26, 2015, 00:16 »
Защо не пробваш с CUTTER ? Обикновено работи по следния начин като изпраща FIN -> ACK -> RST , за да прекъсне връзката. Виж официалния сайт на линка долу :

http://www.digitage.co.uk/digitage/software/linux-security/cutter
Ще го тествам и него да видим ще свърши ли работа :)

Да спра процеса е най-лесно, но се получава, че заради 1 човек спирам достъпа на други 300 :) Не е практично.
И на всичките тези 300 ли го има този проблем???
Брой им връзките и като станат повече от х за даден клиент му пращай едно съобщение да си рестартира клиента :)
То няма да има голяма разлика със сегашното положение сякаш. Не е при всички потребители, може да го има при 2 или 3 от тях в даден момент, може да е при 50 или при нито един, зависи кога увисне клиента. Примерно лагва му нета, изхвърля го от клиента, но софтуера продължава да работи background и запълва ограничението. На практика може да има и 15 увиснали връзки, като потребителя влезе ли с 5 - до там е. Предупредително съобщение би имало ефект ако знаят как да решат проблема крайните потребители, но в моя случай е безпредметно сякаш.

Не виждам как бих могъл да го направя таймаута в клиентското приложение - не е open source, а разработчика е спрял поддръжката му преди години.
Дори и с нулев обем, явно отговора е достатъчен, за сървъра, за да запази връзката отворена. tcpkill не върши работа, когато сървър-клиент е само с keepalive заявки. Докато клиента е на idle не го закача. В момента, в който изпратя каквато и да е информация, дори нещо просто като това да си проверя пинга, tcpkill го засича и drop-ва връзката моментално. При клиента обаче когато остане като background не изпраща дори това, така че на теория може да стои и с часове отворена - в момента решаваме проблема, като крайния потребител рестартира мрежовата си свързаност (или компютъра директно, че му е по-лесно :)). Без да го направи обаче, връзката остава отворена и запълва лимита от 20 връзки, който споменах в предните си публикации. Връзката пък е established, така че не виждам как бих могъл да променя и правилото в iptables, за да не засяга idle връзките.. Задънена улица ми се вижда на мен, за това и ми се наложи да потърся помощ тук, от по-компетентни лица.

Лошо. Добре де, а защо все пак е лимита от 20 връзки? В смисъл от сървърна страна при това положение освен ако няма някаква много специална причина, не виждам проблем и 2000 idle връзки да държа отворени. Иначе доста глупавото решение е да рестартирам сървърното приложение през някакъв период от време, но е простотия това, защото ще го отнесат легитимни клиенти
Всичко над 20 е premium опция :) Това е платен абонамент, чрез който се самоиздържа иначе безплатната услуга, която предлагам.
Активен

Breakfist

  • Напреднали
  • *****
  • Публикации: 84
    • Профил
Re: tcp kill на established (idle) conneciton
« Отговор #14 -: Mar 26, 2015, 01:05 »
Защо не пробваш с CUTTER ? Обикновено работи по следния начин като изпраща FIN -> ACK -> RST , за да прекъсне връзката. Виж официалния сайт на линка долу :

http://www.digitage.co.uk/digitage/software/linux-security/cutter
Не ми върши работа..

Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Kill Bill
Хумор
cable 3 1895 Последна публикация Mar 12, 2005, 19:01
от kennedy
Kill ppp if no traffic
Настройка на програми
orfey 1 1312 Последна публикация Aug 29, 2007, 19:18
от the_real_maniac
Малко за KILL командите в Linux
Пътят към wiki.linux-bg.org минава оттук
tyuio 0 7361 Последна публикация Mar 07, 2009, 02:09
от tyuio
AMD kill ATI
Живота, вселената и някакви други глупости
n00b 13 2722 Последна публикация Aug 30, 2010, 23:41
от n00b
Cisco VPN idle ime
Настройка на програми
rcbandit 0 519 Последна публикация Nov 27, 2011, 12:43
от rcbandit