Condividi tramite


Windows Firewall per sviluppatori di giochi

Questo articolo descrive Windows Firewall: perché esiste, cosa esegue e come funziona. Soprattutto, descrive come configurare il gioco in modo che funzioni correttamente con il firewall.

Contenuto:

Che cos'è un firewall?

Il firewall fornisce una barriera contro le intrusioni basate sulla rete. Blocca il traffico in ingresso non richiesto e rende il sistema prevalentemente invisibile su Internet rifiutando le richieste ICMP (Internet Control Message Protocol). Ciò significa che ping e tracert non funzioneranno. Il firewall cerca e rifiuta anche pacchetti non validi.

Questa barriera impedisce attacchi opportunistici. Gli attacchi distribuiti individuando molti sistemi con la stessa vulnerabilità. Il firewall può contrastare molti attacchi mettendo un segno "non disturbare" per tali funzionalità non attualmente in uso; l'attacco viene ignorato e non colpisce casa. Il vantaggio essenziale di Windows Firewall è che le funzionalità e le applicazioni che non sono in uso non possono essere vie di attacco.

L'utente configura il sistema per identificare le applicazioni e le funzionalità necessarie e deve essere aperta alla rete. Ciò si verifica quando un'applicazione viene installata o quando tenta di aprirsi alla rete.

Come posso stabilire se il mio gioco è interessato?

Con l'arrivo di Windows XP SP2, Windows Firewall è stato ampiamente distribuito. Tutti i giochi multiplayer di Windows sono interessati in qualche modo. Anche se i client sono in genere in buone condizioni, server, host e peer in peer-to-peer richiedono che il firewall sia configurato per continuare a funzionare. In particolare, il traffico non richiesto in ingresso viene eliminato. Il firewall intercetta i pacchetti di filtro del traffico di rete in base al contenuto del pacchetto e alle attività di rete recenti. Il firewall usa il contenuto e l'attività per decidere di inoltrare o rilasciare un pacchetto. Dopo aver configurato correttamente il firewall, un gioco sarà in grado di accettare il traffico non richiesto in ingresso come in precedenza.

Chi ha in ingresso traffico non richiesto?

  • Client/Server: tutti i partecipanti si connettono a un server centrale. Il server centrale è quello con traffico non richiesto in ingresso. I client che si connettono al server richiedono il traffico restituito, previsto e possono passare attraverso il firewall se vengono seguite le regole per i client. Il server centrale deve essere configurato per accettare il traffico non richiesto per consentire al traffico client di passare attraverso il firewall.
  • Massively Multiplayer (MMP): tutti i partecipanti sono connessi a un data center. Si tratta di una relazione client/server complessa, perché il data center ha il traffico in ingresso non richiesto. I partecipanti sono client e in generale non devono accettare traffico non richiesto.
  • Peer-to-Peer, dove tutti i partecipanti sono connessi l'uno all'altro direttamente: tutti i partecipanti devono essere pronti ad accettare traffico non richiesto da qualsiasi nuovo giocatore che si unirà al gruppo. In un certo senso, ognuno dei partecipanti deve funzionare come host, quindi devono essere configurati come se fossero host.

I client sono in genere in buona forma. Le connessioni TCP/IP (Transmission Control Protocol/IP) in uscita funzioneranno correttamente, perché i messaggi UDP (User Datagram Protocol) in uscita insieme alle risposte tempestive a tali messaggi, il firewall mantiene aperta la porta per 90 secondi dopo ogni messaggio in uscita in previsione di una risposta.

Firewall prima di Windows XP SP2

Internet Connection Firewall (ICF) in Windows XP e Windows Server 2003 è un filtro di pacchetti con stato e gestisce sia Internet Protocol, versione 4 (IPv4) che Internet Protocol, versione 6 (IPv6). Tuttavia, non è attivo per impostazione predefinita e non supporta stack di rete di terze parti, di cui c'è un numero significativo nel mondo, ad esempio grandi provider internet, incluse le compagnie telefoniche nazionali.

