VPC 방화벽 규칙 사용

이 페이지에서는 가상 프라이빗 클라우드(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 범위를 선택한 후 소스 IPv4 범위 필드에 CIDR 블록을 입력합니다. 모든 IPv4 소스에 0.0.0.0/0을 사용합니다.
    • 소스 IPv6 범위를 기준으로 들어오는 트래픽을 필터링하려면 IPv6 범위를 선택한 후 소스 IPv6 범위 필드에 CIDR 블록을 입력합니다. 모든 IPv6 소스에 ::/0을 사용합니다.
    • 네트워크 태그를 기준으로 들어오는 트래픽을 필터링하려면 소스 태그를 선택한 후 소스 태그 필드에 네트워크 태그를 입력합니다. 소스 태그 개수에 대한 제한은 네트워크별 한도를 참조하세요. 소스 태그별 필터링은 대상이 서비스 계정으로 지정되지 않은 경우에만 사용할 수 있습니다.
    • 서비스 계정을 기준으로 들어오는 트래픽을 필터링하려면 서비스 계정을 선택하고 서비스 계정 범위에서 서비스 계정이 현재 프로젝트 또는 다른 프로젝트에 있는지 여부를 표시한 후 소스 서비스 계정 필드에서 서비스 계정 이름을 선택하거나 입력합니다. 소스 서비스 계정별 필터링은 대상이 네트워크 태그로 지정되지 않은 경우에만 사용 가능합니다.
    • 원하는 경우 보조 소스 필터를 지정합니다. 보조 소스 필터는 기본 소스 필터와 동일한 필터 기준을 사용할 수 없습니다. 소스 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 범위를 선택한 후 소스 IPv4 범위 필드에 CIDR 블록을 입력합니다. 모든 IPv4 소스에 0.0.0.0/0을 사용합니다.
    • 소스 IPv6 범위를 기준으로 나가는 트래픽을 필터링하려면 IPv6 범위를 선택하고 소스 IPv6 범위 필드에 CIDR 블록을 입력합니다. 모든 IPv6 대상에 ::/0을 사용합니다.

    자세한 내용은 이그레스 규칙의 소스를 참고하세요.

  14. 규칙을 적용할 프로토콜과 포트를 정의합니다.

    • 모든 프로토콜과 대상 포트에 규칙을 적용하려면 작업에 따라 모두 허용 또는 모두 거부를 선택합니다.
    • 특정 프로토콜과 대상 포트를 정의하려면 지정된 프로토콜 및 포트를 선택합니다.
      • TCP 프로토콜과 대상 포트를 포함하려면 TCP를 선택합니다. all 또는 20-22, 80, 8080 등의 쉼표로 구분된 대상 포트 목록을 입력합니다.
      • UDP 프로토콜과 대상 포트를 포함하려면 UDP를 선택합니다. all 또는 67-69, 123 등의 쉼표로 구분된 대상 포트 목록을 입력합니다.
      • icmp, sctp 또는 프로토콜 번호와 같은 프로토콜을 포함하려면 기타를 선택합니다. 예를 들어 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 트래픽의 방향(INGRESS 또는 EGRESS)입니다.
  • --action 일치 시 작업(allow 또는 deny)입니다. --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-ranges, source-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: 방화벽 규칙의 이름입니다.

  • 인그레스 방화벽 규칙의 경우 인그레스 소스 및 대상을 지정합니다.

    • sourceRanges, sourceTags, sourceServiceAccounts 필드를 사용하여 인그레스 소스를 지정합니다.

    • sourceRanges는 IPv4 또는 IPv6 범위일 수 있지만 이 둘의 조합일 수는 없습니다. 0.0.0.0/0 범위를 사용하려면 필드를 지정하지 마세요.

    • sourceTags 필드와 sourceServiceAccounts 필드를 함께 사용할 수 없습니다. 하지만 sourceTags 또는 sourceServiceAccounts와 함께 sourceRanges를 사용할 수 있습니다. 그러면 방화벽 규칙을 적용하기 위해 연결이 일치해야 합니다.

    • 대상 필드의 경우 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
}

자바


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 =