Вопрос или проблема
У меня следующая проблема:
Я настроил Windows Server 2022 на выделенном сервере в Hetzner. Сервер Apache работает на порте 80.
Когда я обращаюсь к порту 80, возникают временные задержки до 20 секунд для запроса. Я могу воспроизвести это, запустив цикл с помощью curl, отправляя несколько сотен запросов подряд:
for i in `seq 1 1000`; do echo -n "start $i curl... " ;curl http://abcd.de/xyxy/test.html >/dev/null;echo "curl done";done
После нескольких запросов соединение начинает замедляться (запрос curl уже занимает несколько секунд), пока в конечном итоге не произойдет тайм-аут, и запрос полностью не потеряется:
start 93 curl... curl done
start 94 curl... curl done
start 95 curl... curl done
start 96 curl... curl done
start 97 curl... curl: (28) Не удалось подключиться к abcd.de порт 80 за 21050 мс: Не удалось подключиться к серверу
curl done
start 98 curl... curl done
start 99 curl... curl done
Что я проверил на данный момент:
- Это происходит на большинстве компьютеров в нашей корпоративной сети.
- Когда я запускаю тот же цикл curl с других машин вне нашей корпоративной сети, проблема почти никогда не возникает.
- Я подозревал нашу корпоративную сеть, но все центральные сетевые устройства уже были заменены.
- Если я изменю порт прослушивания Apache на сервере (например, на 1080), все работает нормально.
- Я подозревал брандмауэр на сервере, но ничего не нашел.
Логи Wireshark
Теперь я установил Wireshark на сервер и захватил некоторое сетевое движение:
1084 30.396515 client.ip win.server.ip TCP 66 3178 → 80 [ACK] Seq=95 Ack=1449 Win=31872 Len=0 TSval=181231592 TSecr=2355576
1085 30.396515 client.ip win.server.ip TCP 66 3178 → 80 [ACK] Seq=95 Ack=2897 Win=31872 Len=0 TSval=181231592 TSecr=2355576
1086 30.396515 client.ip win.server.ip TCP 78 [TCP Dup ACK 1085#1] 3178 → 80 [ACK] Seq=95 Ack=2897 Win=31872 Len=0 TSval=181231592 TSecr=2355576 SLE=4345 SRE=5793
1087 30.396679 client.ip win.server.ip TCP 66 3178 → 80 [ACK] Seq=95 Ack=5793 Win=31872 Len=0 TSval=181231592 TSecr=2355576
...
1093 30.407663 client.ip win.server.ip TCP 74 [TCP Port numbers reused] 3158 → 80 [SYN] Seq=0 Win=32120 Len=0 MSS=1460 SACK_PERM TSval=181231603 TSecr=0 WS=128
1095 31.423980 client.ip win.server.ip TCP 74 [TCP Retransmission] 3158 → 80 [SYN] Seq=0 Win=32120 Len=0 MSS=1460 SACK_PERM TSval=181232620 TSecr=0 WS=128
1096 32.447763 client.ip win.server.ip TCP 74 [TCP Retransmission] 3158 → 80 [SYN] Seq=0 Win=32120 Len=0 MSS=1460 SACK_PERM TSval=181233644 TSecr=0 WS=128
1097 33.471772 client.ip win.server.ip TCP 74 [TCP Retransmission] 3158 → 80 [SYN] Seq=0 Win=32120 Len=0 MSS=1460 SACK_PERM TSval=181234668 TSecr=0 WS=128
Похоже, что система Windows перестает отправлять SYN-ACK, что мешает правильному установлению TCP-соединения.
Есть идеи, что может вызывать это? Буду благодарен за любые соображения!
Ответ или решение
Теория
Ваше описание проблемы указывает на возникновение задержек при обращении к серверу Apache, работающему на Windows Server 2022. Это может быть связано с различными факторами. Обратите внимание, что проблема проявляется главным образом в корпоративной сети и с портом 80, но не наблюдается, когда вы переключаетесь на другой порт или когда запросы выполняются из вне корпоративной сети. Это подсказывает, что проблема может быть связана с сетевыми настройками или ограничениями, применяемыми в корпоративной среде.
Один из ключевых симптомов, выявленных в логах Wireshark, — это прекращение отправки SYN-ACK Windows системой, что мешает установлению TCP-соединения. Это может указывать на проблему с конфигурацией сети или самим сетевым стеком Windows, который может быть настроен или заблокирован из-за политики безопасности или неправильно настроенного сетевого интерфейса.
Кроме того, наличие дубликатов ACK и переключение портов может вызывать ситуацию, когда пакетный фильтр считает трафик подозрительным (например, из-за потенциальной атаки), и поэтому начинает блокировать установку соединений.
Пример
Рассмотрим гипотетическую организацию, где в корпоративной сети внезапно начинают возникать задержки в работе веб-сервера, работающего на Windows Server 2022 на порту 80. Администраторы первыми подозревают проблемы в сети, однако после замены ключевых устройств и оборудования проблема остается. Логирование с помощью инструментов сетевого анализа показывает, что периодически происходит перекрывание портов и TCP-соединения не создаются. Несмотря на это, простое переключение веб-сервера на другой порт, например 1080, решает проблему, что указывает на ограничение трафика на порту 80.
Применение
Для решения проблемы рекомендуются следующие шаги:
-
Анализ корпоративной сети:
- Убедитесь, что настройки брандмауэра вашей корпоративной сети не блокируют или ограничивают трафик на порту 80 специфическим образом. Некоторые брандмауэры могут неправильно интерпретировать большой объем входящего трафика как DDoS-атаку и, следовательно, могут начать блокировать или ограничивать эти запросы.
- Проверьте наличие сетевых политик по ограничению скорости или борьбе с закрытием соединений, которые могут автоматически закрывать некоторое количество открытых соединений при превышении лимитов.
-
Анализ серверных настроек и ошибки конфигурации:
- Проверьте настройки TCP/IP на сервере Windows и убедитесь, что нет накладок с {TCP портами или номером последовательности TCP}. Иногда проблемы могут быть вызваны неподдерживаемыми версиями {сетевого аппаратного обеспечения или драйверами}, которые правильно не обрабатывают новые запросы на соединение.
- Выполните обновления и патчи для Windows Server 2022. Бывают случаи, когда соответствующие обновления ОС могут исправить проблемы с сетевым стеком.
-
Наблюдение и логирование:
- Продолжайте использовать сетевой мониторинг, как Wireshark, для сбора дополнительной информации. Смотрите на закономерности в логах, которые могли бы указывать на то, когда и почему сервер прекращает отправлять SYN-ACK.
- Посмотрите на любой специфический трафик или новые паттерны используемых IP-адресов для идентификации, что могло вызвать ограничения на порт 80.
-
Тесты производительности и нагрузки:
- Используйте тестирование нагрузки для мониторинга того, как сервер обрабатывает ситуацию с массовыми запросами. Это поможет выявить, является ли проблема систематической и проявляется ли она при определенных уровнях нагрузки.
-
Консультирование и профессиональная поддержка:
- Если проблема не будет решена вышеуказанными методами, стоит привлечь специалистов по сети или внешних консультантов, которые могут помочь идентифицировать сложные проблемы в сетевом взаимодействии.
Учитывание всех этих аспектов и последовательно реагируя на полученные данные, вы сможете более точно диагностировать и, возможно, устранить проблему, обеспечивая более стабильное и надежное соединение вашего Apache сервера с клиентами.