VPC ファイアウォール ルールを使用する

このページでは、Virtual Private Cloud(VPC)ファイアウォール ルールの処理のためのコマンドについて説明し、それらの使用例を紹介します。VPC ファイアウォール ルールを使用すると、ポート番号、タグ、プロトコルに基づいて、VPC ネットワーク内の仮想マシン(VM)インスタンスとの間で送受信されるトラフィックを許可または拒否できます。

始める前に

暗黙のルールやデフォルト ネットワークのシステム生成ルールなど、VPC ファイアウォール ルールの詳細については、VPC ファイアウォール ルールをご覧ください。

ファイアウォール ルールを構成する前に、ファイアウォール ルールのコンポーネントを確認して、 Google Cloudで使用されるファイアウォールのコンポーネントについて理解してください。

VPC ファイアウォール ルールを作成する

VPC ファイアウォール ルールはネットワーク レベルで定義され、ルールが作成されたネットワークにのみ適用されます。ただし、それぞれの名前はプロジェクトごとに一意である必要があります。

ファイアウォール ルールには IPv4 範囲または IPv6 範囲のいずれかを含めることができます。両方を含めることはできません。

ファイアウォール ルールを作成する際に、ファイアウォール ルールロギングを有効にするかどうかを選択できます。ロギングを有効にすると、ストレージ フィールドを節約するためにメタデータ フィールドを省略できます。詳細については、VPC ファイアウォール ルールのロギングを使用するをご覧ください。

ターゲットまたはソースのサービス アカウントのフィールドに複数のサービス アカウントを指定する場合は、Google Cloud CLI、API、またはクライアント ライブラリを使用します。

デフォルトのネットワークでは、作成時に自動ファイアウォール ルールが提供されます。カスタムモードと自動モードのネットワークでは、 Google Cloud コンソールでネットワークを作成するときに、類似のファイアウォールを簡単に作成できます。gcloud CLI または API で、デフォルトのネットワークと類似のファイアウォール ルールを作成する場合は、一般的なユースケース向けのファイアウォール ルールを構成するをご覧ください。

コンソール

  1. Google Cloud コンソールで、[ファイアウォール ポリシー] ページに移動します。

    [ファイアウォール ポリシー] に移動

  2. [ファイアウォール ルールを作成] をクリックします。

  3. ファイアウォール ルールの [名前] を入力します。

    この名前は、プロジェクト内で一意にする必要があります。

  4. (省略可)ファイアウォール ルール ロギングを有効にできます。

    • [ログ] > [オン] をクリックします。
    • メタデータを省略するには、[ログの詳細を表示] をクリックして [メタデータを含める] チェックボックスをオフにします。
  5. ファイアウォール ルールの [ネットワーク] を指定します。

  6. ルールの [優先度] を指定します。

    数字が小さいほど、優先度が高くなります。

  7. [トラフィックの方向] には、上り(内向き)と下り(外向き)のいずれかを選択します。

  8. [一致したときのアクション] には、許可と拒否のいずれかを選択します。

  9. ルールの [ターゲット] を指定します。

    • ネットワーク内のすべてのインスタンスにルールを適用する場合は、[All instances in the network] を選択します。
    • ネットワーク(ターゲット)のタグを使用して一部のインスタンスにルールを適用する場合は、[指定されたターゲットタグ] を選択し、[ターゲットタグ] フィールドでルールを適用するタグを入力します。
    • 関連するサービス アカウントで一部のインスタンスにルールを適用する場合は、[指定されたサービス アカウント] を選択し、サービス アカウントが現在のプロジェクトにあるか、[サービス アカウントのスコープ] の別のプロジェクトにあるかを指定します。その後、[ターゲット サービス アカウント] フィールドでサービス アカウント名を選択または入力します。
  10. 上り(内向き)ルールの場合、送信元フィルタを指定します。

    • 送信元 IPv4 の範囲で受信トラフィックをフィルタするには、[IPv4 範囲] を選択し、CIDR ブロックを [送信元 IPv4 範囲] フィールドに入力します。任意の IPv4 送信元の場合は、0.0.0.0/0 を使用します。
    • 送信元 IPv6 の範囲で受信トラフィックをフィルタするには、[IPv6 範囲] を選択し、CIDR ブロックを [送信元 IPv6 範囲] フィールドに入力します。任意の IPv6 送信元の場合は、::/0 を使用します。
    • 受信トラフィックをネットワーク タグでフィルタするには、[ソースタグ] を選択し、ネットワーク タグを [ソースタグ] フィールドに入力します。ソースタグ数の上限については、ネットワークごとの上限をご覧ください。ソースタグによるフィルタリングを使用できるのは、サービス アカウントによってターゲットが指定されていない場合に限られます。
    • サービス アカウントを使用して受信トラフィックをフィルタするには、[サービス アカウント] を選択し、[サービス アカウントのスコープ] でサービス アカウントが現在のプロジェクトにあるか、別のプロジェクトにあるかを示します。その後、[ソースのサービス アカウント] フィールドでサービス アカウント名を選択するか入力します。ソースのサービス アカウントによるフィルタリングを使用できるのは、ネットワーク タグによってターゲットが指定されていない場合に限られます。
    • 必要に応じて、[2 番目のソースフィルタ] を指定します。2 番目のソースフィルタで、メインのソースフィルタと同じフィルタ条件を使用することはできません。ソース IP の範囲は、ソースタグまたはソースサービス アカウントと組み合わせて使用できます。有効なソースセットは、ソース範囲の IP アドレスと、ネットワーク タグまたはサービス アカウントによって識別されるインスタンスを組み合わせたものです。つまり、ソース IP 範囲、またはソースタグ(またはソースサービス アカウント)のいずれかがフィルタ条件と一致する場合、そのソースは有効なソースセットに含まれています。
    • [ソースタグ] と [ソースのサービス アカウント] は併用できません。

    サービス アカウントとネットワーク タグの使用方法について詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。

  11. 上り(内向き)ルールの場合は、送信先フィルタを指定します。

    • 受信トラフィックを送信先 IPv4 範囲でフィルタするには、[IPv4 範囲] を選択し、[送信先 IPv4 範囲] フィールドに CIDR ブロックを入力します。任意の IPv4 送信先の場合は、0.0.0.0/0 を使用します。
    • 受信トラフィックを送信先 IPv6 範囲でフィルタするには、[IPv6 範囲] を選択し、[送信先 IPv6 範囲] フィールドに CIDR ブロックを入力します。任意の IPv6 送信先の場合は、::/0 を使用します。

    詳細については、上り(内向き)ルールの送信先をご覧ください。

  12. 下り(外向き)ルールの場合は、送信先フィルタを指定します。

    • 送信トラフィックを送信先 IPv4 範囲でフィルタするには、[IPv4 範囲] を選択し、[送信先 IPv4 範囲] フィールドに CIDR ブロックを入力します。任意の IPv4 送信先の場合は、0.0.0.0/0 を使用します。
    • 送信トラフィックを送信先 IPv6 範囲でフィルタするには、[IPv6 範囲] を選択し、[送信先 IPv6 範囲] フィールドに CIDR ブロックを入力します。任意の IPv6 送信先の場合は、::/0 を使用します。

    詳細については、下り(外向き)ルールの送信先をご覧ください。

  13. 下り(外向き)ルールの場合、送信元フィルタを指定します。

    • 送信元 IPv4 の範囲で送信トラフィックをフィルタするには、[IPv4 範囲] を選択し、CIDR ブロックを [送信元 IPv4 範囲] フィールドに入力します。任意の IPv4 送信元の場合は、0.0.0.0/0 を使用します。
    • 送信元 IPv6 の範囲で送信トラフィックをフィルタするには、[IPv6 範囲] を選択し、CIDR ブロックを [送信元 IPv6 範囲] フィールドに入力します。任意の IPv6 送信先の場合は、::/0 を使用します。

    詳細については、下り(外向き)ルールの送信元をご覧ください。

  14. ルールを適用するプロトコルとポートを定義します。

    • すべてのプロトコルと宛先ポートにルールを適用する場合は、アクションに応じて [すべて許可] または [すべて拒否] を選択します。
    • 特定のプロトコルと宛先ポートを定義するには、[指定したプロトコルとポート] を選択します。
      • TCP のプロトコルと宛先ポートを指定する場合は [TCP] を選択します。「all」と入力するか、20-22, 80, 8080 などの宛先ポートのカンマ区切りのリストを入力します。
      • UDP のプロトコルと宛先ポートを指定するには [UDP] を選択します。「all」と入力するか、67-69, 123 などの宛先ポートのカンマ区切りのリストを入力します。
      • icmpsctp などのプロトコル、またはプロトコル番号を含めるには [その他] を選択します。たとえば、IPv4 ICMP には icmp またはプロトコル番号 1 を使用します。IPv6 ICMP にはプロトコル番号 58 を使用します。

    詳細については、プロトコルと宛先ポートをご覧ください。

  15. (省略可)ファイアウォール ルールを作成しても、その適用状態を無効に設定すれば、ルールは適用されません。[ルールを無効にする] をクリックし、[無効] を選択します。

  16. [作成] をクリックします。

