Compartir a través de


Firewall de Windows para desarrolladores de juegos

En este artículo se describe el Firewall de Windows: por qué existe, lo que logra y cómo lo hace. Lo más importante es que describe cómo configurar el juego para que funcione bien con el firewall.

Contenido:

¿Qué es un firewall?

El firewall proporciona una barrera contra intrusiones basadas en red. Bloquea el tráfico entrante no solicitado y hace que el sistema sea principalmente invisible en Internet al rechazar las solicitudes del Protocolo de mensajes de control de Internet (ICMP). Esto significa que ping y tracert no funcionarán. El firewall también busca y rechaza paquetes no válidos.

Esta barrera evita ataques oportunistas. Los ataques se propagan mediante la búsqueda de muchos sistemas con la misma vulnerabilidad. El firewall puede frustrar muchos ataques mediante la colocación de un signo de "no molestar" para esas características que no están en uso actualmente; el ataque se omite y no golpea a casa. La ventaja esencial del Firewall de Windows es que las características y aplicaciones que no están en uso no pueden ser vías de ataque.

El usuario configura el sistema para identificar qué aplicaciones y características son necesarias y debe estar abierta a la red. Esto sucede cuando se instala una aplicación o cuando intenta abrirse a la red.

¿Cómo puedo saber si mi juego se ve afectado?

Con la llegada de Windows XP SP2, el Firewall de Windows se ha implementado ampliamente. Todos los juegos multijugador de Windows se ven afectados hasta cierto punto. Aunque los clientes suelen tener una buena forma, los servidores, los hosts y los elementos del mismo nivel en punto a punto necesitan que el firewall esté configurado para seguir funcionando. En concreto, se quita el tráfico entrante no solicitado. El firewall intercepta los paquetes de filtro de tráfico de red en función del contenido del paquete y de la actividad de red reciente. El firewall usa el contenido y la actividad para decidir reenviar o quitar un paquete. Una vez configurado correctamente el firewall, un juego podrá aceptar el tráfico entrante no solicitado como antes.

¿Quién tiene tráfico entrante no solicitado?

  • Cliente/servidor: todos los participantes se conectan a un servidor central. El servidor central es el que tiene tráfico entrante no solicitado. Los clientes que se conectan al servidor solicitan el tráfico devuelto, que se espera y puede pasar a través del firewall si se siguen las reglas de los clientes. El servidor central debe configurarse para aceptar el tráfico no solicitado para permitir que el tráfico del cliente pase a través del firewall.
  • Modo multijugador masivo (MMP): todos los participantes están conectados a un centro de datos. Esto equivale a una relación compleja de cliente/servidor, ya que el centro de datos tiene el tráfico entrante no solicitado. Los participantes son clientes y, en general, no necesitan aceptar el tráfico no solicitado.
  • Punto a punto, donde todos los participantes están conectados entre sí directamente: todos los participantes deben estar listos para aceptar el tráfico no solicitado de cualquier nuevo jugador que se una al grupo. En cierto sentido, cada uno de los participantes debe funcionar como host, por lo que todos deben configurarse como si fueran hosts.

Por lo general, los clientes están en buena forma. Sus conexiones salientes del Protocolo de control de transmisión/Protocolo de Internet (TCP/IP) funcionarán correctamente, ya que los mensajes salientes del Protocolo de datagramas de usuario (UDP) junto con respuestas oportunas a esos mensajes: el firewall mantiene abierto el puerto durante 90 segundos después de cada mensaje saliente en previsión de una respuesta.

Firewall antes de Windows XP SP2

El Firewall de conexión a Internet (ICF) en Windows XP y Windows Server 2003 es un filtro de paquetes con estado y controla tanto el protocolo de Internet, la versión 4 (IPv4) como el protocolo de Internet, versión 6 (IPv6). Sin embargo, no está activado de forma predeterminada y no admite pilas de red de terceros, de las cuales hay un número significativo en el mundo, como proveedores de Internet de gran tamaño, incluidas las compañías telefónicas nacionales.

Para aquellos que no están en Windows XP SP2, se recomienda encarecidamente activar el ICF. El Firewall de conexión a Internet (ICF) proporciona asignación de puertos para invalidar el filtro de paquetes. Básicamente, se especifica el puerto que se va a abrir y se mantiene abierto hasta que se cierra. Si el usuario se reinicia antes de cerrarlo, permanecerá abierto hasta que se cierre específicamente. El control del firewall y la administración de las asignaciones de puertos se realiza a través de INetSharingManager (IPv4) e INetFwV6Mgr (IPv6).

El Firewall de Windows para Windows XP SP2 es una solución más completa que admite pilas de red de terceros y controla los puertos de forma más inteligente: los puertos se mantienen abiertos solo siempre y cuando la aplicación que los necesite siga activo.

Firewall de Windows XP SP2 es mejor

