共用方式為


適用于遊戲開發人員的 Windows 防火牆

本文說明 Windows 防火牆 - 其存在的原因、其完成方式,以及其執行方式。 最重要的是,它會描述如何設定您的遊戲以搭配防火牆運作良好。

內容:

什麼是防火牆?

防火牆提供網路型入侵的屏障。 它會封鎖未經請求的連入流量,並藉由拒絕 INTERNET Control Message Protocol (ICMP) 要求,讓系統在網際網路上最不可見。 這表示 ping 和 tracert 將無法運作。 防火牆也會查看並拒絕不正確封包。

此屏障可防止機會攻擊。 透過尋找許多具有相同弱點的系統來散佈攻擊。 防火牆可以藉由針對目前未使用的功能提出「不幹擾」符號來阻止許多攻擊;會忽略攻擊,而且不會對家進行攻擊。 Windows 防火牆的基本優點是,未使用的功能和應用程式無法成為攻擊的途徑。

使用者會設定系統,以識別需要哪些應用程式和功能,且應該開放至網路。 當應用程式安裝或嘗試自行開啟網路時,就會發生這種情況。

如何判斷我的遊戲是否受到影響?

隨著 Windows XP SP2 的抵達,Windows 防火牆已廣泛部署。 所有多人遊戲 Windows 遊戲都會受到某種程度的影響。 雖然用戶端通常處於良好的形狀、伺服器、主機和對等互連,但所有用戶端都需要設定為繼續運作的防火牆。 具體來說,傳入未經請求的流量會遭到捨棄。 防火牆會根據封包內容和最近的網路活動來攔截網路流量篩選封包。 防火牆會使用內容和活動來決定轉送或卸載封包。 正確設定防火牆之後,遊戲就能夠像之前一樣接受輸入未經請求的流量。

誰有輸入未經請求的流量?

  • 用戶端/伺服器:所有參與者都連線到中央伺服器。 中央伺服器是內送未要求流量的伺服器。 連線到伺服器的用戶端會要求傳回流量,這是預期的,如果遵循用戶端的規則,允許通過防火牆。 中央伺服器必須設定為接受未經請求的流量,以允許用戶端流量通過防火牆。
  • 大量多人遊戲 (MMP) :所有參與者都會連線到資料中心。 這相當於複雜的用戶端/伺服器關聯性,因為資料中心具有輸入未經請求的流量。 參與者是用戶端,通常不需要接受未經請求的流量。
  • 點對點,其中所有參與者都直接連線到彼此:所有參與者都必須準備好接受來自加入群組之任何新玩家的未經要求流量。 事實上,每個參與者都必須以主機的形式運作,因此它們必須全部設定為主機。

用戶端通常處於良好的形狀。 其傳出傳輸控制通訊協定/網際網路通訊協定 (TCP/IP) 連線會正常運作,因為傳出的使用者資料包通訊協定 (UDP) 訊息,以及這些訊息的及時回應 - 防火牆會在每個傳出訊息預期回復後保持開啟 90 秒。

Windows XP SP2 之前的防火牆

Windows XP 和 Windows Server 2003 中的網際網路連線防火牆 (ICF) 是具狀態封包篩選,並處理網際網路通訊協定第 4 版 (IPv4) 和網際網路通訊協定版本 6 (IPv6) 。 不過,預設不會開啟,而且不支援全球有大量協力廠商網路堆疊,例如大型網際網路提供者,包括國家電話公司。

對於不在 Windows XP SP2 上的人員,強烈建議您開啟 ICF。 網際網路連線防火牆 (ICF) 提供埠對應來覆寫封包篩選器。 基本上,您會指定要開啟的埠,而且會保持開啟狀態,直到關閉為止。 如果使用者在關閉之前重新開機,則會保持開啟狀態,直到特別關閉為止。 防火牆與埠對應管理的控制是透過 INetSharingManager (IPv4) 和 INetFwV6Mgr (IPv6) 來完成。

適用于 Windows XP SP2 的 Windows 防火牆是一個更完整的解決方案,可支援協力廠商網路堆疊,並更聰明地處理埠:只要需要端口的應用程式仍在使用中,埠才會保持開啟。

