The AWS Network Access Control List (NACL) is a security layer for your VPC that acts as a firewall for controlling traffic in and out of one or more subnets.
NACLs vs. Security Groups
NACLs and Security Groups (SGs) both have similar purposes. They filter traffic according to rules, to ensure only authorized traffic is routed to its destination.
NACLs are used to control access to network resources. They reside on subnets and evaluate traffic based on defined rules which you set, and use these rules to determine whether or not traffic should be allowed to pass through the subnet.
NACLs are “STATELESS” which means they require you to create separate rules for BOTH INCOMING AND OUTGOING traffic. Just because a particular data stream is allowed into the subnet, this doesn’t mean it will automatically be allowed out.
NACLs are processed in numerical ie serial order. Thus if you want traffic to be permitted both in and out of a subnet, you have to set network access rules for both directions.
NACLs are automatically applied to everything within that subnet, so there is no need to apply NACLs to individual resources as they are created. This means less network admin overhead for managers.
Security Groups apply to EC2 instances and operate like a host-based firewall. As with NACLs they apply rules that determine whether traffic to or from a given EC2 instance should be allowed.
This provides for more finely tuned traffic control for resources that have specific network traffic requirements.
Security Groups unlike NACLs are stateful; this means that any traffic that is allowed into your EC2 instance will automatically be allowed out again and vice versa.
All security groups rules are evaluated according to a default “deny everything unless allowed” policy. This means that if no ALLOW exists, then traffic will be blocked.
Security Groups must be applied at the time of resource creation and have to be explicitly configured.
Similarities and Differences Between NACLs and Security Groups
Both NACLs and Security Groups utilize rules that prevent unwanted traffic from accessing your network. The rules themselves also look similar. But a notable difference between them is that NACLs allow for DENY rules to be explicitly created.
It is important to ensure that your security group rules and your NACLs are not working against one another. Thus it is important to understand when it is best to use NACLs and when it is best to use SGs.
The major difference between them is in where they are applied. NACLs are applied at the SUBNET level, while Security Groups are applied at the EC2 instance level.
NACLs protect the network while Security Groups protect the resource.
As NACLs are higher up in the architecture, they apply to a much wider set of resources. Any NACL rule you create will therefore impact the operation of every resource located within the subnet.
Security Groups on the other hand only affect the EC2 instances to which they are attached.
When to Use NACLs
NACLs are best used sparingly. Because NACLs apply to the full set of resources in a subnet, their impact is wide and substantial.
NACLs are most effective for filtering external traffic to internal subnets. They can also be useful for applying traffic controls between the subnets themselves.
Best Practices for Using NACLs
Use NACLs sparingly and deploy them based on the function of the subnet they are attached to
Keep NACLs simple and only use them to deny traffic if possible
Restrict who can create or modify NACLs through IAM rules
Build your Security Group rules into your NACLs
Ensure that your inbound and outbound rules make sense ie that they match
When numbering your NACLs, be sure to leave room for future rules
Audit your rules frequently and delete any rules that are unused or redundant
Deploy NACLs to also control your subnet-to-subnet traffic and ensure logical separation between them