Per coloro che non sono in Windows XP SP2, l'attivazione di ICF è altamente consigliata. Internet Connection Firewall (ICF) fornisce il mapping delle porte per eseguire l'override del filtro di pacchetti. Essenzialmente, si specifica la porta da aprire e rimane aperta fino a quando non viene chiusa. Se l'utente viene riavviato prima della chiusura, rimarrà aperto fino a quando non viene chiuso in modo specifico. Il controllo del firewall e della gestione dei mapping delle porte viene eseguito tramite INetSharingManager (IPv4) e INetFwV6Mgr (IPv6).

Windows Firewall per Windows XP SP2 è una soluzione più completa che supporta gli stack di rete di terze parti e gestisce le porte in modo più intelligente: le porte vengono mantenute aperte solo finché l'applicazione necessaria è ancora attiva.

Windows XP SP2 Firewall è migliore

Windows XP SP2 mette in primo piano le opzioni di sicurezza e le impostazioni. L'obiettivo è proteggere per impostazione predefinita e consentire all'utente di effettuare scelte informate sulle applicazioni che possono essere eseguite nel computer.

Il nuovo Windows Firewall è disponibile sia in Windows XP SP2 che in Windows Server 2003 Service Pack 1 (SP1). Analogamente a ICF, si tratta di un firewall software che supporta sia IPv4 che IPv6, ma a differenza di ICF windows Firewall:

  • Ha la protezione in fase di avvio del sistema, eliminando una piccola finestra di vulnerabilità durante l'avvio.
  • Supporta stack di rete di terze parti.
  • Dispone di una modalità "on senza eccezioni" che blocca tutti i pacchetti in ingresso non richiesti. Questo è ideale quando si usa una rete pubblica, ad esempio in un aeroporto o un bar.

Nella modalità "attivato senza eccezioni" tutti i fori statici vengono chiusi. Le chiamate API per aprire un foro statico sono consentite ma posticipate; ovvero, non vengono applicate fino a quando il firewall non torna al normale funzionamento. Verranno ignorate anche tutte le richieste di ascolto da parte delle applicazioni. Le connessioni in uscita avranno comunque esito positivo.

Per le nuove applicazioni, aggiungere l'applicazione all'elenco eccezioni durante l'installazione. È possibile aggiungere l'applicazione usando l'interfacciaINetFwAuthorizedApplications, specificando il percorso completo. Verranno illustrati i dettagli nell'esempio.

Come nota laterale, è possibile chiedersi se si tratta di un rischio di sicurezza che le applicazioni possono aggiungere e rimuovere applicazioni dall'elenco delle eccezioni qualsiasi intervento dell'utente o forse si ritiene che il rischio maggiore sia che le applicazioni possano disabilitare completamente il firewall. Per eseguire queste operazioni, l'applicazione deve disporre dei privilegi di amministratore. Se hai codice dannoso in esecuzione in modalità amministratore sul tuo sistema, il gioco è già finito e l'hacker ha già vinto. La capacità dell'hacker di disabilitare il firewall meriterebbe poco più di una nota a piè di pagina.

Le applicazioni legacy, incluse le applicazioni installate prima dell'aggiornamento dell'utente a Windows XP SP2, vengono gestite con il popup Elenco eccezioni (vedere la figura 1). Questa finestra di dialogo viene visualizzata quando un'applicazione tenta di aprire una porta per il traffico in ingresso, quando si chiama bind() con una porta diversa da zero per UDP o accept() per il protocollo TCP/IP. È necessario essere in esecuzione come amministratore per "Sbloccare" le applicazioni, mentre "Chiedimi più tardi" non consente questa volta, ma chiede di nuovo la prossima volta.

Si tratta di una finestra di dialogo modale di sistema non bloccabile. Quando si esegue un'applicazione Microsoft Direct3D a schermo intero, la finestra di dialogo viene visualizzata sotto; e l'utente può quindi gestirlo quando l'applicazione esce dalla modalità schermo intero o le schede alt al desktop. Tuttavia, non è sempre ovvio per l'utente che questo dialogo è apparso quando un gioco è in esecuzione a schermo intero, quindi è importante evitare di causare la visualizzazione di questa finestra di dialogo usando INetFwAuthorizedApplications interfaccia come illustrato di seguito.