Windows XP SP2 防火牆更好

Windows XP SP2 會將安全性選項和設定放在最前面。 目標是預設保護,並允許使用者針對允許在其電腦上執行的應用程式做出明智的選擇。

新的 Windows 防火牆適用于 Windows XP SP2 和 Windows Server 2003 Service Pack 1 (SP1) 。 如同 ICF,它是支援 IPv4 和 IPv6 的軟體防火牆,但與 ICF 不同:Windows 防火牆:

  • 具有系統的開機時間保護,在開機期間排除一小範圍的弱點。
  • 支援協力廠商網路堆疊。
  • 具有「開啟無例外狀況」模式,封鎖所有未經請求的傳入封包。 當您使用公用網路時,例如在機場或咖啡機中,這很適合。

在「無例外狀況的開啟」模式中,所有靜態漏洞都會關閉。 允許開啟靜態孔的 API 呼叫,但延遲;也就是說,在防火牆切換回正常作業之前,不會套用它們。 應用程式的所有接聽要求也會被忽略。 輸出連線仍然會成功。

針對新的應用程式,請在安裝期間將您的應用程式新增至「例外狀況清單」。 您可以使用 INetFwAuthorizedApplications 介面來新增應用程式,並提供完整路徑。 我們將討論範例中的詳細資料。

請注意,您可能想知道應用程式是否可以從例外狀況清單中新增和移除應用程式的安全性風險,或者您可能認為應用程式可以完全停用防火牆的風險。 若要執行這些爭用,應用程式必須具有系統管理員許可權。 如果您的系統上有以系統管理員模式執行的惡意程式碼,遊戲已經結束,且駭客已贏得。 駭客停用防火牆的能力比註腳還多。

繼承應用程式,包括使用者升級至 Windows XP SP2 之前安裝的應用程式,會處理例外狀況清單快顯 (請參閱圖 1) 。 此對話方塊會顯示應用程式嘗試開啟連入流量的埠時 - 呼叫 bind () 與 UDP 的非零埠,或接受 () 作為 TCP/IP 通訊協定。 您必須以系統管理員身分執行,才能「解除封鎖」應用程式,而「稍後詢問我」則不允許這次,但下次再詢問一次。

這是非封鎖的系統強制回應對話方塊。 執行全螢幕 Microsoft Direct3D 應用程式時,對話方塊會位於下方;當應用程式結束全螢幕模式或替換索引標籤回到桌面時,使用者就可以處理它。 不過,當使用者執行全螢幕遊戲時,此對話方塊不一定明顯,因此請務必避免使用 INetFwAuthorizedApplications 介面顯示此對話方塊,如下所示。

圖 1. 例外狀況清單快顯對話方塊

例外狀況清單快顯視窗對話方塊

您會注意到快顯知道應用程式的名稱和發行者。 這裡沒有魔術 - 它會從可執行檔的版本資訊提取。 這項資訊是重要的系統管理工具;它甚至用於進行中的應用程式相容性工作。 有些應用程式會忽略將此版本資訊保持在最新狀態。

使用者也可以透過使用者介面新增應用程式, (UI) (請參閱圖 2)

圖 2. 設定防火牆

設定防火牆

圖 3. 將程式新增至防火牆例外狀況清單

將程式新增至防火牆例外狀況清單

最佳案例是自動化從例外狀況清單中新增和移除。 執行這些新增和移除的最佳時機是在安裝和卸載程式期間。 新增或移除防火牆例外狀況清單需要系統管理員許可權,因此請務必將此納入考慮。

使用 Windows 防火牆

同樣地,如果大部分遊戲可以做為伺服器或實作點對點通訊協定,則只需要將遊戲新增至防火牆例外清單。 FirewallInstallHelper.dll是從安裝程式呼叫的範例 DLL。 如果您想要將來源直接整合到您自己的應用程式中,則會提供來源。 您可以在這裡找到此範例:

檔案
來源: (SDK 根) \Samples\C++\Misc\FirewallInstallHelper
可執行: (SDK 根) \Samples\C++\Misc\Bin\ < arch >\FirewallInstallHelper.dll

 

