Платформа фильтрации Windows, отбрасывающая соединения SQL Server
Я исследовал проблемы соединения между моим веб-сервером (Web01) и сервером базы данных (Database01). Моя текущая настройка:
Web01 - две сетевые карты, одна внешняя (защищенная от огня), одна внутренняя (не защищенная от огня).
Database01 - та же конфигурация, что и выше.
Два сервера обмениваются данными с использованием частного сетевого адаптера, поэтому профиль брандмауэра отключен. Я обнаружил, что на Web01 я получаю две ошибки:
WEB01: A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable)
или же
WEB01: The wait operation timed out
Это не согласуется, хотя они более вероятны, когда я выполняю сканирование (через Xenu) на Web01 для сканирования через новый веб-сайт.
На Database01 я определил серию сообщений от платформы фильтрации Windows:
DATABASE01: The Windows Filtering Platform has blocked a packet.
Исследуя это, это тихий фильтр предотвращения сканирования портов, встроенный в брандмауэр Windows. Эта функция работает независимо от того, что профиль Private (для частного сетевого адаптера) отключен.
Целью этой функции является перехват запросов на порты, к которым не подключен слушатель, и отклонение пакета.
Проблема в том, что рассматриваемый порт является портом сервера SQL по умолчанию, 1433
и sql сервер слушает.
Поэтому мой вопрос заключается в том, при каких других обстоятельствах брандмауэр будет отбрасывать пакеты таким образом.
Другие комментарии / возможные проблемы / примечания:
- Я использую Entity Framework с Autofac, и мой контекст использует область действия каждого запроса. Это должно гарантировать, что соединения закрываются и удаляются в конце каждого запроса, но внутренне это реализует модель единицы работы, в которой я надеюсь, что соединения открываются и закрываются для каждой пакетной операции, поэтому не должны ждать окончания любые потенциально длительные запросы.
- Конфигурация пула базы данных для ASP.NET не изменилась, поэтому время жизни соединения и размер пула соединений по умолчанию установлены.
- Первоначально в строке подключения было указано имя сервера, поэтому экземпляр по умолчанию:
server=database01
, но чтобы устранить любые потенциальные проблемы со службой браузера сервера Sql, я изменил строку подключения наserver=tcp:database01,1433
для принудительного использования TCP-соединения используется (чтобы он не беспокоился о совместной памяти или именованных каналах), и точно указали порт (поэтому ему не нужно сначала запрашивать службу браузера, чтобы идентифицировать правильный порт). - Database01 действует как принципал для зеркального отображения базы данных (как часть решения для зеркального отображения с двумя серверами с автоматическим переключением при сбое, Database02 в качестве партнера и Web01, работающий с SQL Server Express в качестве свидетеля). Я отключил зеркалирование целевых баз данных, и проблема все еще возникает.
- Я подтвердил, что
sqlserver.exe
слушает в порту1433
с использованиемnetstat -anob -p tcp
команда и может видеть его следующим образом:
netstat -anob -p tcp
TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING 1896
TCP 192.168.3.2:1433 192.168.3.2:49274 ESTABLISHED 1896
В приведенных выше результатах 192.168.3.2 - это частный IP-адрес для Database01, а 192.168.3.1 - это частный IP-адрес для Web01, причем внешний порт 49274 динамически назначается пулом соединений ASP.NET.
Я пытался устранить как можно больше, но я все еще не могу определить корневую проблему:
Почему брандмауэр Windows отбрасывает пакеты для прослушиваемого порта?
Web01: Windows Server 2012 R2 Standard 64bit
База данных 01: 64-разрядная версия Windows Server 2012 с пакетом обновления 1 (SP1) для SQL Server 2012
1 ответ
Решением этой проблемы была функция под названием TCP Offloading. Я не уверен, что это потому, что я работаю в виртуализированной среде или нет, но TCP Offloading вызывал отбрасывание пакетов. Когда эта функция отключена, отбрасываемые пакеты, похоже, исчезают.
Разгрузка TCP снимает нагрузку с обработки сетевых операций ввода-вывода на ЦП путем ее разгрузки на NIC.
Мне интересно, работала ли у меня аппаратная среда, если бы эта проблема все еще возникала.
http://www.rackspace.com/knowledge_center/article/disabling-tcp-offloading-in-windows-server-2012