Figura 1. Finestra di dialogo popup Elenco eccezioni

finestra di dialogo popup elenco eccezioni

Si noterà che il popup conosce il nome e l'autore dell'applicazione. Non c'è magia qui: viene estratta dalle informazioni sulla versione dell'eseguibile. Queste informazioni sono un importante strumento di amministrazione del sistema; viene usato anche per il lavoro di compatibilità delle applicazioni in corso. Alcune applicazioni non mantengono queste informazioni sulla versione up-to-date.

Gli utenti possono anche aggiungere le applicazioni tramite l'interfaccia utente (ui) (vedere la figura 2)

Figura 2. Configurazione del firewall

configurazione del firewall

Figura 3. Aggiunta di un programma all'elenco eccezioni del firewall

l'aggiunta di un programma all'elenco delle eccezioni del firewall

Lo scenario migliore consiste nell'effettuare aggiunte e rimozioni dall'elenco di eccezioni automatizzato. Il momento migliore per eseguire queste aggiunte e rimozioni è durante il processo di installazione e disinstallazione. L'aggiunta o la rimozione dall'elenco di eccezioni del firewall richiede privilegi di amministratore, quindi assicurarsi di tenere conto di questo.

Uso di Windows Firewall

Anche in questo caso, la maggior parte dei giochi deve essere aggiunta all'elenco di eccezioni del firewall solo se possono funzionare come server o se implementano un protocollo di comunicazione peer-to-peer. Il FirewallInstallHelper.dll è una DLL di esempio che può essere chiamata da un programma di installazione. L'origine viene fornita se si vuole integrare l'origine direttamente nella propria applicazione. L'esempio è disponibile qui:

File
origine : (RADICE SDK)\Samples\C++\Misc\FirewallInstallHelper
eseguibile: (SDK root)\Samples\C++\Misc\Bin\<arch>\FirewallInstallHelper.dll

 

Le funzioni esportate da questa DLL sono le seguenti:

AddApplicationToExceptionListW

Questa funzione aggiunge un'applicazione all'elenco di eccezioni. Accetta un percorso completo del file eseguibile e un nome descrittivo che verrà visualizzato nell'elenco delle eccezioni del firewall. Questa funzione richiede privilegi di amministratore.

AddApplicationToExceptionListA

Versione ANSI di AddApplicationToExceptionListW

RemoveApplicationFromExceptionListW

Questa funzione rimuove l'applicazione dall'elenco di eccezioni. Accetta un percorso completo per l'eseguibile. Questa funzione richiede privilegi di amministratore

RemoveApplicationFromExceptionListA

Versione ANSI di RemoveApplicationFromExceptionListW

CanLaunchMultiplayerGameW

Questa funzione segnala se l'applicazione è stata disabilitata o rimossa dall'elenco delle eccezioni. Deve essere chiamato ogni volta che viene eseguito il gioco. La funzione accetta un percorso completo per l'eseguibile. Questa funzione non richiede privilegi di amministratore.

CanLaunchMultiplayerGameA

Versione ANSI di CanLaunchMultiplayerGameW

SetMSIFirewallProperties

Chiama questa operazione solo se usi azioni personalizzate in Windows Installer. Per altri dettagli, vedere di seguito.

AddToExceptionListUsingMSI

Chiama questa operazione solo se usi azioni personalizzate in Windows Installer. Per altri dettagli, vedere di seguito.

RemoveFromExceptionListUsingMSI

Chiama questa operazione solo se usi azioni personalizzate in Windows Installer. Per altri dettagli, vedere di seguito.

Le sezioni seguenti descrivono metodi specifici per chiamare le funzioni DLL esportate da questo FirewallInstallHelper da un pacchetto InstallShield, Wise o Windows Installer. Tutti i metodi eseguono il rendering degli stessi risultati e spetta allo sviluppatore determinare quale metodo implementare.

Integrazione con InstallShield InstallScript