此 DLL 匯出的函式如下:

AddApplicationToExceptionListW

此函式會將應用程式新增至例外狀況清單。 它會取得可執行檔的完整路徑,以及會出現在防火牆例外狀況清單中的易記名稱。 此函式需要系統管理員許可權。

AddApplicationToExceptionListA

AddApplicationToExceptionListW的 ANSI 版本

RemoveApplicationFromExceptionListW

此函式會從例外狀況清單中移除應用程式。 它會取得可執行檔的完整路徑。 此函式需要系統管理員許可權

RemoveApplicationFromExceptionListA

RemoveApplicationFromExceptionListW的 ANSI 版本

CanLaunchMultiplayerGameW

此函式會報告應用程式是否已從例外狀況清單中停用或移除。 每次執行遊戲時,都應該呼叫它。 函式會接受可執行檔的完整路徑。 此函式不需要系統管理員許可權。

CanLaunchMultiplayerGameA

CANLaunchMultiplayerGameW的 ANSI 版本

SetMSIFirewallProperties

只有在您在 Windows Installer 中使用自訂動作時,才呼叫此動作。 詳細資訊請見下文。

AddToExceptionListUsingMSI

只有在您在 Windows Installer 中使用自訂動作時,才呼叫此動作。 詳細資訊請見下文。

RemoveFromExceptionListUsingMSI

只有在您在 Windows Installer 中使用自訂動作時,才呼叫此動作。 詳細資訊請見下文。

下列各節說明從 InstallShield、Wise 或 Windows Installer 套件內從此 FirewallInstallHelper 呼叫匯出 DLL 函式的特定方法。 所有方法都會轉譯相同的結果,而且由開發人員決定要實作的方法。

使用 InstallShield InstallScript 整合

使用防火牆 API 的替代方法是將函式呼叫新增至 InstallShield InstallScript。 整合所需的步驟相當簡單:

  1. 在 InstallShield 編輯器中開啟 InstallScript 專案。

  2. 將FirewallInstallHelper.dll新增至專案作為支援檔案。

    1. 在 [專案助理] 索引標籤下,開啟 [應用程式檔] 索引標籤。
    2. 按一下 [新增檔案] 按鈕,將檔案新增至應用程式目的檔案夾。
    3. 流覽至您已建置或使用 DirectX SDK 中提供的FirewallInstallHelper.dll,並將其新增至專案。
  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 批註。

整合至適用于 Windows Installer 的Wise

若要與適用于 Windows Installer 的 Wise 整合,必須執行下列步驟:

  1. 開啟您的 Wise for Windows Installer 專案。

  2. 選取底部的 [安裝專家] 索引標籤。

  3. 按一下 [檔案],然後將FirewallInstallHelper.dll從 DXSDK 新增至遊戲的安裝目錄。

  4. 選取底部的 [MSI 腳本] 索引標籤。

  5. 選取底部附近的 [立即執行] 索引標籤。

  6. 在 CostFinalize 之後,新增 「Set Property」 巨集指令,將 FULLPATH 設定為 「[INSTALLDIR]relative path to executable from install directory」。 例如,不含引號的 「[INSTALLDIR]game.exe」

  7. 選取底部附近的 [執行延遲] 索引標籤。

  8. 在 PublishProduct 之後,新增條件為 「NOT Installed」 的 「If 語句」, (區分大小寫) 。

  9. 在 If 區塊內,新增[從目的地呼叫自訂 DLL] 動作。

    1. 將 [DLL 檔案] 欄位設定為 「[INSTALLDIR]FirewallInstallHelper.dll」。
    2. 將 [函式名稱] 欄位設定為 「AddApplicationToExceptionListA」。
    3. 新增類型為 「string pointer」、value source 「Property」 和屬性名稱 「FULLPATH」 的參數。
    4. 新增類型為 「string pointer」、value source 「Constant」 的第二個參數,並將常數值設定為您想要顯示在防火牆例外狀況清單中的易記應用程式名稱。
    5. 新增 「End Statement」 以關閉 If 區塊。
  10. 緊接在頂端附近的 RemoveFiles 巨集指令上方,新增另一個 If 區塊,其條件為 「REMOVE~=」ALL「」 (區分大小寫,且不含外部引號) 。

  11. 在第二個 If 區塊內,新增[從目的地呼叫自訂 DLL] 動作。

    1. 將 [DLL 檔案] 欄位設定為 「[INSTALLDIR]FirewallInstallHelper.dll」。
    2. 將 [函式名稱] 欄位設定為 「RemoveApplicationFromExceptionListA」。
    3. 新增類型為 「string pointer」、value source 「Property」 和屬性名稱 「FULLPATH」 的參數。
    4. 藉由新增 「End Statement」 來關閉第二個 If 區塊。

