Як зробити тайм-аут розетки TCP


20

Для моделювання мережевої катастрофи нашого серверного середовища ми шукаємо спосіб навмисно вимкнути сокет TCP. Чи є прості способи для існуючих розеток? Крім того, маленька програма для тестового випадку була б плюсом.

Ми вже намагалися відкласти мережеві інтерфейси під час зчитування буфера TCP та зчитування з відключених змонтованих ресурсів (samba).

Тестовим сервером є Ubuntu 12.04.4.

Відповіді:


19

Щоб викликати вихідне з'єднання до тайм-ауту, ви можете використовувати iptables. Просто ввімкніть DROPправило на порту, який ви хочете відключити. Отже, щоб імітувати тайм-аут для вашого сервера Samaba, під час активного з'єднання виконайте такі дії на сервері:

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

DROPМета не буде відповідати на RSTпакеті або ICMPпомилки відправника пакета. Клієнт перестане отримувати пакети від сервера і, зрештою, таймаут.

Залежно від того, якщо / як ви iptablesналаштували, ви можете вставити правило вище в INPUTнабір правил.


Спробував це за допомогою netcat (для прослуховування / надсилання даних) і чекав вічно ... немає тайм-аута: / І я можу підтвердити, що дані були скинуті. Я навіть змінився /proc/sys/net/ipv4/tcp_keepalive_timeна дійсно невелику кількість
er453r

@ er453r спробуйте ввімкнути багатослівний вихід, ncat -vщоб побачити, що саме ncatробить. На встановлення ванілі Ubuntu 12.04 встановлено тайм-аут
Creek

правильно - під час першого тестування я нічого не надсилав через розетку. Нарешті я освоїв тайм-аути і детально описав їх нижче :)
er453r

16

Перша відповідь правильна, але я виявив, як працюють ці тайм-аути, щоб ви могли їх спостерігати та перевіряти (не забудьте заблокувати порт!).

Є 4 найцікавіші параметри ядра, які стосуються тайм-аутів 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

Зараз є 2 сценарії:

  1. Розетка відкривається і намагається передати - тоді (якщо немає відповіді з іншого боку) система повторює повторення tcp_retries2. При значенні за замовчуванням пенсіонерів це займає десь понад 2 хвилини, а розетка закінчується.

  2. Розетка відкривається і простоює - тоді цікаві межі збереження. При простої розетки система буде чекати tcp_keepalive_timeсекунд, а після цього спробуйте tcp_keepalive_probesраз надіслати TCP KEEPALIVE з інтервалом tcp_keepalive_intvlсекунд. І тільки після цього всі вимикання розетки відключаються.


1
Також ви можете відстежувати цей час, використовуючиnetstat -o
er453r
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.