Un metodo alternativo dell'uso delle API firewall consiste nell'aggiungere le chiamate di funzione a un InstallShield InstallScript. I passaggi necessari per l'integrazione sono piuttosto semplici:

  1. Aprire un progetto InstallScript nell'editor InstallShield.

  2. Aggiungere il FirewallInstallHelper.dll al progetto come file di supporto.

    1. Nella scheda Assistente progetto aprire la scheda File applicazione.
    2. Fare clic sul pulsante Aggiungi file per aggiungere file alla cartella di destinazione dell'applicazione.
    3. Passare al FirewallInstallHelper.dll creato o usare quello fornito in DirectX SDK e aggiungerlo al progetto.
  3. Aggiungere InstallScript al progetto.

    1. Aprire la visualizzazione Progettazione installazione e fare clic su Comportamento e logica | InstallScript
    2. Fare clic sul file InstallScript (in genere setup.rul) per aprirlo nell'editor
    3. Incollare il codice seguente nel file 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. Modificare i commenti TODO con il nome dell'applicazione che verrà visualizzato nell'elenco eccezioni del firewall e il percorso dell'eseguibile del gioco relativo alla directory di installazione.

Integrazione in Wise per Windows Installer

Per eseguire l'integrazione con Wise per Windows Installer, è necessario eseguire questi passaggi:

  1. Aprire il progetto Wise per Windows Installer.

  2. Selezionare la scheda "Esperto installazione" nella parte inferiore.

  3. Fare clic su File e aggiungere il FirewallInstallHelper.dll da DXSDK alla directory di installazione del gioco.

  4. Selezionare la scheda "MSI script" nella parte inferiore.

  5. Selezionare la scheda "Esegui immediata" nella parte inferiore.

  6. Dopo CostFinalize, aggiungere un'azione "Imposta proprietà" che imposta FULLPATH su "[INSTALLDIR]percorso relativo all'eseguibile dalla directory di installazione". Ad esempio, "[INSTALLDIR]game.exe" senza virgolette

  7. Selezionare la scheda "Esegui posticipata" nella parte inferiore.

  8. Dopo PublishProduct, aggiungere un'istruzione "If" con la condizione "NOT Installed" (con distinzione tra maiuscole e minuscole).

  9. All'interno del blocco If aggiungere un'azione "Chiama DLL personalizzata dalla destinazione".

    1. Impostare il campo File DLL su "[INSTALLDIR]FirewallInstallHelper.dll".
    2. Impostare il campo Nome funzione su "AddApplicationToExceptionListA".
    3. Aggiungere un parametro con il tipo "puntatore stringa", l'origine valore "Property" e il nome della proprietà "FULLPATH".
    4. Aggiungere un secondo parametro con tipo "puntatore stringa", origine valore "Constant" e impostare il valore costante sul nome descrittivo dell'applicazione che si desidera visualizzare nell'elenco delle eccezioni del firewall.
    5. Chiudere il blocco If aggiungendo un'istruzione "End Statement".
  10. Appena sopra l'azione RemoveFiles nella parte superiore aggiungere un altro blocco If, con la condizione "REMOVE~="ALL"" (distinzione tra maiuscole e minuscole e senza virgolette esterne).

  11. Nel secondo blocco If aggiungere un'azione "Chiama DLL personalizzata dalla destinazione".

    1. Impostare il campo File DLL su "[INSTALLDIR]FirewallInstallHelper.dll".
    2. Impostare il campo Nome funzione su "RemoveApplicationFromExceptionListA".
    3. Aggiungere un parametro con il tipo "puntatore stringa", l'origine valore "Property" e il nome della proprietà "FULLPATH".
    4. Chiudere il secondo blocco If aggiungendo un'istruzione "End Statement".

Integrazione in Windows Installer

Per eseguire l'integrazione con Windows Installer a livello generale, è necessario eseguire questi passaggi. Verranno illustrati in dettaglio di seguito:

  • Aggiungere 2 proprietà "FriendlyNameForFirewall" e "RelativePathToExeForFirewall" come descritto di seguito.
  • Dopo l'azione CostFinalize, chiamare "SetMSIFirewallProperties" in un'azione personalizzata immediata per impostare le proprietà MSI appropriate per le altre azioni personalizzate.
  • Durante l'installazione dopo l'azione InstallFiles, chiamare un'azione personalizzata posticipata che usa la funzione "AddToExceptionListUsingMSI" di FirewallInstallHelper.
  • Durante la disinstallazione dopo l'azione InstallFiles, chiamare un'azione personalizzata posticipata che usa la funzione "RemoveFromExceptionListUsingMSI" di FirewallInstallHelper.
  • Durante il rollback, chiamare un'azione personalizzata posticipata che chiama anche la funzione "RemoveFromExceptionListUsingMSI" di FirewallInstallHelper.

