Firewall do Windows para Desenvolvedores de Jogos
Este artigo descreve o Firewall do Windows – por que ele existe, o que ele realiza e como ele faz isso. O mais importante é que ele descreve como configurar seu jogo para funcionar bem com o firewall.
Conteúdo:
- O que é um Firewall?
- Como saber se meu jogo foi afetado?
- O firewall antes do Windows XP SP2
- O firewall do Windows XP SP2 é melhor
- Trabalhando com o Firewall do Windows
- Integração usando InstallShield InstallScript
- Integração ao Wise para Windows Installer
- Integração ao Windows Installer
- Recomendações
O que é um firewall?
O firewall fornece uma barreira contra invasões baseadas em rede. Ele bloqueia o tráfego de entrada não solicitado e torna o sistema praticamente invisível na Internet rejeitando solicitações do protocolo ICMP. Isso significa que ping e tracert não funcionarão. O firewall também parece e rejeita pacotes inválidos.
Essa barreira impede ataques oportunistas. Os ataques se espalham encontrando muitos sistemas com a mesma vulnerabilidade. O firewall pode impedir muitos ataques colocando um sinal de "não perturbe" para esses recursos que não estão em uso no momento; o ataque é ignorado e não atinge casa. O benefício essencial do Firewall do Windows é que recursos e aplicativos que não estão em uso não podem ser caminhos para ataques.
O usuário configura o sistema para identificar quais aplicativos e recursos são necessários e deve estar aberto à rede. Isso acontece quando um aplicativo é instalado ou quando tenta se abrir na rede.
Como saber se meu jogo foi afetado?
Com a chegada do Windows XP SP2, o Firewall do Windows foi amplamente implantado. Todos os jogos multijogador do Windows são afetados até certo ponto. Embora os clientes geralmente estejam em boa forma, servidores, hosts e pares em ponto a ponto precisam do firewall configurado para continuar funcionando. Especificamente, o tráfego não solicitado de entrada é descartado. O firewall intercepta pacotes de filtro de tráfego de rede com base no conteúdo do pacote e na atividade de rede recente. O firewall usa o conteúdo e a atividade para decidir encaminhar ou remover um pacote. Depois que o firewall estiver configurado corretamente, um jogo poderá aceitar o tráfego não solicitado de entrada como antes.
Quem tem tráfego não solicitado de entrada?
- Cliente/Servidor: todos os participantes se conectam a um servidor central. O servidor central é aquele com tráfego não solicitado de entrada. Os clientes que se conectam ao servidor estão solicitando tráfego de retorno, o que é esperado e tem permissão para passar pelo firewall se as regras para clientes forem seguidas. O servidor central deve ser configurado para aceitar o tráfego não solicitado para permitir que o tráfego do cliente passe pelo firewall.
- MMP (multijogador maciço): todos os participantes estão conectados a um data center. Isso equivale a uma relação de cliente/servidor complexa, pois o data center tem o tráfego não solicitado de entrada. Os participantes são clientes e, em geral, não precisam aceitar tráfego não solicitado.
- Ponto a ponto, em que todos os participantes estão conectados uns aos outros diretamente: todos os participantes devem estar prontos para aceitar o tráfego não solicitado de qualquer novo jogador que ingresse no grupo. De certa forma, cada um dos participantes deve funcionar como um host, portanto, todos eles devem ser configurados como se fossem hosts.
Os clientes geralmente estão em boa forma. Suas conexões TCP/IP (Protocolo de Controle de Transmissão de Saída) funcionarão bem, assim como as mensagens de UDP (Protocolo de Datagrama de Usuário) de saída, juntamente com respostas oportunas a essas mensagens , o firewall mantém a porta aberta por 90 segundos após cada mensagem de saída em antecipação a uma resposta.
O firewall antes do Windows XP SP2
O ICF (Firewall de Conexão com a Internet) no Windows XP e no Windows Server 2003 é um filtro de pacote com estado e manipula o Protocolo de Internet, versão 4 (IPv4) e o Protocolo de Internet, versão 6 (IPv6). No entanto, ele não está ativado por padrão e não dá suporte a pilhas de rede de terceiros, das quais há um número significativo no mundo, como grandes provedores de internet, incluindo empresas nacionais de telefonia.
Para aqueles que não estão no Windows XP SP2, é altamente recomendável ativar o ICF. O ICF (Firewall de Conexão com a Internet) fornece mapeamento de porta para substituir o filtro de pacote. Essencialmente, você especifica a porta a ser aberta e ela permanece aberta até que você a feche. Se o usuário for reinicializado antes de ser fechado, ele permanecerá aberto até fechar especificamente. O controle do firewall e do gerenciamento dos mapeamentos de porta é feito por meio de INetSharingManager (IPv4) e INetFwV6Mgr (IPv6).
O Firewall do Windows para Windows XP SP2 é uma solução mais abrangente que dá suporte a pilhas de rede de terceiros e lida com portas de forma mais inteligente: as portas são mantidas abertas apenas enquanto o aplicativo que precisa delas ainda estiver ativo.
O firewall do Windows XP SP2 é melhor
O Windows XP SP2 coloca as opções de segurança e as configurações na frente. O objetivo é proteger por padrão e permitir que o usuário faça escolhas informadas sobre quais aplicativos podem ser executados em seu computador.
O novo Firewall do Windows está disponível no Windows XP SP2 e no Windows Server 2003 Service Pack 1 (SP1). Assim como o ICF, é um firewall de software que dá suporte a IPv4 e IPv6, mas ao contrário do ICF, o Firewall do Windows:
- Tem proteção de tempo de inicialização do sistema, eliminando uma pequena janela de vulnerabilidade durante a inicialização.
- Dá suporte a pilhas de rede de terceiros.
- Tem um modo "ativado sem exceções" que bloqueia todos os pacotes de entrada não solicitados. Isso é ótimo quando você está usando uma rede pública, como em um aeroporto ou cafeteria.
No modo "ativado sem exceções", todos os orifícios estáticos são fechados. As chamadas à API para abrir um buraco estático são permitidas, mas adiadas; ou seja, eles não são aplicados até que o firewall volte para a operação normal. Todas as solicitações de escuta por aplicativos também serão ignoradas. As conexões de saída ainda serão bem-sucedidas.
Para novos aplicativos, adicione seu aplicativo à "Lista de Exceções" durante a instalação. Você pode adicionar o aplicativo usando a interface INetFwAuthorizedApplications , fornecendo o caminho completo. Abordaremos os detalhes no exemplo.
Como uma observação lateral, você pode estar se perguntando se é um risco de segurança que os aplicativos possam adicionar e remover aplicativos da lista de exceções de qualquer intervenção do usuário, ou talvez você pense que o maior risco é que os aplicativos possam desabilitar completamente o firewall. Para executar esses feitos, o aplicativo deve ter privilégios de administrador. Se você tiver um código mal-intencionado em execução no modo de administrador em seu sistema, o jogo já acabou e o hacker já venceu. A capacidade do hacker de desabilitar o firewall mereceria pouco mais do que uma nota de rodapé.
Aplicativos herdados, incluindo aplicativos instalados antes da atualização do usuário para o Windows XP SP2, são tratados com o pop-up Lista de Exceções (consulte a Figura 1). Essa caixa de diálogo mostra quando um aplicativo tenta abrir uma porta para o tráfego de entrada , seja ao chamar bind() com uma porta diferente de zero para UDP ou accept() para o protocolo TCP/IP. Você deve estar executando como administrador para "Desbloquear" aplicativos, enquanto "Pergunte-me mais tarde" não permite desta vez, mas pergunta novamente na próxima vez.
Esta é uma caixa de diálogo modal do sistema sem bloqueio. Ao executar um aplicativo Microsoft Direct3D em tela inteira, a caixa de diálogo é fornecida abaixo; e o usuário pode lidar com isso quando o aplicativo sai do modo de tela inteira ou das guias alt de volta para a área de trabalho. No entanto, nem sempre é óbvio para o usuário que essa caixa de diálogo apareceu quando um jogo está em execução em tela inteira, portanto, é importante evitar fazer com que essa caixa de diálogo apareça usando a interface INetFwAuthorizedApplications , conforme discutido abaixo.
Figura 1. Caixa de diálogo pop-up lista de exceções
Você observará que o pop-up sabe o nome e o editor do aplicativo. Não há magia aqui, ela é extraída das informações de versão do executável. Essas informações são uma ferramenta importante de administração do sistema; ele é usado até mesmo para o trabalho de compatibilidade do aplicativo em andamento. Alguns aplicativos não mantêm essas informações de versão atualizadas.
Os usuários também podem adicionar seus aplicativos por meio da interface do usuário (consulte a Figura 2)
Figura 2. Configurando o firewall
Figura 3. Adicionando um programa à lista de exceções de firewall
O melhor cenário é automatizar adições e remoções da lista de exceções. O melhor momento para executar essas adições e remoções é durante o processo de instalação e desinstalação. Adicionar ou remover da lista de exceções de firewall requer privilégios de administrador, portanto, leve isso em conta.
Trabalhando com o Firewall do Windows
Novamente, a maioria dos jogos só precisa ser adicionada à lista de exceções de firewall se eles podem funcionar como um servidor ou se eles implementam um protocolo de comunicação ponto a ponto. O FirewallInstallHelper.dll é uma DLL de exemplo que pode ser chamada de um instalador. A origem será fornecida se você quiser integrar a origem diretamente ao seu próprio aplicativo. O exemplo pode ser encontrado aqui:
Arquivo | |
---|---|
Origem: | (Raiz do SDK)\Samples\C++\Misc\FirewallInstallHelper |
Executável: | (Raiz do SDK)\Samples\C++\Misc\Bin\<arch>\FirewallInstallHelper.dll |
As funções exportadas por essa DLL são as seguintes:
-
AddApplicationToExceptionListW
-
Essa função adiciona um aplicativo à lista de exceções. Ele usa um caminho completo para o executável e um nome amigável que aparecerá na lista de exceções do firewall. Essa função requer privilégios de administrador.
-
AddApplicationToExceptionListA
-
Versão ANSI de AddApplicationToExceptionListW
-
RemoveApplicationFromExceptionListW
-
Essa função remove o aplicativo da lista de exceções. Ele usa um caminho completo para o executável. Essa função requer privilégios de administrador
-
RemoveApplicationFromExceptionListA
-
Versão ANSI de RemoveApplicationFromExceptionListW
-
CanLaunchMultiplayerGameW
-
Essa função relatará se o aplicativo foi desabilitado ou removido da lista de exceções. Ele deve ser chamado toda vez que o jogo é executado. A função usa um caminho completo para o executável. Essa função não requer privilégios de administrador.
-
CanLaunchMultiplayerGameA
-
Versão ANSI de CanLaunchMultiplayerGameW
-
SetMSIFirewallProperties
-
Chame isso somente se você estiver usando ações personalizadas no Windows Installer. Consulte abaixo para obter mais detalhes.
-
AddToExceptionListUsingMSI
-
Chame isso somente se você estiver usando ações personalizadas no Windows Installer. Consulte abaixo para obter mais detalhes.
-
RemoveFromExceptionListUsingMSI
-
Chame isso somente se você estiver usando ações personalizadas no Windows Installer. Consulte abaixo para obter mais detalhes.
As seções a seguir descrevem métodos específicos de chamar as funções DLL exportadas desse FirewallInstallHelper de dentro de um pacote InstallShield, Wise ou Windows Installer. Todos os métodos renderizam os mesmos resultados e cabe ao desenvolvedor determinar qual método implementar.
Integração usando InstallShield InstallScript
Um método alternativo de usar as APIs de Firewall é adicionar as chamadas de função a um InstallShield InstallScript. As etapas necessárias para integrar são bastante simples:
Abra um projeto InstallScript no editor InstallShield.
Adicione o FirewallInstallHelper.dll ao projeto como um arquivo de suporte.
- Na guia Assistente de Projeto, abra a guia Arquivos de Aplicativo.
- Clique no botão Adicionar Arquivos para adicionar arquivos à Pasta de Destino do Aplicativo.
- Navegue até o FirewallInstallHelper.dll que você criou ou use aquele fornecido no SDK do DirectX e adicione-o ao projeto.
Adicione InstallScript ao projeto.
- Abra a exibição Designer instalação e clique no comportamento e na lógica | InstallScript
- Clique no arquivo InstallScript (geralmente setup.rul) para abri-lo no editor
- Cole o seguinte código no arquivo 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;
- Altere os comentários TODO com o nome do aplicativo que será mostrado na Lista de Exceções do Firewall e o caminho para o executável do jogo em relação ao diretório de instalação.
Integração ao Wise para Windows Installer
Para integrar-se ao Wise for Windows Installer, estas etapas precisam ser feitas:
Abra seu projeto Wise for Windows Installer.
Selecione a guia "Especialista em Instalação" na parte inferior.
Clique em Arquivos e adicione o FirewallInstallHelper.dll do DXSDK ao diretório de instalação do jogo.
Selecione a guia "Script MSI" na parte inferior.
Selecione a guia "Executar Imediato" na parte inferior.
Após CostFinalize, adicione uma ação "Definir Propriedade" que define FULLPATH como "[INSTALLDIR]caminho relativo para executável do diretório de instalação". Por exemplo, "[INSTALLDIR]game.exe" sem as aspas
Selecione a guia "Executar Adiado" na parte inferior.
Após PublishProduct, adicione uma "instrução If" com a condição "NOT Installed" (diferencia maiúsculas de minúsculas).
No bloco Se, adicione uma ação "Chamar DLL Personalizada do Destino".
- Defina o campo Arquivo DLL como "[INSTALLDIR]FirewallInstallHelper.dll".
- Defina o campo Nome da Função como "AddApplicationToExceptionListA".
- Adicione um parâmetro com o tipo "ponteiro de cadeia de caracteres", a origem do valor "Property" e o nome da propriedade "FULLPATH".
- Adicione um segundo parâmetro com o tipo "ponteiro de cadeia de caracteres", a origem do valor "Constante" e defina o valor constante como o nome amigável do aplicativo que você deseja exibir na lista de exceções do firewall.
- Feche o bloco If adicionando uma "Instrução End".
Logo acima da ação RemoverFiles perto da parte superior, adicione outro bloco If, com a condição "REMOVE~="ALL"" (diferencia maiúsculas de minúsculas e sem as aspas externas).
No segundo bloco If, adicione uma ação "Chamar DLL Personalizada do Destino".
- Defina o campo Arquivo DLL como "[INSTALLDIR]FirewallInstallHelper.dll".
- Defina o campo Nome da Função como "RemoveApplicationFromExceptionListA".
- Adicione um parâmetro com o tipo "ponteiro de cadeia de caracteres", a origem do valor "Property" e o nome da propriedade "FULLPATH".
- Feche o segundo bloco If adicionando uma "Instrução End".
Integração ao Windows Installer
Para integrar com o Windows Installer no alto nível, essas etapas precisam ser feitas. Eles serão explicados em detalhes abaixo:
- Adicione duas propriedades "FriendlyNameForFirewall" e "RelativePathToExeForFirewall", conforme descrito abaixo.
- Após a ação CostFinalize, chame "SetMSIFirewallProperties" em uma ação personalizada imediata para definir as propriedades MSI apropriadas para as outras ações personalizadas.
- Durante a instalação após a ação InstallFiles, chame uma ação personalizada adiada que usa a função "AddToExceptionListUsingMSI" do FirewallInstallHelper.
- Durante a desinstalação após a ação InstallFiles, chame uma ação personalizada adiada que usa a função "RemoveFromExceptionListUsingMSI" do FirewallInstallHelper.
- Durante a reversão, chame uma ação personalizada adiada que também chama a função "RemoveFromExceptionListUsingMSI" do FirewallInstallHelper.
Veja a seguir as etapas necessárias para fazer isso usando um editor MSI, como o Orca, encontrado no SDK da Plataforma. Observe que alguns editores têm assistentes que simplificam algumas destas etapas:
Abra o pacote MSI no Orca.
Adicione o seguinte à tabela Binário:
Nome Dados FIREWALL Aponte para o FirewallInstallHelper.dll. Esse arquivo será inserido no pacote MSI, portanto, você precisará executar essa etapa sempre que recompilar FirewallInstallHelper.dll. Adicione o seguinte à tabela CustomAction:
Ação Tipo Fonte Destino FirewallSetMSIProperties msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 FIREWALL SetMSIFirewallProperties FirewallAdicionar msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 FIREWALL AddToExceptionListUsingMSI FirewallRemove msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 FIREWALL RemoveFromExceptionListUsingMSI FirewallRollBackAdd msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 FIREWALL RemoveFromExceptionListUsingMSI FirewallRollBackRemove msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 FIREWALL AddToExceptionListUsingMSI Adicione o seguinte à tabela InstallExecuteSequence:
Ação Condição Sequência Observações FirewallSetMSIProperties 1010 Isso se coloca logo após CostFinalize. FirewallAdicionar NOT Installed 4021 Essa ação personalizada só acontecerá durante uma nova instalação. O número de sequência coloca a ação após InstallFiles e após as reversões. FirewallRollBackAdd NOT Installed 4020 Essa ação personalizada só acontecerá quando uma nova instalação for cancelada. O número de sequência coloca a ação após InstallFiles e antes da ação Adicionar personalizado. FirewallRemove Instalado 3461 Essa ação personalizada só acontecerá durante a desinstalação. O número de sequência coloca a ação diretamente antes de RemoveFiles e após as reversões. FirewallRollBackRemove NOT Installed 3460 Essa ação personalizada só acontecerá quando uma desinstalação for cancelada. O número de sequência coloca a ação diretamente antes de RemoveFiles e antes da ação Remover personalizado. Adicione o seguinte à tabela Propriedade:
Propriedade Valor FriendlyNameForFirewall Precisa ser o nome que a lista de exceções exibirá. Por exemplo, "Exemplo de jogo" RelativePathToExeForFirewall Precisa ser o executável instalado do jogo. Por exemplo, "ExampleGame.exe"
Para obter mais informações sobre o Windows Installer, consulte Windows Installer.
Recomendações
O firewall está aqui para ficar. Essas recomendações darão aos seus clientes uma boa experiência de firewall com seu jogo do Windows:
- Não diga aos usuários para desabilitar o firewall para jogar seu jogo. Isso torna toda a máquina vulnerável mesmo quando eles não estão jogando seu jogo.
- Torne a configuração de firewall perfeita para seus usuários. Adicione seu aplicativo à lista de exceções durante a instalação e remova o aplicativo da lista de exceções durante a instalação.
- Envie comentários ao usuário se o multijogador estiver bloqueado pelo estado do firewall. Por exemplo, desabilite os recursos de rede se eles não funcionarem porque o aplicativo não é permitido ou porque o sistema está no modo "sem exceções".