I create a VPC.
I create three private subnets.
I launch a workload.
The workload resolves:
sts.eu-west-2.amazonaws.com
catalog.internal.bfstore.example
ip-10-80-20-34.eu-west-2.compute.internal
I did not create a DNS server.
There is no EC2 instance called bfstore-dns-01, no resolver appliance in a subnet and no DNS interface I manage.
The resolver was already there.
AWS calls the built-in service Route 53 VPC Resolver. It is also described as:
- the Amazon DNS server;
- AmazonProvidedDNS;
- Route 53 Resolver in older documentation and architecture material.
The name changed when AWS introduced Route 53 Global Resolver. The products should not be confused.
ROUTE 53 VPC RESOLVER
built into every VPC
reachable through link-local
and VPC-plus-two addresses
ROUTE 53 GLOBAL RESOLVER
internet-reachable anycast resolver
for authorised remote, branch
and on-premises clients
This article covers the VPC service.
Resources reach it through:
169.254.169.253
fd00:ec2::253
primary VPC IPv4 CIDR plus two
A VPC using:
10.80.0.0/16
can therefore reach it at:
10.80.0.2
BFSTORE WORKLOAD
│
│ DNS query
▼
Route 53 VPC Resolver
│
├── AWS-provided private names
├── Route 53 private hosted zones
└── public recursive DNS
The resolver does not need to be added to the VPC architecture. It needs to be understood, configured and observed because it was part of the architecture from the beginning.
That small shift cleared up several of my earlier DNS questions.
How a VPC resource reaches the Resolver
The .2 address is not a little DNS appliance
Suppose bfstore’s production VPC uses:
10.80.0.0/16
Its familiar Resolver address is:
10.80.0.2
It is tempting to imagine one resolver living at that address inside the first subnet.
That mental model invites questions about its Availability Zone, route, interface and redundancy.
The address is a VPC-provided access point to the managed Resolver service.
AWS describes two highly available components behind it:
EC2 OR WORKLOAD
│
▼
NITRO RESOLVER
│
├── local cache
│
▼
ZONAL RESOLVER FLEET
│
▼
AUTHORITATIVE OR RECURSIVE ANSWER
Repeated queries may be answered from a local cache. Uncached queries pass to a highly available resolver fleet, normally in the same Availability Zone.
AWS transports these link-local queries privately outside the customer-visible VPC data path.
The VPC+2 address is derived from the VPC’s primary IPv4 CIDR.
Adding a secondary CIDR does not create another Resolver address for that block.
DHCP tells the client which resolver to use
AmazonProvidedDNS is a special DHCP option value.
It normally tells compatible VPC resources to use Route 53 VPC Resolver. It does not create the managed resolver.
The default DHCP option set includes:
domain-name-servers = AmazonProvidedDNS
Each VPC can have only one DHCP option set associated with it at a time.
A custom option set can instead specify customer-managed DNS server addresses. AWS allows custom servers or AmazonProvidedDNS, but warns that mixing them can produce unexpected behaviour.
For bfstore’s ordinary VPCs:
dhcp_options:
domain_name_servers:
- AmazonProvidedDNS
If no DHCP option set is associated, Nitro-based EC2 instances still receive:
169.254.169.253
as their DNS server. Older Xen-based instances do not receive the same fallback.
In an IPv6-only subnet, the IPv4 link-local Resolver address remains reachable when AmazonProvidedDNS is present in the DHCP option set.
A custom option set matters when the VPC should query Active Directory DNS, an enterprise filtering resolver or another internal DNS platform first.
Where that custom resolver runs matters.
CUSTOM DNS INSIDE THE VPC
may conditionally forward
AWS-private namespaces
to the VPC-plus-two address
DNS OUTSIDE THE VPC
must use an inbound endpoint
or another supported resolver service
An on-premises resolver, or a resolver in another VPC, should not forward private queries directly to a VPC’s CIDR-plus-two address.
Two VPC attributes control different behaviour
The VPC has two DNS attributes whose names are similar enough to invite configuration fog.
enableDnsSupport
This controls whether DNS resolution through the Amazon-provided resolver is supported for the VPC.
enableDnsHostnames
This controls AWS hostname behaviour, including public DNS hostnames for instances with public IPv4 addresses when the required conditions are met.
For private hosted zones and private DNS names associated with interface VPC endpoints, both attributes should be enabled.
For bfstore:
vpc_dns:
enable_dns_support: true
enable_dns_hostnames: true
enableDnsSupport defaults to true.
enableDnsHostnames defaults to false for a non-default VPC.
The attributes enable Resolver behaviour. They do not create bfstore’s private records.
How VPC Resolver chooses where to answer
A Route 53 private hosted zone stores records for one or more associated VPCs.
Suppose bfstore creates:
internal.bfstore.example
with records such as:
otel.internal.bfstore.example
modules.internal.bfstore.example
orders.internal.bfstore.example
A workload in an associated VPC sends its query to Route 53 VPC Resolver.
The client does not query the private zone’s displayed name servers over the public internet. Resolver uses the VPC association and private AWS connectivity to obtain the answer.
The simplified decision path is:
QUERY
│
▼
MATCHING RESOLVER RULE?
│
├── yes → follow the most-specific rule
│
▼
MOST-SPECIFIC PRIVATE HOSTED ZONE?
│
├── yes → search that zone
│ │
│ ├── record present → answer
│ └── record absent → NXDOMAIN
│
▼
PUBLIC RECURSION
A forwarding rule for the same domain takes precedence over a private hosted zone.
Where overlapping private hosted zones exist, Resolver uses the most-specific matching zone.
For example, a query for api.accounting.example.com uses accounting.example.com rather than the broader example.com zone.
If that selected zone does not contain the requested record and type, Resolver returns:
NXDOMAIN
It does not retry against the broader private zone or the public namespace.
This is how split-view DNS can appear to break one public hostname while other public names still resolve. The private namespace has taken authority for that branch.
Private subdomains can also be delegated deliberately through NS records.
A private answer proves only that DNS returned an address. Routes, security controls, endpoint policies and the destination service still determine whether it can be used.
Resolver endpoints extend the boundary
Route 53 VPC Resolver already resolves:
- public DNS names;
- AWS-provided VPC names;
- associated private hosted zones.
Resolver endpoints solve a different problem.
Inbound endpoint
An inbound endpoint allows a resolver on another connected network to ask VPC Resolver for AWS-private answers.
EXTERNAL RESOLVER
│
▼
INBOUND ENDPOINT
│
▼
VPC RESOLVER
Use it when on-premises DNS or another cloud must query AWS-private namespaces.
External DNS systems should not forward directly to a VPC’s CIDR-plus-two address.
Outbound endpoint
An outbound endpoint allows VPC Resolver to send selected namespaces to DNS servers elsewhere.
VPC RESOLVER
│
▼
OUTBOUND RULE
│
▼
OUTBOUND ENDPOINT
│
▼
EXTERNAL DNS AUTHORITY
For example:
corp.example
→ enterprise DNS
legacy.internal
→ custom resolver
bfstore currently has no on-premises network.
It does not need Resolver endpoints merely because it uses private hosted zones.
The endpoints matter when a real external DNS boundary appears. No ceremonial resolver furniture is required.
Route 53 Global Resolver is a separate option for authorised remote, branch and on-premises clients that need internet-reachable anycast resolution of public and associated private domains. It does not replace the VPC’s built-in Resolver or make private-network endpoints unnecessary for every hybrid design.
Operating and observing the Resolver
Security groups cannot block it
Traffic to and from the Amazon DNS server cannot be filtered with security groups or network ACLs.
This rule does not create complete DNS control:
Application security group:
allow UDP 53 to approved resolver
deny everything else
The workload can still reach Route 53 VPC Resolver. Domain policy for queries handled there belongs in Resolver DNS Firewall.
DNS Firewall can allow, block or alert on domains using managed and custom lists.
Its default failure mode is fail closed.
If DNS Firewall does not return a decision, VPC Resolver blocks the query and returns:
SERVFAIL
A VPC can instead be configured to fail open where availability is preferred over enforcement during a firewall impairment.
DNS Firewall sees only queries that pass through VPC Resolver.
A workload that sends a query directly to another reachable DNS server does not automatically pass through those rules.
It also filters names, not the resulting application traffic.
Blocking a lookup does not prevent:
- direct-IP connections;
- HTTPS to an already known address;
- SSH;
- another protocol reaching the destination.
A complete egress design may also require routing controls, security groups, Network Firewall, a proxy or application-level policy.
DNS is one path towards a destination, not the destination itself.
Query logs reveal Resolver activity
Resolver query logging can record:
- queries originating from selected VPCs;
- queries entering through inbound endpoints;
- recursive queries using outbound endpoints;
- DNS Firewall decisions.
Records can include:
- VPC ID;
- source address and resource identity where available;
- queried name;
- record type;
- response code;
- response data;
- DNS Firewall action.
Logs can be sent to:
- CloudWatch Logs;
- Amazon S3;
- Amazon Data Firehose.
For high-volume environments, S3 may be the more durable destination.
Resolver logs queries it processes rather than answers from its cache.
ONE LOGGED QUERY
does not necessarily mean
ONE APPLICATION LOOKUP
The log is not a count of every request made by applications, operating systems or CoreDNS.
The hidden resolver still has a quota
Route 53 VPC Resolver is managed and highly available.
It is not an infinite packet funnel.
AWS provides a non-adjustable allowance of:
1,024 packets per second
per network interface
for link-local services.
The aggregate includes:
- VPC Resolver DNS queries;
- Instance Metadata Service;
- Amazon Time Service;
- Windows licensing traffic.
Packets beyond the allowance are rejected.
The practical diagnostic is linklocal_allowance_exceeded, exposed through ethtool and publishable through the CloudWatch agent.
This matters for workloads that disable local caching, resolve names for every request, create many short-lived processes or repeatedly query nonexistent names.
Kubernetes commonly adds CoreDNS:
application
│
▼
CoreDNS
│
▼
Route 53 VPC Resolver
│
▼
private or public authority
When DNS throttling appears in EKS, useful responses may include scaling CoreDNS or adopting NodeLocal DNSCache.
A DNS incident can therefore exist in the application resolver, CoreDNS, VPC Resolver, a private hosted zone, a forwarding rule or the authoritative DNS system.
The phrase:
DNS is broken
contains several separate systems, even when one is intentionally invisible.
The bfstore starting design
For bfstore’s initial VPCs, I would use:
dns:
vpc_attributes:
enable_dns_support: true
enable_dns_hostnames: true
dhcp:
domain_name_servers:
- AmazonProvidedDNS
private_hosted_zones:
- internal.bfstore.example
resolver_endpoints:
inbound: none
outbound: none
query_logging:
enabled: true
destination: central-log-archive
dns_firewall:
phase: later-controlled-egress
failure_mode: fail-closed
The private hosted-zone structure should follow real ownership boundaries rather than creating one giant internal namespace full of unrelated records.
Possible zones might include:
platform.internal.bfstore.example
prod.internal.bfstore.example
nonprod.internal.bfstore.example
The final names should align with VPC associations, account ownership, environment isolation, disaster recovery and future Azure or GCP naming.
Resolver endpoints should remain absent until bfstore has an actual forwarding or delegation requirement.
Transit Gateway connectivity alone does not solve private DNS naming across VPCs and external environments.
Routing answers whether an address is reachable.
Resolver configuration answers how the client discovers it.
The mental model I am keeping
My earlier model was:
VPC DNS
something Route 53 does
after I configure it
The stronger model is:
VPC WORKLOAD
│
▼
OPERATING-SYSTEM DNS
│
▼
Route 53 VPC Resolver
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
AWS PRIVATE PRIVATE HOSTED PUBLIC
NAMES ZONES RECURSION
│
▼
OPTIONAL EXTENSIONS
│
┌──────────────┴──────────────┐
│ │
▼ ▼
INBOUND ENDPOINT OUTBOUND ENDPOINT
│ │
▼ ▼
QUERIES INTO AWS QUERIES TO EXTERNAL DNS
The DHCP option answers:
Which resolver should
the resource use?
enableDnsSupport answers:
May the VPC use
the Amazon-provided resolver?
enableDnsHostnames answers:
Which AWS hostname behaviour
is enabled in this VPC?
A Resolver rule answers:
Which namespace should follow
a custom forwarding path?
A private hosted-zone association answers:
Which private namespace
is authoritative here?
An inbound endpoint answers:
How may an external resolver
query AWS-private names?
An outbound endpoint answers:
Which names should AWS send
to another DNS authority?
Query logging answers:
Which DNS questions did
Resolver process?
DNS Firewall answers:
Which Resolver-handled queries
should be permitted?
And the link-local metric answers:
Is one network interface
overwhelming the hidden path?
AmazonProvidedDNS was easy to overlook because it did not ask me to deploy anything. That is precisely why it deserves a place in the architecture.
The resolver is hidden operationally, not architecturally.
It helps workloads discover public AWS APIs, answers private hosted zones, supports interface endpoint private DNS, sits beneath Kubernetes DNS and becomes one side of future hybrid forwarding.
And when it cannot answer, an application can appear network-isolated even though every route and security rule is correct.
The VPC already had a resolver.
My job is not to install it.
My job is to know which names it owns, which rules take precedence, which queries it forwards, which evidence it records and when bfstore genuinely needs to extend it beyond the VPC.
References and further reading
-
What is Route 53 VPC Resolver?
Defines the built-in VPC resolver and explains the naming change from Route 53 Resolver. -
Amazon Route 53 Global Resolver is now generally available
Introduces the separate internet-reachable anycast resolver service. -
Understanding Amazon DNS
Documents Resolver addresses, VPC DNS attributes, filtering limitations and the link-local quota. -
DHCP option-set concepts
DescribesAmazonProvidedDNS, custom DNS servers and behaviour when no option set is associated. -
Considerations when working with a private hosted zone
Covers overlapping zones,NXDOMAIN, rule precedence and custom DNS forwarding. -
Resolving DNS queries between VPCs and your network
Explains inbound and outbound endpoints and why external resolvers should not query VPC-plus-two addresses directly. -
Resolver query logging
Documents logged query sources, destinations and the effect of Resolver caching. -
Using DNS Firewall to filter outbound DNS traffic
Describes domain filtering for queries that pass through VPC Resolver. -
DNS Firewall VPC configuration
Documents fail-open and fail-closed behaviour. -
Route 53 VPC Resolver availability and scaling
Explains Nitro Resolver, the zonal fleet, caching, link-local capacity andlinklocal_allowance_exceeded.