Di seguito sono riportati i passaggi necessari per eseguire questa operazione usando un editor MSI, ad esempio Orca disponibile in Platform SDK. Si noti che alcuni editor dispongono di procedure guidate che semplificano alcuni di questi passaggi:

  1. Aprire il pacchetto MSI in Orca.

  2. Aggiungere quanto segue alla tabella Binary:

    Nome Dati
    FIREWALL Puntare al FirewallInstallHelper.dll. Questo file verrà incorporato nel pacchetto MSI, quindi sarà necessario eseguire questo passaggio ogni volta che si ricompila FirewallInstallHelper.dll.

     

  3. Aggiungere quanto segue alla tabella CustomAction:

    Azione Digitare Fonte Bersaglio
    FirewallSetMSIProperties msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 FIREWALL SetMSIFirewallProperties
    FirewallAggiungi msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 FIREWALL AddToExceptionListUsingMSI
    FirewallRemove msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 FIREWALL RemoveFromExceptionListUsingMSI
    FirewallRollBackAggiungi msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 FIREWALL RemoveFromExceptionListUsingMSI
    FirewallRollBackRemove msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 FIREWALL AddToExceptionListUsingMSI

     

  4. Aggiungere quanto segue alla tabella InstallExecuteSequence:

    Azione Condizione Sequenza Note
    FirewallSetMSIProperties 1010 Questo posto subito dopo CostFinalize.
    FirewallAggiungi NON installato 4021 Questa azione personalizzata verrà eseguita solo durante una nuova installazione. Il numero di sequenza inserisce l'azione dopo InstallFiles e dopo il rollback.
    FirewallRollBackAggiungi NON installato 4020 Questa azione personalizzata verrà eseguita solo quando viene annullata una nuova installazione. Il numero di sequenza inserisce l'azione dopo InstallFiles e prima dell'azione Aggiungi personalizzata.
    FirewallRemove Installato 3461 Questa azione personalizzata verrà eseguita solo durante la disinstallazione. Il numero di sequenza inserisce l'azione direttamente prima di RemoveFiles e dopo il rollback.
    FirewallRollBackRemove NON installato 3460 Questa azione personalizzata verrà eseguita solo quando una disinstallazione viene annullata. Il numero di sequenza inserisce l'azione direttamente prima di RemoveFiles e prima dell'azione Personalizzata Rimuovi.

     

  5. Aggiungere quanto segue alla tabella Property:

    Proprietà Valore
    FriendlyNameForFirewall Deve essere il nome visualizzato dall'elenco di eccezioni. Ad esempio, "Esempio di gioco"
    RelativePathToExeForFirewall Deve essere l'eseguibile installato del gioco. Ad esempio, "ExampleGame.exe"

     

Per altre informazioni su Windows Installer, vedere Windows Installer.

Consigli

Il firewall è qui per rimanere. Questi consigli offriranno ai clienti un'esperienza firewall ottimale con il gioco windows:

  • Non indicare agli utenti di disabilitare il firewall per giocare. In questo modo l'intera macchina è vulnerabile anche quando non giocano al gioco.
  • Rendere la configurazione del firewall senza problemi per gli utenti. Aggiungere l'applicazione all'elenco di eccezioni durante l'installazione e rimuovere l'applicazione dall'elenco di eccezioni durante l'installazione.
  • Inviare commenti e suggerimenti all'utente se il multiplayer è bloccato dallo stato del firewall. Ad esempio, disabilitare le funzionalità di rete se non funzioneranno perché l'applicazione non è consentita o perché il sistema è in modalità "nessuna eccezione".