Virtual Private Cloud (VPC) firewall rules generate log entries when they apply to traffic. While a packet flow can generate multiple log entries, a VPC firewall rule generates at most one log entry per connection from a virtual machine (VM) instance. The following examples show how VPC firewall rules logging works in different scenarios.
Egress deny example
This example shows logging for an egress-deny VPC firewall rule that blocks traffic between two VM instances in the same VPC network.
In this example, traffic flows between VM instances in the example-net
VPC network in the example-proj project.
The two VM instances are:
- VM1 in zone
us-west1-awith IP address10.10.0.99in thewest-subnet(us-west1region). - VM2 in zone
us-east1-bwith IP address10.20.0.99in theeast-subnet(us-east1region).
- VM1 in zone
Rule A: An egress deny firewall rule has a target of all instances in the network, a destination of
10.20.0.99(VM2), and applies to TCP port80. Logging is enabled for this rule.Rule B: An ingress allow firewall rule has a target of all instances in the network, a source of
10.10.0.99(VM1), and applies to TCP port80. Logging is also enabled for this rule.
To create the VPC firewall rules, use the following gcloud
commands:
Rule A: egress deny rule for TCP port
80, applicable to all instances, destination10.20.0.99:gcloud compute firewall-rules create rule-a \ --network example-net \ --action deny \ --direction EGRESS \ --rules tcp:80 \ --destination-ranges 10.20.0.99/32 \ --priority 10 \ --enable-loggingRule B: ingress allow rule for TCP port
80, applicable to all instances, source10.10.0.99:gcloud compute firewall-rules create rule-b \ --network example-net \ --action allow \ --direction INGRESS \ --rules tcp:80 \ --source-ranges 10.10.0.99/32 \ --priority 10 \ --enable-logging
In a scenario where VM1 attempts to connect to VM2 on TCP port 80,
the following happens:
- A log entry for rule A from the perspective of VM1 is generated while VM1
attempts to connect to
10.20.0.99(VM2). - Because rule A blocks the traffic, rule B isn't considered, so there is no log entry for rule B from the perspective of VM2.
VM1 reports the following VPC firewall rule log record:
| Field | Values |
|---|---|
connection |
src_ip=10.10.0.99 src_port=[EPHEMERAL_PORT] dest_ip=10.20.0.99 dest_port=80 protocol=6 |
disposition |
DENIED |
rule_details |
reference = "network:example-net/firewall:rule-a" priority = 10 action = DENY destination_range = 10.20.0.99/32 ip_port_info = tcp:80 direction = egress |
instance |
project_id="example-proj" instance_name=VM1 region=us-west1 zone=us-west1-a |
vpc |
project_id="example-proj" vpc_name=example-net subnetwork_name=west-subnet |
remote_instance |
project_id="example-proj" instance_name=VM2 region=us-east1 zone=us-east1-b |
remote_vpc |
project_id="example-proj" vpc_name=example-net subnetwork_name=east-subnet |
remote_location |
No information. This field is only used if the destination is outside your VPC network. |
Egress allow, ingress allow example
This example shows logging for an egress-allow VPC firewall rule and an ingress-allow VPC firewall rule that together permit traffic between two VM instances in the same VPC network.
In this example, traffic flows between VM instances in the
example-net VPC network in the example-proj project.
The two VM instances are:
- VM1 in zone
us-west1-awith IP address10.10.0.99in thewest-subnet(us-west1region). - VM2 in zone
us-east1-bwith IP address10.20.0.99in theeast-subnet(us-east1region).
- VM1 in zone
Rule A: An egress allow firewall rule has a target of all instances in the network, a destination of
10.20.0.99(VM2), and applies to TCP port80. Logging is enabled for this rule.Rule B: An ingress allow firewall rule has a target of all instances in the network, a source of
10.10.0.99(VM1), and applies to TCP port80. Logging is also enabled for this rule.
To create the VPC firewall rules, use the following gcloud
commands:
Rule A: egress allow rule for TCP port
80, applicable to all instances, destination10.20.0.99(VM2):gcloud compute firewall-rules create rule-a \ --network example-net \ --action allow \ --direction EGRESS \ --rules tcp:80 \ --destination-ranges 10.20.0.99/32 \ --priority 10 \ --enable-loggingRule B: ingress allow rule for TCP port
80, applicable to all instances, source10.10.0.99(VM1):gcloud compute firewall-rules create rule-b \ --network example-net \ --action allow \ --direction INGRESS \ --rules tcp:80 \ --source-ranges 10.10.0.99/32 \ --priority 10 \ --enable-logging
In a scenario where VM1 attempts to connect to VM2 on TCP port 80,
the following happens:
- A log entry for rule A from the perspective of VM1 is generated while VM1
connects to
10.20.0.99(VM2). - A log entry for rule B from the perspective of VM2 is generated while VM2 allows
incoming connections from
10.10.0.99(VM1).
VM1 reports the following VPC firewall rule log record:
| Field | Values |
|---|---|
connection |
src_ip=10.10.0.99 src_port=[EPHEMERAL_PORT] dest_ip=10.20.0.99 dest_port=80 protocol=6 |
disposition |
ALLOWED |
rule_details |
reference = "network:example-net/firewall:rule-a" priority = 10 action = ALLOW destination_range = 10.20.0.99/32 ip_port_info = tcp:80 direction = egress |
instance |
project_id="example-proj" instance_name=VM1 region=us-west1 zone=us-west1-a |
vpc |
project_id="example-proj" vpc_name=example-net subnetwork_name=west-subnet |
remote_instance |
project_id="example-proj" instance_name=VM2 region=us-east1 zone=us-east1-b |
remote_vpc |
project_id="example-proj" vpc_name=example-net subnetwork_name=east-subnet |
remote_location |
No information. This field is only used if the destination is outside your VPC network. |
VM2 reports the following VPC firewall rule log record:
| Field | Values |
|---|---|
connection |
src_ip=10.10.0.99 src_port=[EPHEMERAL_PORT] dest_ip=10.20.0.99 dest_port=80 protocol=6 |
disposition |
ALLOWED |
rule_details |
reference = "network:example-net/firewall:rule-b" priority = 10 action = ALLOW source_range = 10.10.0.99/32 ip_port_info = tcp:80 direction = ingress |
instance |
project_id="example-proj" instance_name=VM2 region=us-east1 zone=us-east1-b |
vpc |
project_id="example-proj" vpc_name=example-net subnetwork_name=east-subnet |
remote_instance |
project_id="example-proj" instance_name=VM1 region=us-west1 zone=us-west1-a |
remote_vpc |
project_id="example-proj" vpc_name=example-net subnetwork_name=west-subnet |
remote_location |
No information. This field is only used if the destination is outside your VPC network. |
Internet ingress example
This example shows logging for an ingress-allow firewall rule that permits traffic from the internet to a VM instance. It also shows how stateful firewall behavior affects an egress-deny rule.
In this example, traffic flows from an external resource to a VM instance
within the example-net VPC network. The network is
in the example-proj project.
- The system on the internet has IP address
203.0.113.114. - VM1 in zone
us-west1-ahas IP address10.10.0.99in thewest-subnet(us-west1region). - Rule C: An ingress allow firewall rule has a target of all instances in the
network, a source of any IP address (
0.0.0.0/0), and applies to TCP port80. Logging is enabled for this rule. - Rule D: An egress deny firewall rule has a target of all instances in the
network, a destination of any IP address (
0.0.0.0/0), and applies to all protocols. Logging is enabled for this rule.
To create the VPC firewall rules, use the following gcloud
commands:
Rule C: ingress allow rule for TCP port
80, applicable to all instances, any source:gcloud compute firewall-rules create rule-c \ --network example-net \ --action allow \ --direction INGRESS \ --rules tcp:80 \ --source-ranges 0.0.0.0/0 \ --priority 10 \ --enable-loggingRule D: egress deny rule for all protocols, applicable to all instances, any destination:
gcloud compute firewall-rules create rule-d \ --network example-net \ --action deny \ --direction EGRESS \ --rules all \ --destination-ranges 0.0.0.0/0 \ --priority 10 \ --enable-logging
In a scenario where system with IP address 203.0.113.114 attempts to
connect to VM1 on TCP port 80, the following happens:
- VM1 generates a log entry for rule C while it accepts traffic from
203.0.113.114. - Despite rule D, VM1 can reply to the incoming request because Google Cloud firewall rules are stateful. If the incoming request is allowed, no egress rule can block established responses.
- Because rule D doesn't apply, the system doesn't consider it, so there is no log entry for rule D.
VM1 reports the following VPC firewall rule log record:
| Field | Values |
|---|---|
connection |
src_ip=203.0.113.114 src_port=[EPHEMERAL_PORT] dest_ip=10.10.0.99 dest_port=80 protocol=6 |
disposition |
ALLOWED |
rule_details |
reference = "network:my-vpc/firewall:rule-c" priority = 10 action = ALLOW source_range = 0.0.0.0/0 ip_port_info = tcp:80 direction = ingress |
instance |
project_id="example-proj" instance_name=VM1 region=us-west1 zone=us-west1-a |
vpc |
project_id="example-proj" vpc_name=example-net subnetwork_name=west-subnet |
remote_location |
continent country region city |