次の方法で共有


ゲーム開発者向けの Windows ファイアウォール

この記事では、Windows ファイアウォールについて説明します。Windows ファイアウォールが存在する理由、その機能、およびその方法について説明します。 最も重要なのは、ファイアウォールで適切に動作するようにゲームを構成する方法について説明することです。

コンテンツ:

ファイアウォールとは

ファイアウォールは、ネットワークベースの侵入に対する障壁を提供します。 これは、未承諾の受信トラフィックをブロックし、インターネット制御メッセージ プロトコル (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 ファイアウォール for Windows XP SP2 は、サード パーティのネットワーク スタックをサポートし、よりインテリジェントにポートを処理する、より包括的なソリューションです。ポートは、必要なアプリケーションがまだアクティブである限り開いたままです。

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 を参照)。 このダイアログには、アプリケーションが受信トラフィックのポートを開こうとしたときに表示されます。UDP の場合は 0 以外のポートで bind() を呼び出すとき、TCP/IP プロトコルの場合は accept() を呼び出すときです。 アプリケーションを "ブロック解除" するには管理者として実行している必要があります。一方、"後で確認" は今回は許可されませんが、次回はもう一度要求します。

これは、非ブロッキングのシステム モーダル ダイアログ ボックスです。 全画面表示の Microsoft Direct3D アプリケーションを実行すると、ダイアログが下に表示されます。アプリケーションが全画面表示モードを終了するか、alt-tabs キーを押してデスクトップに戻ったときに、ユーザーはそれを処理できます。 ただし、ゲームが全画面表示を実行しているときにこのダイアログが表示されたとは限りません。そのため、以下で説明するように 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

ANSI バージョンの AddApplicationToExceptionListW

RemoveApplicationFromExceptionListW

この関数は、例外リストからアプリケーションを削除します。 実行可能ファイルへの完全なパスを受け取ります。 この関数には管理者特権が必要です

RemoveApplicationFromExceptionListA

RemoveApplicationFromExceptionListW の ANSI バージョン

CanLaunchMultiplayerGameW

この関数は、アプリケーションが無効になっているか、例外リストから削除されたかどうかを報告します。 これは、ゲームが実行されるたびに呼び出される必要があります。 関数は実行可能ファイルへの完全なパスを受け取ります。 この関数には管理者特権は必要ありません。

CanLaunchMultiplayerGameA

ANSI バージョンの CanLaunchMultiplayerGameW

SetMSIFirewallProperties

これは、Windows インストーラーでカスタム アクションを使用している場合にのみ呼び出します。 詳細については、以下を参照してください。

AddToExceptionListUsingMSI

これは、Windows インストーラーでカスタム アクションを使用している場合にのみ呼び出します。 詳細については、以下を参照してください。

RemoveFromExceptionListUsingMSI

これは、Windows インストーラーでカスタム アクションを使用している場合にのみ呼び出します。 詳細については、以下を参照してください。

次のセクションでは、InstallShield、Wise、または Windows インストーラー パッケージ内からこの FirewallInstallHelper からエクスポートされた DLL 関数を呼び出す特定のメソッドについて説明します。 すべてのメソッドが同じ結果をレンダリングし、実装するメソッドを決定するのは開発者の判断です。

InstallShield InstallScript を使用した統合

ファイアウォール API を使用する別の方法は、InstallShield InstallScript に関数呼び出しを追加することです。 統合に必要な手順は非常に簡単です。

  1. InstallShield エディターで InstallScript プロジェクトを開きます。

  2. FirewallInstallHelper.dllをサポート ファイルとしてプロジェクトに追加します。

    1. [プロジェクト アシスタント] タブで、[アプリケーション ファイル] タブを開きます。
    2. [ファイルの追加] ボタンをクリックして、アプリケーション ターゲット フォルダーにファイルを追加します。
    3. ビルドしたFirewallInstallHelper.dllを参照するか、DirectX SDK で提供されたものを使用して、プロジェクトに追加します。
  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 for Windows インストーラーへの統合

Wise for Windows インストーラーと統合するには、次の手順を実行する必要があります。

  1. Wise for Windows インストーラー プロジェクトを開きます。

  2. 下部にある [インストール エキスパート] タブを選択します。

  3. [ファイル] をクリックし、DXSDK からゲームのインストール ディレクトリにFirewallInstallHelper.dllを追加します。

  4. 下部にある [MSI スクリプト] タブを選択します。

  5. 下部の [Execute Immediate]\(イミディエイトの実行\) タブを選択します。

  6. CostFinalize の後に、FULLPATH を "[INSTALLDIR]インストール ディレクトリから実行可能ファイルへの相対パス" に設定する "Set Property" アクションを追加します。 たとえば、引用符のない "[INSTALLDIR]game.exe"

  7. 下部の [遅延実行] タブを選択します。

  8. PublishProduct の後に、"NOT Installed" (大文字と小文字が区別されます) という条件の "If ステートメント" を追加します。

  9. If ブロック内に、"呼び出し先からカスタム DLL を呼び出す" アクションを追加します。

    1. [DLL ファイル] フィールドを "[INSTALLDIR]FirewallInstallHelper.dll" に設定します。
    2. [関数名] フィールドを "AddApplicationToExceptionListA" に設定します。
    3. 型 "string pointer"、値ソース "Property"、およびプロパティ名 "FULLPATH" を持つパラメーターを追加します。
    4. 型 "string pointer"、値ソース "Constant" の 2 番目のパラメーターを追加し、定数値をファイアウォール例外リストに表示するフレンドリ アプリケーション名に設定します。
    5. "End ステートメント" を追加して If ブロックを閉じます。
  10. 上部付近の RemoveFiles アクションのすぐ上に、条件が "REMOVE~="ALL" (大文字と小文字を区別し、外側の引用符を含まない) の別の If ブロックを追加します。

  11. 2 番目の If ブロック内に、"Call Custom DLL from Destination" アクションを追加します。

    1. [DLL ファイル] フィールドを "[INSTALLDIR]FirewallInstallHelper.dll" に設定します。
    2. [関数名] フィールドを "RemoveApplicationFromExceptionListA" に設定します。
    3. 型 "string pointer"、値ソース "Property"、およびプロパティ名 "FULLPATH" を持つパラメーターを追加します。
    4. "End ステートメント" を追加して、2 番目の If ブロックを閉じます。

Windows インストーラーへの統合

Windows インストーラーと高レベルで統合するには、次の手順を実行する必要があります。 以下で詳しく説明します。

  • 次に説明するように、2 つのプロパティ "FriendlyNameForFirewall" と "RelativePathToExeForFirewall" を追加します。
  • CostFinalize アクションの後、即時カスタム アクションで "SetMSIFirewallProperties" を呼び出して、他のカスタム アクションに適切な MSI プロパティを設定します。
  • InstallFiles アクションの後のインストール時に、FirewallInstallHelper の "AddToExceptionListUsingMSI" 関数を使用する遅延カスタム アクションを呼び出します。
  • InstallFiles アクションの後のアンインストール時に、FirewallInstallHelper の "RemoveFromExceptionListUsingMSI" 関数を使用する遅延カスタム アクションを呼び出します。
  • ロールバック中に、FirewallInstallHelper の "RemoveFromExceptionListUsingMSI" 関数も呼び出す遅延カスタム アクションを呼び出します。

プラットフォーム SDK で見つかった Orca などの MSI エディターを使用してこれを行うために必要な手順を次に示します。 一部のエディターには、次の手順の一部を簡略化するウィザードがあることに注意してください。

  1. Orca で MSI パッケージを開きます。

  2. バイナリ テーブルに次を追加します。

    名前 Data
    ファイアウォール FirewallInstallHelper.dllをポイントします。 このファイルは MSI パッケージに埋め込まれるので、FirewallInstallHelper.dll再コンパイルするたびにこの手順を実行する必要があります。

     

  3. CustomAction テーブルに次を追加します。

    アクション Type source 移行先
    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 NOT Installed 4021 このカスタム アクションは、新しいインストール中にのみ行われます。 シーケンス番号は、InstallFiles の後とロールバック後にアクションを配置します。
    FirewallRollBackAdd NOT Installed 4020 このカスタム アクションは、新しいインストールが取り消された場合にのみ発生します。 シーケンス番号は、InstallFiles の後、およびカスタムアクションの追加の前にアクションを配置します。
    FirewallRemove インストール済み 3461 このカスタム アクションは、アンインストール中にのみ行われます。 シーケンス番号は、RemoveFiles の直前とロールバック後にアクションを配置します。
    FirewallRollBackRemove NOT Installed 3460 このカスタム アクションは、アンインストールが取り消された場合にのみ発生します。 シーケンス番号は、RemoveFiles の直前と Remove カスタム アクションの前にアクションを配置します。

     

  5. Property テーブルに次のコードを追加します。

    プロパティ
    FriendlyNameForFirewall 例外リストに表示される名前である必要があります。 たとえば、"Example Game"
    RelativePathToExeForFirewall ゲームのインストール済み実行可能ファイルである必要があります。 たとえば、"ExampleGame.exe"

     

Windows インストーラーの詳細については、「 Windows インストーラー」を参照してください。

Recommendations

ファイアウォールはここに残っています。 これらの推奨事項により、お客様は Windows ゲームで優れたファイアウォール エクスペリエンスが得られます。

  • ファイアウォールを無効にしてゲームをプレイするようにユーザーに指示しないでください。 これにより、ゲームをプレイしていない場合でも、マシン全体が脆弱になります。
  • ユーザーのファイアウォール構成をシームレスにします。 インストール時にアプリケーションを例外リストに追加し、インストール時に例外リストからアプリケーションを削除します。
  • マルチプレイヤーがファイアウォールの状態によってブロックされている場合は、ユーザーにフィードバックを送信します。 たとえば、アプリケーションが許可されていないか、システムが "例外なし" モードであるために機能しない場合は、ネットワーク機能を無効にします。