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.

er453r
źródło

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ł.

zatoczka
źródło
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.

er453r
źródło
1
Możesz także monitorować te limity czasu za pomocąnetstat -o
er453r