Jak ustawić limit czasu gniazda TCP


20

W przypadku symulacji katastrof sieciowych w naszym środowisku serwerowym szukamy sposobu na celowe przekroczenie limitu czasu gniazda TCP. Czy są jakieś proste sposoby na istniejące gniazda? Dodatkowym atutem byłby mały program testowy C.

Próbowaliśmy już odłożyć interfejsy sieciowe podczas odczytu bufora TCP i odczytu z odłączonych zamontowanych zasobów (samba).

Serwer testowy to Ubuntu 12.04.4.

Odpowiedzi:


19

Aby spowodować zakończenie połączenia z limitem czasu, możesz użyć iptables. Po prostu włącz DROPregułę dla portu, który chcesz wyłączyć. Aby zasymulować limit czasu dla serwera Samaba, gdy aktywne jest aktywne połączenie, wykonaj następujące czynności na serwerze:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

DROPCel nie będzie odpowiadać z RSTpakietu lub ICMPbłędem do nadawcy pakietu za. Klient przestanie odbierać pakiety z serwera i ostatecznie przekroczy limit czasu.

W zależności od tego, czy / jak iptablesskonfigurowałeś, możesz chcieć wstawić regułę wyżej do INPUTzestawu reguł.


Próbowałem tego za pomocą NetCat (do nasłuchiwania / wysyłania danych) i czekałem wiecznie ... No timeout: / I mogę potwierdzić, że dane zostały usunięte. Zmieniłem nawet /proc/sys/net/ipv4/tcp_keepalive_timena bardzo małą liczbę
er453r,

@ er453r spróbuj włączyć pełne wyjście, ncat -vaby zobaczyć, co dokładnie ncatrobi. Zajęło mi to 2m7,291 na waniliowej instalacji Ubuntu 12.04 do limitu czasu
Creek

tak - podczas pierwszego testu nie wysyłałem niczego przez gniazdo. W końcu opanowałem limity czasu i opisałem je szczegółowo poniżej :)
er453r

16

Pierwsza odpowiedź jest poprawna, ale odkryłem, jak działają te limity czasu, więc możesz je zaobserwować i przetestować (nie zapomnij zablokować portu!).

Istnieją 4 najciekawsze parametry jądra, które zajmują się limitami czasu TCP:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

Teraz są 2 scenariusze:

  1. Gniazdo jest otwierane i próbuje przesłać - wtedy (jeśli nie ma odpowiedzi z drugiej strony), tcp_retries2czasy prób systemu . Przy domyślnej wartości wycofania zajmuje to ponad 2 minuty i limit czasu gniazda.

  2. Gniazdo jest otwarte i bezczynne - wtedy limity podtrzymania są interesujące. Z bezczynnym gniazdem system będzie czekał tcp_keepalive_timekilka sekund, a następnie spróbuj tcp_keepalive_probesrazy wysłać TCP KEEPALIVE w odstępach tcp_keepalive_intvlkilku sekund. I dopiero potem wszystko zawiedzie limit czasu gniazda.


1
Możesz także monitorować te limity czasu za pomocąnetstat -o
er453r
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.