gcloud

VPC ファイアウォール ルールを作成するには、gcloud compute firewall-rules create コマンドを使用します。

gcloud compute firewall-rules create RULE_NAME \
    [--network NETWORK; default="default"] \
    [--priority PRIORITY;default=1000] \
    [--direction (ingress|egress|in|out); default="ingress"] \
    [--action (deny | allow )] \
    [--target-tags TAG[,TAG,...]] \
    [--target-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--source-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--source-tags TAG[,TAG, ...]] \
    [--source-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--destination-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--rules (PROTOCOL[:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
    [--disabled | --no-disabled] \
    [--enable-logging | --no-enable-logging] \
    [--logging-metadata LOGGING_METADATA]

パラメータは以下のように使用します。各パラメータの詳細については、SDK リファレンス ドキュメントをご覧ください。

  • --network: ルールのネットワーク。省略した場合、ルールは default ネットワークに作成されます。デフォルト ネットワークがない場合や、特定のネットワークにルールを作成する場合は、このフィールドを使用する必要があります。
  • --priority: ルールの優先度を示す数値です。数字が小さいほど、優先度が高くなります。
  • --direction: トラフィックの方向です。INGRESSEGRESS のいずれかを指定します。
  • --action: 一致したときのアクションです。allowdeny のいずれかを指定します。--rules フラグとともに使用する必要があります。
  • 次のいずれかの方法でターゲットを指定します。
    • ルールをネットワーク内のすべてのターゲットに適用する場合は、--target-tags--target-service-accounts を省略します。
    • ネットワーク タグを使用してターゲットを定義するには、--target-tags フラグを使用します。
    • 関連するサービス アカウントによってターゲットを定義するには、--target-service-accounts フラグを使用します。
  • 上り(内向き)ルールで送信先をさらに絞り込むには、--destination-ranges を使用して IPv4 または IPv6 アドレス範囲を CIDR 形式で指定します。--destination-ranges が省略されている場合、上り(内向き)の送信先は任意の IPv4 アドレス(0.0.0.0/0)になります。詳細については、上り(内向き)ルールの送信先上り(内向き)ルールのターゲットと IP アドレスをご覧ください。

  • 上り(内向き)ルールの場合は、送信元を指定します。

    • --source-ranges: 送信元 IPv4 または IPv6 アドレスの範囲を CIDR 形式で指定する場合は、このフラグを使用します。
    • --source-rangessource-tags--source-service-accounts が省略されている場合、上り(内向き)のソースは任意の IPv4 アドレス(0.0.0.0/0)になります。
    • --source-tags: ネットワーク タグを使用してソース インスタンスを指定する場合は、このフラグを使用します。ソースタグによるフィルタリングを使用できるのは、サービス アカウントによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。
    • --source-ranges--source-tags併用できます。両方が指定されている場合、有効なソースセットは、ソース範囲の IP アドレスと、ネットワーク タグによって特定されるインスタンスを組み合わせたものです(タグ付けされたインスタンスがソース範囲の IP を持たない場合であっても対象に含まれます)。
    • --source-service-accounts: 使用するサービス アカウントでインスタンスを指定する場合は、このフラグを使用します。ソースのサービス アカウントによるフィルタリングを使用できるのは、ネットワーク タグによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。--source-ranges--source-service-accounts併用できます。両方が指定されている場合、有効なソースセットは、ソース範囲の IP アドレスと、ソースのサービス アカウントによって特定されるインスタンスを組み合わせたものです(ソースのサービス アカウントによって特定されるインスタンスがソース範囲の IP を持たない場合であっても対象に含まれます)。
  • 下り(外向き)ルールで送信元をさらに絞り込むには、--source-ranges を使用して IPv4 または IPv6 アドレス範囲を CIDR 形式で指定します。--source-ranges が省略されている場合、下り(外向き)の送信元は任意の IPv4 アドレス(0.0.0.0/0)になります。詳細については、下り(外向き)ルールの送信元下り(外向き)ルールのターゲットと IP アドレスをご覧ください。

  • 下り(外向き)ルールの場合は送信先を指定します。

    • --destination-ranges: 送信先 IPv4 または IPv6 アドレスの範囲を CIDR 形式で指定する場合は、このフラグを使用します。
    • --destination-ranges が省略されている場合、下り(外向き)の宛先は任意の IPv4 アドレス(0.0.0.0/0)になります。
  • --rules: ルールの適用対象となるプロトコルとポートのリスト。すべてのプロトコルと宛先ポートにルールを適用する場合は、all を使用します。--action フラグが必要です。

  • デフォルトでは、ファイアウォール ルールが作成されると自動的に適用されますが、この動作は変更できます。

    • --disabled--no-disabled の両方が省略されている場合は、ファイアウォール ルールが作成され、適用されます。
    • --disabled: ファイアウォール ルールを作成して適用しない場合は、このフラグを追加します。ファイアウォール ルールを更新して有効にするまで、ファイアウォール ルールは無効のままです。
    • --no-disabled: ファイアウォール ルールを確実に適用するには、このフラグを追加します。
  • --enable-logging | --no-enable-logging ファイアウォール ルールロギングは、ルールの作成時、更新時に適用できます。VPC ファイアウォール ルール ロギングを使用すると、ファイアウォール ルールの効果を監査、検証、分析できます。詳細については、VPC ファイアウォール ルールのロギングをご覧ください。

    • --logging-metadata: ロギングを有効にすると、デフォルトでは、ファイアウォール ルールのロギングにベース フィールドとメタデータ フィールドが含まれます。ストレージ費用を節約するために、メタデータ フィールドを省略できます。詳細については、VPC ファイアウォール ルール ロギングの使用をご覧ください。

Terraform

ファイアウォール ルールを作成するには、google_compute_firewall リソースを使用します。

resource "google_compute_firewall" "rules" {
  name        = "my-firewall-rule"
  network     = "default"
  description = "Creates firewall rule targeting tagged instances"

  allow {
    protocol = "tcp"
    ports    = ["80", "443"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["web"]
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

API

VPC ファイアウォール ルールを作成します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "name": "RULE_NAME",
  "network": "projects/PROJECT-ID/global/networks/NETWORK",
  ... other fields
}

次のように置き換えます。

  • PROJECT_ID: VPC ネットワークが配置されているプロジェクトの ID。
  • NETWORK: ファイアウォール ルールを作成する VPC ネットワークの名前。
  • RULE_NAME: ファイアウォール ルールの名前。

  • 上り(内向き)ファイアウォール ルールの場合は、上り(内向き)の送信元と送信先を指定します。

    • sourceRangessourceTags、または sourceServiceAccounts フィールドを使用して、上り(内向き)の送信元を指定します。

    • sourceRanges は、IPv4 と IPv6 のどちらの範囲でも指定できます。ただし、両方を組み合わせることはできません。範囲 0.0.0.0/0 を使用する場合は、フィールドを指定しないでください。

    • sourceTags フィールドと sourceServiceAccounts フィールドは併用できません。ただし、sourceRangessourceTags または sourceServiceAccounts と併用できます。その場合、ファイアウォール ルールを適用するには、接続がどちらか一方と一致する必要があります。

    • ターゲット フィールドで sourceTags フィールドを使用している場合は、targetServiceAccounts フィールドを使用できません。targetTags フィールドを使用するか、ターゲット フィールドは使用しないでください。同様に、sourceServiceAccounts フィールドを使用している場合、targetTags フィールドは使用できません。ターゲット フィールドを指定しない場合、ルールはネットワーク内のすべてのターゲットに適用されます。

    • destinationRanges フィールドを使用して、上り(内向き)の送信先を指定します。destinationRanges は、IPv4 と IPv6 のどちらの範囲でも指定できます。ただし、両方を組み合わせることはできません。
      送信先を指定しない場合、 Google Cloud は 0.0.0.0/0 を使用します。詳細については、上り(内向き)ルールの送信先上り(内向き)ルールのターゲットと IP アドレスをご覧ください。

  • 下り(外向き)ファイアウォール ルールの場合、下り(外向き)の送信元と送信先を指定します。

    • sourceRanges フィールドを使用して、下り(外向き)の送信元を指定します。sourceRange は、IPv4 と IPv6 のどちらの範囲でも指定できます。ただし、両方を組み合わせることはできません。
      送信元を指定しない場合、 Google Cloud は 0.0.0.0/0 を使用します。詳細については、下り(外向き)ルールの送信元下り(外向き)ルールのターゲットと IP アドレスをご覧ください。

    • destinationRanges フィールドを使用して、送信先を指定します。destinationRanges は、IPv4 と IPv6 のどちらの範囲でも指定できます。ただし、両方を組み合わせることはできません。
      送信先を指定しない場合、 Google Cloudは 0.0.0.0/0 を使用します。targetTags または targetServiceAccounts フィールドを使用して、ルールを適用するターゲットを指定します。ターゲット フィールドを指定しない場合、ルールはネットワーク内のすべてのターゲットに適用されます。

各フィールドの詳細と説明については、firewalls.insert メソッドをご覧ください。

C#


using Google.Cloud.Compute.V1;
using System.Threading.Tasks;

public class CreateFirewallRuleAsyncSample
{
    public async Task CreateFirewallRuleAsync(
        // TODO(developer): Set your own default values for these parameters or pass different values when calling this method.
        string projectId = "your-project-id",
        string firewallRuleName = "my-test-firewall-rule",
        // Name of the network the rule will be applied to. Some available name formats:
        // projects/{project_id}/global/networks/{network}
        // global/networks/{network}
        string networkName = "global/networks/default")
    {
        Firewall firewallRule = new Firewall
        {
            Name = firewallRuleName,
            Network = networkName,
            Direction = ComputeEnumConstants.Firewall.Direction.Ingress,
            Allowed =
            {
                new Allowed
                {
                    Ports = { "80", "443" },
                    IPProtocol = "tcp"
                }
            },
            TargetTags = { "web" },
            Description = "Allows TCP traffic on port 80 and 443 from anywhere."
        };

        // Note that the default value of priority for the firewall API is 1000.
        // If you check the value of firewallRule.Priority at this point it
        // will be equal to 0, however it is not treated as "set" by the library, and thus
        // the default will be applied to the new rule. If you want to create a rule that
        // has priority == 0, you'll need to explicitly set it: firewallRule.Priority = 0.
        // You can use the firewallRule.HasPriority property to check if the priority has been set.
        // You can use the firewallRule.ClearPriority() method to unset the priority.

        // Initialize client that will be used to send requests. This client only needs to be created
        // once, and can be reused for multiple requests.
        FirewallsClient client = await FirewallsClient.CreateAsync();

        // Create the firewall rule in the specified project.
        var firewallRuleCreation = await client.InsertAsync(projectId, firewallRule);

        // Wait for the operation to complete using client-side polling.
        await firewallRuleCreation.PollUntilCompletedAsync();
    }
}

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// createFirewallRule creates a firewall rule allowing for incoming HTTP and HTTPS access from the entire Internet.
func createFirewallRule(w io.Writer, projectID, firewallRuleName, networkName string) error {
	// projectID := "your_project_id"
	// firewallRuleName := "europe-central2-b"
	// networkName := "global/networks/default"

	ctx := context.Background()
	firewallsClient, err := compute.NewFirewallsRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer firewallsClient.Close()

	firewallRule := &computepb.Firewall{
		Allowed: []*computepb.Allowed{
			{
				IPProtocol: proto.String("tcp"),
				Ports:      []string{"80", "443"},
			},
		},
		Direction: proto.String(computepb.Firewall_INGRESS.String()),
		Name:      &firewallRuleName,
		TargetTags: []string{
			"web",
		},
		Network:     &networkName,
		Description: proto.String("Allowing TCP traffic on port 80 and 443 from Internet."),
	}

	// Note that the default value of priority for the firewall API is 1000.
	// If you check the value of `firewallRule.GetPriority()` at this point it
	// will be equal to 0, however it is not treated as "set" by the library and thus
	// the default will be applied to the new rule. If you want to create a rule that
	// has priority == 0, you need to explicitly set it so:

	// firewallRule.Priority = proto.Int32(0)

	req := &computepb.InsertFirewallRequest{
		Project:          projectID,
		FirewallResource: firewallRule,
	}

	op, err := firewallsClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create firewall rule: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Firewall rule created\n")

	return nil
}

Java


import com.google.cloud.compute.v1.Allowed;
import com.google.cloud.compute.v1.Firewall;
import com.google.cloud.compute.v1.Firewall.Direction;
import com.google.cloud.compute.v1.FirewallsClient;
import com.google.cloud.compute.v1.InsertFirewallRequest;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateFirewallRule {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample
    /* project: project ID or project number of the Cloud project you want to use.
       firewallRuleName: name of the rule that is created.
       network: name of the network the rule will be applied to. Available name formats:
        * https://www.googleapis.com/compute/v1/projects/{project_id}/global/networks/{network}
        * projects/{project_id}/global/networks/{network}
        * global/networks/{network} */
    String project = "your-project-id";
    String firewallRuleName = "firewall-rule-name-" + UUID.randomUUID();
    String network = "global/networks/default";

    // The rule will be created with default priority of 1000.
    createFirewall(project, firewallRuleName, network);
  }

  // Creates a simple firewall rule allowing for incoming HTTP and 
  // HTTPS access from the entire Internet.
  public static void createFirewall(String project, String firewallRuleName, String network)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    /* Initialize client that will be used to send requests. This client only needs to be created
       once, and can be reused for multiple requests. After completing all of your requests, call
       the `firewallsClient.close()` method on the client to safely
       clean up any remaining background resources. */
    try (FirewallsClient firewallsClient = FirewallsClient.create()) {

      // The below firewall rule is created in the default network.
      Firewall firewallRule = Firewall.newBuilder()
          .setName(firewallRuleName)
          .setDirection(Direction.INGRESS.toString())
          .addAllowed(
              Allowed.newBuilder().addPorts("80").addPorts("443").setIPProtocol("tcp").build())
          .addSourceRanges("0.0.0.0/0")
          .setNetwork(network)
          .addTargetTags("web")
          .setDescription("Allowing TCP traffic on port 80 and 443 from Internet.")
          .build();

      /* Note that the default value of priority for the firewall API is 1000.
         If you check the value of `firewallRule.getPriority()` at this point it
         will be equal to 0, however it is not treated as "set" by the library and thus
         the default will be applied to the new rule. If you want to create a rule that
         has priority == 0, you'll need to explicitly set it so: setPriority(0) */

      InsertFirewallRequest insertFirewallRequest = InsertFirewallRequest.newBuilder()
          .setFirewallResource(firewallRule)
          .setProject(project).build();

      firewallsClient.insertAsync(insertFirewallRequest).get(3, TimeUnit.MINUTES);

      System.out.println("Firewall rule created successfully -> " + firewallRuleName);
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const firewallRuleName = 'YOUR_FIREWALL_RULE_NAME'
// const networkName = 'global/networks/default'

const compute = require('@google-cloud/compute');
const computeProtos = compute.protos.google.cloud.compute.v1;

async function createFirewallRule() {
  const firewallsClient = new compute.FirewallsClient();
  const operationsClient = new compute.GlobalOperationsClient();

  const firewallRule = new computeProtos.Firewall();
  firewallRule.name = firewallRuleName;
  firewallRule.direction = 'INGRESS';
  firewallRule.allowed = [
    {
      IPProtocol: 'tcp',
      ports: ['80', '443'],
    },
  ];
  firewallRule.targetTags = ['web'];
  firewallRule.network = networkName;
  firewallRule.description =
    'Allowing TCP traffic on port 80 and 443 from Internet.';

  // Note that the default value of priority for the firewall API is 1000.
  // If you check the value of `firewallRule.priority` at this point it
  // will be equal to null, however it is not treated as "set" by the library and thus
  // the default will be applied to the new rule. If you want to create a rule that
  // has priority == 0, you need to explicitly set it so:

  // firewallRule.priority = 0

  const [response] = await firewallsClient.insert({
    project: projectId,
    firewallResource: firewallRule,
  });
  let operation = response.latestResponse;

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
    });
  }

  console.log('Firewall rule created');
}

createFirewallRule();

PHP