整合至 Windows Installer

若要在高層級與 Windows Installer 整合,必須完成這些步驟。 以下將詳細說明它們:

  • 新增 2 個屬性 「FriendlyNameForFirewall」 和 「RelativePathToExeForFirewall」,如下所述。
  • 在 CostFinalize 動作之後,在立即自訂動作中呼叫 「SetMSIFirewallProperties」,以設定其他自訂動作的適當 MSI 屬性。
  • 在 InstallFiles 動作之後安裝期間,呼叫使用 FirewallInstallHelper 的 「AddToExceptionListUsingMSI」 函式的延後自訂動作。
  • 在 InstallFiles 動作之後卸載期間,呼叫使用 FirewallInstallHelper 的 「RemoveFromExceptionListUsingMSI」 函式的延後自訂動作。
  • 在復原期間,呼叫延後自訂動作,該動作也會呼叫 FirewallInstallHelper 的 「RemoveFromExceptionListUsingMSI」 函式。

以下是使用在平臺 SDK 中找到的 MSI 編輯器執行這項作業所需的步驟,例如 Orca。 請注意,有些編輯器具有可簡化其中一些步驟的精靈:

  1. 在 Orca 中開啟 MSI 套件。

  2. 將下列內容新增至二進位資料表:

    名稱 資料
    防火牆 將它指向FirewallInstallHelper.dll。 此檔案會內嵌在 MSI 套件中,因此每次重新編譯FirewallInstallHelper.dll時都必須執行此步驟。

     

  3. 將下列內容新增至 CustomAction 資料表:

    動作 類型 來源 目標
    FirewallSetMSIProperties msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 防火牆 SetMSIFirewallProperties
    FirewallAdd 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 之後。
    FirewallAdd 未安裝 4021 這個自訂動作只會在全新安裝期間發生。 序號會將動作放在 InstallFiles 和復原之後。
    FirewallRollBackAdd 未安裝 4020 只有在取消全新安裝時,才會發生此自訂動作。 序號會將動作放在 InstallFiles 和 Add 自訂動作之前。
    FirewallRemove 已安裝 3461 此自訂動作只會在卸載期間發生。 序號會將動作直接放在 RemoveFiles 和復原之後。
    FirewallRollBackRemove 未安裝 3460 只有在卸載取消時,才會發生此自訂動作。 序號會將動作直接放在 RemoveFiles 和 Remove 自訂動作之前。

     

  5. 將下列內容新增至 Property 資料表:

    屬性
    FriendlyNameForFirewall 必須是例外狀況清單將顯示的名稱。 例如,「範例遊戲」
    RelativePathToExeForFirewall 必須是遊戲的已安裝可執行檔。 例如,「ExampleGame.exe」

     

如需 Windows Installer 的詳細資訊,請參閱 Windows Installer

建議

防火牆在這裡保留。 這些建議可讓您的客戶使用 Windows 遊戲提供良好的防火牆體驗:

  • 請勿告訴使用者停用防火牆來播放您的遊戲。 這可讓整個電腦易受攻擊,即使電腦未玩您的遊戲也一樣。
  • 讓您的使用者順暢地設定防火牆。 在安裝期間將您的應用程式新增至例外狀況清單,並在安裝期間從例外狀況清單中移除您的應用程式。
  • 如果多人遊戲遭到防火牆狀態封鎖,請提供意見反應給使用者。 例如,如果因為不允許應用程式或系統處於「沒有例外狀況」模式,所以無法運作,請停用網路功能。