1. Обзор
Протокол управления передачей TCP (Transmission Control Protocol) обеспечивает надежный обмен сетевыми пакетами между отправителем и получателем.
В нем используется концепция подтверждения пакетов и тайм-аута сообщений.
В целях отладки иногда необходимо имитировать таймаут TCP-сокета на TCP-сервере.
В этом руководстве мы узнаем, как вызвать таймаут TCP-сокета с помощью стандартных инструментов Linux.
2. Использование iptables для блокировки порта
Мы можем использовать iptables для блокировки заданного TCP-порта на нашей машине, тем самым имитируя тайм-аут TCP.
Например, мы можем заблокировать порт 6000:
Итак, давайте разберемся в каждой части этой команды:
- при обновлении правил iptables необходимы привилегии sudo или root
- -A INPUT означает добавление входящего правила
- -p указывает протокол TCP
- -dport указывает номер порта
- -j DROP означает добавление правила для отбрасывания TCP-пакета.
Наконец, давайте проверим, правильно ли было добавлено правило DROP port 6000:
Как мы видим, через некоторое время соединение с портом 6000 прерывается.
Опция -v означает режим verbose, а -z – режим сканирования порта.
Мы можем измерить точное значение таймаута, используя команду time перед командой nc:
Полученное время ожидания составляет 2 минуты и 9,534 секунды.
4. Обновление значений таймаута
Чтобы увеличить или уменьшить значения таймаута TCP, мы можем использовать файлы, расположенные в каталоге /proc/sys/net/ipv4/ псевдофайловой системы /proc.
Итак, давайте обновим таймаут TCP, а затем измерим, как это повлияет на результаты измерений таймаута.
4.1. Уменьшение таймаута TCP
Существует несколько файлов, которые влияют на таймаут TCP:
- tcp_retries2
- tcp_keepalive_time
- tcp_keepalive_intvl
- tcp_keepalive_probes
Уменьшив значения по умолчанию для вышеперечисленных файлов, мы сможем добиться меньшего времени таймаута TCP.
Например, давайте уменьшим таймаут, изменив количество повторных попыток передачи TCP-пакетов.
Для этого сначала проверим значение по умолчанию с помощью команды cat:
По умолчанию количество повторных попыток TCP равно 15.
Давайте уменьшим его до 1 с помощью утилиты sysctl:
Таким образом, мы задаем значение для файла tcp_retries2.
Наконец, давайте применим изменения:
В результате это значение должно сохраниться и применяться к любым последующим TCP-соединениям.
4.2. Повторное измерение тайм-аута
Давайте проверим, как изменение файла повлияло на наши измерения тайм-аута:
Как мы видим, тайм-аут уменьшился с более чем двух минут до 11 283 секунд.
5. Заключение
В этой статье мы рассмотрели, как имитировать таймаут TCP-сокета.
Для этого, во-первых, мы узнали, как заставить TCP-порт блокировать входящие соединения.
Во-вторых, мы узнали, как обновить значение таймаута TCP.
- 🐳 Как защитить TCP-сокет Docker с помощью TLS
- 🐳 Как опросить сокет Docker с помощью curl
- 🖧 Как отслеживать подключения к сокету с помощью команды ss
- Как открыть сокет TCP / UDP в оболочке bash
- 🐳 Как привязать контейнер без пользователя root к привилегированному порту на Linux
- 🐧 Шпаргалка по AppArmor для системных администраторов Linux