3

У меня проблемы с интернет-соединением, которое, кажется, случайно "замораживает" произвольные tcp-соединения, когда они не использовались некоторое время. Соединения остаются установленными, но данные не передаются.

Когда это происходит, netstat по- прежнему показывает состояние соединения как ESTABLISHED на обоих локальных компьютерах:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name Timer
tcp        0     53 192.168.0.10:41129      173.255.235.238:143     ESTABLISHED 8219/gnutls-cli  on (79.31/13/0)

..и удаленный сервер:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name Timer
tcp        0      0 173.255.235.238:143     68.5.174.98:41129       ESTABLISHED 5303/imapd       off (0.00/0/0)

Однако, похоже, что данные вообще не передаются. Если я запускаю strace на локальном и удаленном процессах, оба показывают просто повторяющуюся последовательность вызовов select (с разными fds, конечно), например

select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)

Интернет-соединение в целом не подвержено влиянию, но я по-прежнему могу без проблем устанавливать новые подключения к той же службе на том же сервере. Однако уязвимые локальные приложения, похоже, не знают о проблеме и просто зависают.

Примерно через 10 минут после попытки передачи на локальный конец соединение на удаленном конце исчезает из netstat (я не смог перехватить какое-либо промежуточное состояние), но все еще остается ESTABLISHED на локальном конце.

Наконец, через еще несколько минут локальное приложение прерывается по истечении времени ожидания и также исчезает из локального вывода netstat.

Когда я смотрю на захват пакета этого соединения на стороне клиента, существует длительный (ожидаемый) период бездействия, который, кажется, вызывает проблему, затем локальный конец снова пытается передать некоторые данные, но никогда не получает ACK. Вместо этого происходит 15 повторных TCP-передач с интервалами, увеличивающимися с 0,3 до 120 секунд. Никакая активность не фиксируется после этого.

У кого-нибудь есть предложение, как я мог бы отладить это дальше, чтобы выяснить, где проблема и как ее исправить?

Дополнительно и / или в качестве временного обходного пути: существует ли какой-либо способ глобально сократить время ожидания на клиенте и / или сервере, чтобы сократить время до прерывания работы локального приложения?

1 ответ1

1

Подводя итог из ветки debian-user:

Эти симптомы согласуются с тем, что какое-то устройство NAT сидит между клиентом и сервером и прерывает бездействующие соединения через 300 секунд.

Где-то в цепочке должно быть устройство NAT, потому что представление клиента о его IP-адресе (192.168.0.10) отличается от того, которое сервер использует для отправки данных клиенту (68.5.174.98). Кроме того, сеть 192.168.xy зарезервирована для локального использования.

Обходной путь должен включить поддержку TCP. К сожалению, это необходимо настроить в каждой программе отдельно (например, используя опцию ServerAliveInterval в ssh). Однако в Linux библиотека libkeepalive может использоваться с LD_PRELOAD для активации необходимой опции сокета даже для программ, которые обычно не поддерживают ее.

Для меня лучшим решением было заменить ответственный кабельный шлюз Cisco DPC3825 кабельным модемом NetGear CMD31T и шлюзом NetGear WGR614v9. Первый также делает NAT, но не имеет такого невероятно короткого времени ожидания.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .