Поделиться через


Брандмауэр Windows для разработчиков игр

В этой статье описывается брандмауэр Windows: почему он существует, что он делает и как это делается. Самое главное, в нем описывается, как настроить игру для эффективной работы с брандмауэром.

Содержимое:

Что такое брандмауэр?

Брандмауэр обеспечивает барьер для сетевых вторжений. Он блокирует незапрошенный входящий трафик и делает систему в основном невидимой в Интернете, отклоняя запросы ICMP. Это означает, что ping и tracert не будут работать. Брандмауэр также ищет и отклоняет недопустимые пакеты.

Этот барьер предотвращает оппортунистические атаки. Атаки распространяются путем обнаружения множества систем с одной и той же уязвимостью. Брандмауэр может сорвать многие атаки, установив знак "Не беспокоить" для тех функций, которые в настоящее время не используются; нападение игнорируется и не падает домой. Основное преимущество брандмауэра Windows заключается в том, что функции и приложения, которые не используются, не могут быть средствами для атак.

Пользователь настраивает систему, чтобы определить, какие приложения и функции необходимы и должны быть открыты для сети. Это происходит либо при установке приложения, либо при попытке открыть себя в сети.

Как определить, затронута ли игра?

С появлением Windows XP с пакетом обновления 2 (SP2) брандмауэр Windows был широко развернут. Все многопользовательские игры Windows в некоторой степени затрагиваются. Хотя клиенты, как правило, находятся в хорошей форме, серверы, узлы и одноранговые узлы в одноранговых узлах должны использовать брандмауэр, настроенный для продолжения работы. В частности, входящий незапрашиваемый трафик удаляется. Брандмауэр перехватывает пакеты фильтров сетевого трафика на основе содержимого пакета и последних сетевых действий. Брандмауэр использует содержимое и действие для принятия решения о переадресации или удалении пакета. После правильной настройки брандмауэра игра сможет принимать входящий незапрашиваемый трафик, как и раньше.

Кто имеет входящий незапрашиваемый трафик?

  • Клиент или сервер. Все участники подключаются к центральному серверу. Центральный сервер — это сервер с входящим незапрашиваемым трафиком. Клиенты, подключающиеся к серверу, запрашивают обратный трафик, который должен проходить через брандмауэр при соблюдении правил для клиентов. Центральный сервер должен быть настроен на прием незапрашиваемого трафика, чтобы разрешить трафик клиента проходить через брандмауэр.
  • Массовая многопользовательская игра (MMP). Все участники подключены к центру обработки данных. Это представляет собой сложную связь между клиентом и сервером, так как центр обработки данных имеет входящий незапрашиваемый трафик. Участники являются клиентами и, как правило, не должны принимать незапрашиваемый трафик.
  • Одноранговая связь, где все участники подключены друг к другу напрямую. Все участники должны быть готовы принять незапрашиваемый трафик от любого нового игрока, присоединяющегося к группе. В каком-то смысле каждый из участников должен функционировать как узел, поэтому все они должны быть настроены так, как если бы они были узлами.

Клиенты, как правило, находятся в хорошей форме. Исходящие подключения tcp/IP будут работать нормально, как и исходящие сообщения UDP, а также своевременные ответы на эти сообщения. Брандмауэр сохраняет порт открытым в течение 90 секунд после каждого исходящего сообщения в ожидании ответа.

Брандмауэр до Windows XP с пакетом обновления 2 (SP2)

Брандмауэр подключения к Интернету (ICF) в Windows XP и Windows Server 2003 является фильтром пакетов с отслеживанием состояния и обрабатывает оба протокола IPv4 и IPv6. Тем не менее, он не включен по умолчанию и не поддерживает сторонние сетевые стеки, из которых есть значительное количество в мире, таких как крупные интернет-провайдеры, включая национальные телефонные компании.

Для пользователей, не использующих Windows XP с пакетом обновления 2 (SP2), настоятельно рекомендуется включить ICF. Брандмауэр подключения к Интернету (ICF) предоставляет сопоставление портов для переопределения фильтра пакетов. По сути, вы указываете порт для открытия, и он остается открытым до закрытия. Если пользователь перезагружается до закрытия, он будет оставаться открытым до специального закрытия. Управление брандмауэром и сопоставлением портов осуществляется через INetSharingManager (IPv4) и INetFwV6Mgr (IPv6).

Брандмауэр Windows для Windows XP с пакетом обновления 2 (SP2) — это более комплексное решение, которое поддерживает сторонние сетевые стеки и более интеллектуально обрабатывает порты: порты остаются открытыми только до тех пор, пока приложение, которому они нужны, по-прежнему активно.

Брандмауэр Windows XP с пакетом обновления 2 (SP2) лучше

Windows XP с пакетом обновления 2 (SP2) размещает параметры и параметры безопасности на переднем крае. Цель состоит в том, чтобы защитить по умолчанию и позволить пользователю принимать обоснованные решения о том, какие приложения разрешено запускать на своем компьютере.

Новый брандмауэр Windows доступен в Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003 с пакетом обновления 1 (SP1). Как и ICF, это программный брандмауэр, который поддерживает как IPv4, так и IPv6, но в отличие от ICF брандмауэра Windows:

  • Имеет защиту системы во время загрузки, устраняя небольшое окно уязвимости во время загрузки.
  • Поддерживает сторонние сетевые стеки.
  • Имеет режим "включено без исключений", который блокирует все незапрошенные входящие пакеты. Это здорово, когда вы используете общедоступную сеть, например, в аэропорту или кафе.

В режиме "включено без исключений" все статические отверстия закрываются. Вызовы API для открытия статического отверстия разрешены, но откладываются; то есть они не применяются, пока брандмауэр не переключится на нормальную работу. Все запросы на прослушивание от приложений также будут игнорироваться. Исходящие подключения по-прежнему будут успешно выполняться.

Для новых приложений добавьте приложение в "Список исключений" во время установки. Приложение можно добавить с помощью интерфейса INetFwAuthorizedApplications , указав полный путь. Мы рассмотрим сведения в примере.

Кроме того, вы можете задаться вопросом, может ли это риск для безопасности, что приложения могут добавлять и удалять приложения из списка исключений любое вмешательство пользователя, или, возможно, вы думаете, что больший риск заключается в том, что приложения могут полностью отключить брандмауэр. Для выполнения этих операций приложение должно иметь права администратора. Если у вас есть вредоносный код, запущенный в режиме администратора в вашей системе, игра уже закончена, и хакер уже выиграл. Возможность хакера отключить брандмауэр будет заслуживает немного больше, чем сноска.

Устаревшие приложения, включая приложения, установленные до обновления пользователя до Windows XP с пакетом обновления 2 (SP2), обрабатываются с помощью всплывающего окна Список исключений (см. рис. 1). В этом диалоговом окне показано, когда приложение пытается открыть порт для входящего трафика — при вызове bind() с ненулевым портом для UDP или accept() для протокола TCP/IP. Вы должны работать от имени администратора, чтобы разблокировать приложения, в то время как "Спросите меня позже" запрещает этот раз, но запрос еще раз в следующий раз.

Это неблокирующее системное модальное диалоговое окно. При запуске полноэкранного приложения Microsoft Direct3D диалоговое окно отображается под ; и пользователь может обработать его, когда приложение выходит из полноэкранного режима или alt-tabs обратно на рабочий стол. Однако для пользователя не всегда очевидно, что это диалоговое окно появляется при выполнении игры в полноэкранном режиме, поэтому важно избежать появления этого диалога с помощью интерфейса INetFwAuthorizedApplications , как описано ниже.

Рис. 1. Всплывающее диалоговое окно "Список исключений"

всплывающее диалоговое окно списка исключений

Вы заметите, что всплывающему окну известно имя и издатель приложения. Здесь нет никакой магии — она извлекается из сведений о версии исполняемого файла. Эта информация является важным средством администрирования системы; он даже используется для текущей работы по обеспечению совместимости приложений. Некоторые приложения игнорируют актуальность этой информации о версии.

Пользователи также могут добавлять свои приложения через пользовательский интерфейс (см. рис. 2)

Рис. 2. Настройка брандмауэра

настройка брандмауэра

Рис. 3. Добавление программы в список исключений брандмауэра

добавление программы в список исключений брандмауэра

Лучший сценарий — автоматическое добавление и удаление из списка исключений. Лучшее время для выполнения этих дополнений и удалений — во время установки и удаления. Для добавления или удаления из списка исключений брандмауэра требуются права администратора, поэтому не забудьте принять это во внимание.

Работа с брандмауэром Windows

Опять же, большинство игр необходимо добавить в список исключений брандмауэра, только если они могут функционировать как сервер или если они реализуют протокол одноранговой связи. FirewallInstallHelper.dll — это пример библиотеки DLL, которую можно вызвать из установщика. Источник предоставляется, если вы хотите интегрировать источник непосредственно в собственное приложение. Пример можно найти здесь:

File
Источник: (Корневой каталог пакета SDK)\Samples\C++\Misc\FirewallInstallHelper
Исполняемый файл: (Корневой каталог пакета SDK)\Samples\C++\Misc\Bin\<arch>\FirewallInstallHelper.dll

 

Ниже перечислены функции, экспортируемые этой библиотекой DLL.

AddApplicationToExceptionListW

Эта функция добавляет приложение в список исключений. Он принимает полный путь к исполняемому файлу и понятное имя, которое появится в списке исключений брандмауэра. Для этой функции требуются права администратора.

AddApplicationToExceptionListA

Версия ANSI AddApplicationToExceptionListW

RemoveApplicationFromExceptionListW

Эта функция удаляет приложение из списка исключений. Он принимает полный путь к исполняемому файлу. Для этой функции требуются права администратора.

RemoveApplicationFromExceptionListA

Версия ANSI RemoveApplicationFromExceptionListW

CanLaunchMultiplayerGameW

Эта функция сообщает, было ли приложение отключено или удалено из списка исключений. Он должен вызываться при каждом запуске игры. Функция принимает полный путь к исполняемому файлу. Для этой функции не требуются права администратора.

CanLaunchMultiplayerGameA

Версия ANSI CanLaunchMultiplayerGameW

SetMSIFirewallProperties

Вызывайте этот метод, только если вы используете пользовательские действия в установщике Windows. Дополнительные сведения см. ниже.

AddToExceptionListUsingMSI

Вызывайте этот метод, только если вы используете пользовательские действия в установщике Windows. Дополнительные сведения см. ниже.

RemoveFromExceptionListUsingMSI

Вызывайте этот метод, только если вы используете пользовательские действия в установщике Windows. Дополнительные сведения см. ниже.

В следующих разделах описываются конкретные методы вызова экспортированных функций DLL из этого firewallInstallHelper из пакета Установщика InstallShield, Wise или Windows. Все методы отображают одинаковые результаты, и разработчик должен определить, какой метод следует реализовать.

Интеграция с помощью InstallShield InstallScript

Альтернативным способом использования API брандмауэра является добавление вызовов функций в InstallShield InstallScript. Шаги, необходимые для интеграции, довольно просты:

  1. Откройте проект InstallScript в редакторе InstallShield.

  2. Добавьте FirewallInstallHelper.dll в проект в качестве файла поддержки.

    1. На вкладке Помощник по проектам откройте вкладку Файлы приложения.
    2. Нажмите кнопку Добавить файлы, чтобы добавить файлы в целевую папку приложения.
    3. Перейдите к созданному или используемому FirewallInstallHelper.dll, предоставленному в пакете SDK для DirectX, и добавьте его в проект.
  3. Добавьте InstallScript в проект.

    1. Откройте представление Designer установки и щелкните Поведение и логика | InstallScript
    2. Щелкните файл InstallScript (обычно setup.rul), чтобы открыть его в редакторе.
    3. Вставьте следующий код в файл InstallScript:
    #include "ifx.h"
    
    prototype BOOL FirewallInstallHelper.AddApplicationToExceptionListW( WSTRING, WSTRING );
    prototype BOOL FirewallInstallHelper.RemoveApplicationFromExceptionListW( WSTRING );
    
    function OnMoved()
        WSTRING path[256];
    begin
        // The DLL has been installed into the TARGETDIR
        if !MAINTENANCE then // TRUE when installing
            UseDLL( TARGETDIR ^ "FirewallInstallHelper.dll" );
            path = TARGETDIR ^ "TODO: change to relative path to executable from install directory";
            FirewallInstallHelper.AddApplicationToExceptionListW( path, "TODO: change to friendly app name" );
            UnUseDLL( TARGETDIR ^ "FirewallInstallHelper.dll" );
        endif;
    end;
    
    
    function OnMoving()
        WSTRING path[256];
    begin
        // The DLL is about to be removed from TARGETDIR
        if MAINTENANCE && UNINST != "" then // TRUE when uninstalling
            UseDLL( TARGETDIR ^ "FirewallInstallHelper.dll" );
            path = TARGETDIR ^ "TODO: change to relative path to executable from install directory";
            FirewallInstallHelper.RemoveApplicationFromExceptionListW( path );
            UnUseDLL( TARGETDIR ^ "FirewallInstallHelper.dll" );
        endif;
    end;
    
    1. Измените комментарии todo с именем приложения, которое будет отображаться в списке исключений брандмауэра, и путем к исполняемому файлу игры относительно каталога установки.

Интеграция с установщиком Wise для Windows

Чтобы выполнить интеграцию с установщиком Wise для Windows, необходимо выполнить следующие действия:

  1. Откройте проект Установщика Wise для Windows.

  2. Выберите вкладку "Эксперт по установке" внизу.

  3. Щелкните Файлы и добавьте FirewallInstallHelper.dll из DXSDK в каталог установки игры.

  4. Выберите вкладку "Скрипт MSI" внизу.

  5. Выберите вкладку "Выполнить интерпретацию" в нижней части экрана.

  6. После CostFinalize добавьте действие "Задать свойство", которое устанавливает для FULLPATH значение "[INSTALLDIR]относительный путь к исполняемому файлу из каталога установки". Например, "[INSTALLDIR]game.exe" без кавычек

  7. Перейдите на вкладку "Выполнить отложенное" в нижней части экрана.

  8. После PublishProduct добавьте оператор If с условием NOT Installed (с учетом регистра).

  9. В блоке If добавьте действие "Вызвать пользовательскую библиотеку DLL из назначения".

    1. Задайте для поля ФАЙЛ DLL значение [INSTALLDIR]FirewallInstallHelper.dll.
    2. Задайте для поля Имя функции значение AddApplicationToExceptionListA.
    3. Добавьте параметр с типом "string pointer", значение source "Property" и именем свойства "FULLPATH".
    4. Добавьте второй параметр с типом "string pointer", значение source "Constant" и задайте для константы понятное имя приложения, которое нужно отобразить в списке исключений брандмауэра.
    5. Закройте блок If, добавив оператор End.
  10. Над действием RemoveFiles вверху добавьте еще один блок If с условием REMOVE~="ALL"" (с учетом регистра и без внешних кавычек).

  11. Во втором блоке If добавьте действие "Вызвать пользовательскую библиотеку DLL из назначения".

    1. Задайте для поля ФАЙЛ DLL значение [INSTALLDIR]FirewallInstallHelper.dll.
    2. Задайте для поля Имя функции значение RemoveApplicationFromExceptionListA.
    3. Добавьте параметр с типом "string pointer", значение source "Property" и именем свойства "FULLPATH".
    4. Закройте второй блок If, добавив оператор End.

Интеграция с установщиком Windows

Чтобы выполнить интеграцию с установщиком Windows на высоком уровне, необходимо выполнить эти действия. Они будут подробно описаны ниже:

  • Добавьте 2 свойства FriendlyNameForFirewall и RelativePathToExeForFirewall, как описано ниже.
  • После действия CostFinalize вызовите "SetMSIFirewallProperties" в немедленном настраиваемом действии, чтобы задать соответствующие свойства MSI для других настраиваемых действий.
  • Во время установки после действия InstallFiles вызовите отложенное настраиваемое действие, которое использует функцию AddToExceptionListUsingMSI FirewallInstallHelper.
  • Во время удаления после действия InstallFiles вызовите отложенное настраиваемое действие, которое использует функцию RemoveFromExceptionListUsingMSI FirewallInstallHelper.
  • Во время отката вызовите отложенное настраиваемое действие, которое также вызывает функцию RemoveFromExceptionListUsingMSI FirewallInstallHelper.

Ниже приведены шаги, необходимые для этого с помощью редактора MSI, такого как Orca в пакете SDK для платформы. Обратите внимание, что в некоторых редакторах есть мастеры, упрощающие некоторые из следующих действий:

  1. Откройте пакет MSI в Orca.

  2. Добавьте в таблицу Binary следующее:

    Имя Данные
    БРАНДМАУЭРА Укажите ему FirewallInstallHelper.dll. Этот файл будет внедрен в пакет MSI, поэтому вам придется выполнять этот шаг при каждой перекомпиляции FirewallInstallHelper.dll.

     

  3. Добавьте в таблицу CustomAction следующее:

    Действие Тип Источник Назначение
    FirewallSetMSIProperties msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 БРАНДМАУЭРА SetMSIFirewallProperties
    БрандмауэрДобавить msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 БРАНДМАУЭРА AddToExceptionListUsingMSI
    FirewallRemove msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 БРАНДМАУЭРА RemoveFromExceptionListUsingMSI
    FirewallRollBackAdd msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 БРАНДМАУЭРА RemoveFromExceptionListUsingMSI
    FirewallRollBackRemove msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 БРАНДМАУЭРА AddToExceptionListUsingMSI

     

  4. Добавьте в таблицу InstallExecuteSequence следующее:

    Действие Условие Последовательность Примечания
    FirewallSetMSIProperties 1010 Это место вскоре после CostFinalize.
    БрандмауэрДобавить НЕ установлено 4021 Это настраиваемое действие будет выполняться только во время новой установки. Порядковый номер помещает действие после InstallFiles и после откатов.
    FirewallRollBackAdd НЕ установлено 4020 Это настраиваемое действие будет выполняться только при отмене новой установки. Порядковый номер помещает действие после InstallFiles и перед настраиваемым действием Добавить.
    FirewallRemove Установлено 3461 Это настраиваемое действие будет выполняться только во время удаления. Порядковый номер помещает действие непосредственно перед RemoveFiles и после откатов.
    FirewallRollBackRemove НЕ установлено 3460 Это настраиваемое действие будет выполняться только при отмене удаления. Порядковый номер помещает действие непосредственно перед RemoveFiles и перед пользовательским действием Удалить.

     

  5. Добавьте в таблицу Property следующее:

    Свойство Значение
    FriendlyNameForFirewall Должно быть именем, которое будет отображаться в списке исключений. Например, "Пример игры"
    RelativePathToExeForFirewall Должен быть установленным исполняемым файлом игры. Например, "ExampleGame.exe"

     

Дополнительные сведения о установщике Windows см. в разделе Установщик Windows.

Рекомендации

Брандмауэр здесь, чтобы остаться. Эти рекомендации предоставят вашим клиентам хороший интерфейс брандмауэра в вашей игре Windows:

  • Не сообщайте пользователям отключать брандмауэр для игры. Это делает весь компьютер уязвимым, даже если он не играет в вашу игру.
  • Сделайте конфигурацию брандмауэра удобной для пользователей. Добавьте приложение в список исключений во время установки и удалите приложение из списка исключений во время установки.
  • Оставить отзыв пользователю, если многопользовательский режим заблокирован состоянием брандмауэра. Например, отключите сетевые функции, если они не будут работать из-за запрета приложения или из-за того, что система находится в режиме "без исключений".