Windows XP SP2 coloca las opciones de seguridad y la configuración delante. El objetivo es proteger de forma predeterminada y permitir al usuario tomar decisiones informadas sobre qué aplicaciones pueden ejecutarse en su equipo.

El nuevo Firewall de Windows está disponible en Windows XP SP2 y Windows Server 2003 Service Pack 1 (SP1). Al igual que el ICF, es un firewall de software que admite IPv4 e IPv6, pero a diferencia de ICF, el Firewall de Windows:

  • Tiene protección en tiempo de arranque del sistema, lo que elimina una pequeña ventana de vulnerabilidad durante el arranque.
  • Admite pilas de red de terceros.
  • Tiene un modo "activado sin excepciones" que bloquea todos los paquetes entrantes no solicitados. Esto es genial cuando se usa una red pública, como en un aeropuerto o una cafetería.

En el modo "activado sin excepciones", se cierran todos los agujeros estáticos. Se permiten llamadas API para abrir un agujero estático, pero se aplazan; es decir, no se aplican hasta que el firewall vuelve al funcionamiento normal. También se omitirán todas las solicitudes de escucha por parte de las aplicaciones. Las conexiones salientes se seguirán realizando correctamente.

Para las nuevas aplicaciones, agregue la aplicación a la "Lista de excepciones" durante la instalación. Puede agregar la aplicación mediante la interfaz INetFwAuthorizedApplications , proporcionando la ruta de acceso completa. Trataremos los detalles del ejemplo.

Como nota lateral, es posible que se pregunte si es un riesgo de seguridad que las aplicaciones pueden agregar y quitar aplicaciones de la lista de excepciones en cualquier intervención del usuario, o quizás piense que el mayor riesgo es que las aplicaciones puedan deshabilitar el firewall por completo. Para realizar estas logros, la aplicación debe tener privilegios de administrador. Si tienes código malintencionado ejecutándose en modo de administrador en tu sistema, el juego ya ha terminado y el hacker ya ha ganado. La capacidad del hacker para deshabilitar el firewall merecería poco más de una nota al pie.

Las aplicaciones heredadas, incluidas las aplicaciones instaladas antes de actualizar el usuario a Windows XP SP2, se controlan con el menú emergente Lista de excepciones (vea la figura 1). Este cuadro de diálogo muestra cuándo una aplicación intenta abrir un puerto para el tráfico entrante, ya sea al llamar a bind() con un puerto distinto de cero para UDP o accept() para el protocolo TCP/IP. Debe ejecutarse como administrador para "Desbloquear" aplicaciones, mientras que "Preguntarme más tarde" no permite esta vez, pero vuelve a preguntar la próxima vez.

Se trata de un cuadro de diálogo modal del sistema sin bloqueo. Cuando se ejecuta una aplicación de Microsoft Direct3D en pantalla completa, el cuadro de diálogo aparece debajo; y el usuario puede controlarlo cuando la aplicación sale del modo de pantalla completa o las pestañas alt al escritorio. Sin embargo, no siempre es obvio para el usuario que este cuadro de diálogo ha aparecido cuando un juego ejecuta pantalla completa, por lo que es importante evitar que este cuadro de diálogo aparezca mediante la interfaz INetFwAuthorizedApplications , como se describe a continuación.

Figura 1. Cuadro de diálogo emergente Lista de excepciones

Cuadro de diálogo emergente de lista de excepciones

Observará que el elemento emergente conoce el nombre y el publicador de la aplicación. No hay magia aquí: se extrae de la información de la versión del ejecutable. Esta información es una importante herramienta de administración del sistema; incluso se usa para el trabajo de compatibilidad de aplicaciones en curso. Algunas aplicaciones no mantienen actualizada esta información de versión.

Los usuarios también pueden agregar sus aplicaciones a través de la interfaz de usuario (UI) (consulte la figura 2)

Ilustración 2. Configuración del firewall

configuración del firewall

Figura 3. Agregar un programa a la lista de excepciones de firewall

agregar un programa a la lista de excepciones de firewall

El mejor escenario es automatizar las adiciones y eliminaciones de la lista de excepciones. El mejor momento para realizar estas adiciones y eliminaciones es durante el proceso de instalación y desinstalación. Agregar o quitar de la lista de excepciones de firewall requiere privilegios de administrador, por lo que asegúrese de tener esto en cuenta.

Trabajar con el Firewall de Windows

De nuevo, la mayoría de los juegos solo deben agregarse a la lista de excepciones de firewall si pueden funcionar como servidor o si implementan un protocolo de comunicación punto a punto. El FirewallInstallHelper.dll es un archivo DLL de ejemplo al que se puede llamar desde un instalador. El origen se proporciona si desea integrar el origen directamente en su propia aplicación. El ejemplo se puede encontrar aquí:

Archivo
Origen: (raíz del SDK)\Samples\C++\Misc\FirewallInstallHelper
Ejecutable: (raíz del SDK)\Samples\C++\Misc\Bin\<arch>\FirewallInstallHelper.dll

 

Las funciones exportadas por este archivo DLL son las siguientes:

AddApplicationToExceptionListW

Esta función agrega una aplicación a la lista de excepciones. Toma una ruta de acceso completa al ejecutable y un nombre descriptivo que aparecerá en la lista de excepciones del firewall. Esta función requiere privilegios de administrador.

AddApplicationToExceptionListA

Versión ANSI de AddApplicationToExceptionListW

RemoveApplicationFromExceptionListW

Esta función quita la aplicación de la lista de excepciones. Toma una ruta de acceso completa al archivo ejecutable. Esta función requiere privilegios de administrador

RemoveApplicationFromExceptionListA

Versión ANSI de RemoveApplicationFromExceptionListW

CanLaunchMultiplayerGameW

Esta función informa si la aplicación se ha deshabilitado o quitado de la lista de excepciones. Debe llamarse cada vez que se ejecute el juego. La función toma una ruta de acceso completa al archivo ejecutable. Esta función no requiere privilegios de administrador.

CanLaunchMultiplayerGameA

Versión ANSI de CanLaunchMultiplayerGameW

SetMSIFirewallProperties

Llame a esto solo si usa acciones personalizadas en Windows Installer. Consulte a continuación para más información.

AddToExceptionListUsingMSI

Llame a esto solo si usa acciones personalizadas en Windows Installer. Consulte a continuación para más información.

RemoveFromExceptionListUsingMSI

Llame a esto solo si usa acciones personalizadas en Windows Installer. Consulte a continuación para más información.

En las secciones siguientes se describen métodos específicos para llamar a las funciones DLL exportadas desde este FirewallInstallHelper desde un paquete InstallShield, Wise o Windows Installer. Todos los métodos representan los mismos resultados y el desarrollador debe determinar qué método implementar.

Integración mediante InstallShield InstallScript

Un método alternativo de uso de las API de Firewall es agregar las llamadas de función a un InstallShield InstallScript. Los pasos necesarios para integrar son bastante sencillos:

  1. Abra un proyecto installScript en el editor de InstallShield.

  2. Agregue el FirewallInstallHelper.dll al proyecto como archivo de soporte técnico.

    1. En la pestaña Asistente para proyectos, abra la pestaña Archivos de aplicación.
    2. Haga clic en el botón Agregar archivos para agregar archivos a la carpeta de destino de la aplicación.
    3. Vaya al FirewallInstallHelper.dll que ha creado o use el proporcionado en el SDK de DirectX y agréguelo al proyecto.
  3. Agregue InstallScript al proyecto.

    1. Abra la vista Instalación Designer y haga clic en El comportamiento y la lógica | InstallScript
    2. Haga clic en el archivo InstallScript (normalmente setup.rul) para abrirlo en el editor.
    3. Pegue el código siguiente en el archivo 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. Cambie los comentarios TODO con el nombre de la aplicación que se mostrará en la lista de excepciones del firewall y la ruta de acceso al ejecutable del juego en relación con el directorio de instalación.

Integración en Wise para Windows Installer

Para integrar con Wise para Windows Installer, estos pasos deben realizarse:

  1. Abra el proyecto Wise para Windows Installer.

  2. Seleccione la pestaña "Experto en instalación" en la parte inferior.

  3. Haga clic en Archivos y agregue el FirewallInstallHelper.dll del DXSDK al directorio de instalación del juego.

  4. Seleccione la pestaña "Script MSI" en la parte inferior.

  5. Seleccione la pestaña "Ejecutar inmediato" cerca de la parte inferior.

  6. Después de CostFinalize, agregue una acción "Establecer propiedad" que establezca FULLPATH en "[INSTALLDIR]ruta de acceso relativa al ejecutable desde el directorio de instalación". Por ejemplo, "[INSTALLDIR]game.exe" sin las comillas

  7. Seleccione la pestaña "Ejecutar diferido" cerca de la parte inferior.

  8. Después de PublishProduct, agregue una instrucción "If" con la condición "NOT Installed" (distingue mayúsculas de minúsculas).

  9. En el bloque If, agregue una acción "Call Custom DLL from Destination".

    1. Establezca el campo Archivo DLL en "[INSTALLDIR]FirewallInstallHelper.dll".
    2. Establezca el campo Nombre de función en "AddApplicationToExceptionListA".
    3. Agregue un parámetro con el tipo "puntero de cadena", el origen del valor "Property" y el nombre de propiedad "FULLPATH".
    4. Agregue un segundo parámetro con el tipo "string pointer", value source "Constant" y establezca el valor constante en el nombre descriptivo de la aplicación que desee mostrar en la lista de excepciones del firewall.
    5. Cierre el bloque If agregando una "Instrucción end".
  10. Justo encima de la acción RemoveFiles cerca de la parte superior, agregue otro bloque If, con la condición de ser "REMOVE~="ALL"" (distingue mayúsculas de minúsculas y sin las comillas externas).

  11. Dentro del segundo bloque If, agregue una acción "Call Custom DLL from Destination".

    1. Establezca el campo Archivo DLL en "[INSTALLDIR]FirewallInstallHelper.dll".
    2. Establezca el campo Nombre de función en "RemoveApplicationFromExceptionListA".
    3. Agregue un parámetro con el tipo "puntero de cadena", el origen del valor "Property" y el nombre de propiedad "FULLPATH".
    4. Cierre el segundo bloque If agregando una "Instrucción end".

Integración en Windows Installer

Para realizar la integración con Windows Installer en el alto nivel, estos pasos deben realizarse. Se explicarán con detalle a continuación:

  • Agregue 2 propiedades "FriendlyNameForFirewall" y "RelativePathToExeForFirewall", como se describe a continuación.
  • Después de la acción CostFinalize, llame a "SetMSIFirewallProperties" en una acción personalizada inmediata para establecer las propiedades MSI adecuadas para las demás acciones personalizadas.
  • Durante la instalación después de la acción InstallFiles, llame a una acción personalizada diferida que use la función "AddToExceptionListUsingMSI" de FirewallInstallHelper.
  • Durante la desinstalación después de la acción InstallFiles, llame a una acción personalizada diferida que use la función "RemoveFromExceptionListUsingMSI" de FirewallInstallHelper.
  • Durante la reversión, llame a una acción personalizada diferida que también llama a la función "RemoveFromExceptionListUsingMSI" de FirewallInstallHelper.

A continuación se muestran los pasos necesarios para hacerlo mediante un editor MSI, como Orca, que se encuentra en el SDK de plataforma. Tenga en cuenta que algunos editores tienen asistentes que simplifican algunos de estos pasos:

  1. Abra el paquete MSI en Orca.

  2. Agregue lo siguiente a la tabla Binary:

    Nombre data
    FIREWALL Apunte al FirewallInstallHelper.dll. Este archivo se incrustará en el paquete MSI, por lo que tendrá que realizar este paso cada vez que vuelva a compilar FirewallInstallHelper.dll.

     

  3. Agregue lo siguiente a la tabla CustomAction:

    Acción Tipo Source Destino
    FirewallSetMSIProperties msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 FIREWALL SetMSIFirewallProperties
    FirewallAgregar 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

     

  4. Agregue lo siguiente a la tabla InstallExecuteSequence:

    Acción Condición Secuencia Notas
    FirewallSetMSIProperties 1010 Esto se coloca poco después de CostFinalize.
    FirewallAgregar NO instalada 4021 Esta acción personalizada solo se realizará durante una instalación nueva. El número de secuencia coloca la acción después de InstallFiles y después de las reversiones.
    FirewallRollBackAdd NO instalada 4020 Esta acción personalizada solo se producirá cuando se cancele una instalación nueva. El número de secuencia coloca la acción después de InstallFiles y antes de la acción Agregar personalizada.
    FirewallRemove Instalado 3461 Esta acción personalizada solo se realizará durante la desinstalación. El número de secuencia coloca la acción directamente antes de RemoveFiles y después de las reversiones.
    FirewallRollBackRemove NO instalada 3460 Esta acción personalizada solo se producirá cuando se cancele una desinstalación. El número de secuencia coloca la acción directamente antes de RemoveFiles y antes de la acción Quitar personalizada.

     

  5. Agregue lo siguiente a la tabla Property:

    Propiedad Value
    FriendlyNameForFirewall Debe ser el nombre que mostrará la lista de excepciones. Por ejemplo, "Juego de ejemplo"
    RelativePathToExeForFirewall Debe ser el ejecutable instalado del juego. Por ejemplo, "ExampleGame.exe"

     

Para obtener más información sobre Windows Installer, consulta Windows Installer.

Recomendaciones

El firewall está aquí para quedarse. Estas recomendaciones proporcionarán a los clientes una buena experiencia de firewall con el juego de Windows:

  • No indique a los usuarios que deshabiliten el firewall para jugar al juego. Esto hace que toda la máquina sea vulnerable incluso cuando no juegan a su juego.
  • Haga que la configuración del firewall sea perfecta para los usuarios. Agregue la aplicación a la lista de excepciones durante la instalación y quite la aplicación de la lista de excepciones durante la instalación.
  • Envíe comentarios al usuario si el estado del firewall bloquea el modo multijugador. Por ejemplo, deshabilite las características de red si no funcionarán porque la aplicación no está permitida o porque el sistema está en el modo "sin excepciones".