Network Address Translation is one of those technologies that quietly keeps the entire internet functioning, given how few public IPv4 addresses exist relative to the number of devices that need to reach the internet. Dynamic NAT is one flavor of this — and while it’s less commonly deployed today than NAT overload (PAT), understanding it properly gives you a much clearer picture of how NAT works in general, and there are still legitimate scenarios where it’s exactly the right tool. Let me walk you through what Dynamic NAT is, how it differs from its cousins, and how to configure and verify it properly.
What Is Dynamic NAT?
Dynamic NAT translates private (inside local) IP addresses to public (inside global) IP addresses automatically, drawing from a defined pool of available public addresses, on a one-to-one basis. Unlike static NAT (where one private address is permanently mapped to one specific public address) and unlike PAT/NAT overload (where many private addresses share a single public address using different port numbers), Dynamic NAT allocates a public address from a pool to a private address only when a translation is actually needed, and it releases that address back to the pool once the translation entry times out.
Here’s the analogy I like: think of a public library with a pool of textbooks (public IPs) for a course with more students (private IPs) than there are books — but not by a huge multiple. Whoever comes in first gets to check out a book for their current translation session. If a student comes in and the pool is empty, they can’t get one until someone returns theirs. Static NAT would be like every student having their own permanently assigned book with their name in it. PAT would be like the library making infinite photocopies of a single book so everyone can read simultaneously.
When Dynamic NAT Makes Sense
- You have a moderate-sized pool of public IP addresses and a number of internal hosts that’s larger than the pool but doesn’t need simultaneous access for every host
- Certain legacy applications behave poorly with PAT’s port-based translation and need a genuine 1:1 (though not permanent) address mapping
- Lab, testing, or transitional network environments where you’re deliberately not oversubscribing address translation
In modern production networks, PAT (NAT overload) is far more common because it maximizes a small number of public IPs across many hosts. But Dynamic NAT is still tested heavily on certifications and does show up in specific real deployments, so it’s worth understanding solidly.
NAT Terminology You Need to Know
- Inside local: the private IP address of a host as seen inside your network (e.g., 192.168.1.10)
- Inside global: the translated public IP address as seen from outside your network (e.g., 203.0.113.10)
- Outside local: the address of an external host as seen from inside your network (usually the same as outside global unless you’re doing NAT on both sides)
- Outside global: the actual public IP address of an external host
Prerequisites
- Cisco IOS/IOS-XE router with at least two interfaces: one facing the internal network, one facing the internet/public network
- A defined pool of public IP addresses assigned to your router (typically from your ISP)
- Internal addressing already configured
Topology for This Guide
Internal LAN: 192.168.1.0/24 (Gi0/1 - inside interface)
Public pool: 203.0.113.10 - 203.0.113.20 (Gi0/0 - outside interface)
Step 1: Identify Inside and Outside Interfaces
This is a step people skip and then wonder why NAT isn’t working at all — IOS needs to know which interfaces are “inside” (private) and which are “outside” (public).
Router(config)# interface GigabitEthernet0/1
Router(config-if)# ip nat inside
Router(config-if)# exit
Router(config)# interface GigabitEthernet0/0
Router(config-if)# ip nat outside
Router(config-if)# exit
Step 2: Define the Pool of Public Addresses
Router(config)# ip nat pool PUBLIC-POOL 203.0.113.10 203.0.113.20 netmask 255.255.255.0
Step 3: Define Which Internal Hosts Are Eligible for Translation
Use a standard or extended ACL to define the source traffic that should be translated. This ACL does not determine security policy — it’s purely a matching mechanism for NAT.
Router(config)# access-list 10 permit 192.168.1.0 0.0.0.255
Step 4: Bind the ACL to the Pool
Router(config)# ip nat inside source list 10 pool PUBLIC-POOL
This single command ties everything together: traffic matching ACL 10, arriving on an inside interface, gets dynamically translated using an address drawn from PUBLIC-POOL.
Full Configuration Recap
interface GigabitEthernet0/1
ip address 192.168.1.1 255.255.255.0
ip nat inside
interface GigabitEthernet0/0
ip address 203.0.113.1 255.255.255.0
ip nat outside
ip nat pool PUBLIC-POOL 203.0.113.10 203.0.113.20 netmask 255.255.255.0
access-list 10 permit 192.168.1.0 0.0.0.255
ip nat inside source list 10 pool PUBLIC-POOL
ip route 0.0.0.0 0.0.0.0 203.0.113.254
Verifying Dynamic NAT
Generate some traffic from an internal host (a ping to an external address is enough to test), then check the translation table:
Router# show ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 203.0.113.10:512 192.168.1.10:512 8.8.8.8:512 8.8.8.8:512
Check statistics and pool utilization:
Router# show ip nat statistics
Total active translations: 1 (0 static, 1 dynamic; 0 extended)
Peak translations: 3, occurred 00:04:12 ago
Outside interfaces:
GigabitEthernet0/0
Inside interfaces:
GigabitEthernet0/1
Hits: 42 Misses: 0
Pool PUBLIC-POOL: netmask 255.255.255.0
start 203.0.113.10 end 203.0.113.20
type generic, total addresses 11, allocated 1 (9%), misses 0
That “allocated” percentage is the number to watch — if it climbs toward 100%, you’re running out of pool addresses and new translation requests will start failing (which shows up as “misses” incrementing).
What Happens When the Pool Is Exhausted?
This is the single biggest operational drawback of Dynamic NAT versus PAT. Once every address in the pool is actively allocated, any new host trying to initiate a translated connection simply fails — no address is available. You’ll see the miss counter increase in show ip nat statistics, and affected users will experience connectivity failures that can be confusing to diagnose if you’re not specifically looking at NAT.
By default, dynamic translation entries time out after 24 hours of inactivity (ip nat translation timeout), though TCP and UDP have their own more aggressive default timers. You can tune these:
Router(config)# ip nat translation timeout 3600
Router(config)# ip nat translation tcp-timeout 3600
Router(config)# ip nat translation udp-timeout 300
Lowering timeouts frees up pool addresses faster but can also prematurely tear down legitimate long-lived sessions — there’s a real tradeoff here worth testing in your environment.
Combining Dynamic NAT with Overflow PAT
A very practical hybrid pattern: use Dynamic NAT for the primary pool, but configure overflow to PAT once the pool is exhausted, so connections don’t simply fail — they just start sharing addresses via port translation instead:
Router(config)# ip nat inside source list 10 pool PUBLIC-POOL overload
Wait — that actually converts the entire pool to PAT-style overload rather than pure one-to-one dynamic. If you specifically want pure dynamic NAT with a PAT fallback only on exhaustion, most production designs simply skip pure dynamic NAT altogether and use overload from the start, since it achieves better address utilization with essentially the same configuration effort. I mention this because it’s a very common “aha” moment — once you understand Dynamic NAT deeply, you often realize NAT Overload (covered in the companion guide) is what you actually want for internet-facing use cases.
Real-World Enterprise Scenario
One legitimate scenario I’ve encountered: a lab/test environment with a moderate pool of public addresses assigned specifically so that each active test session gets a genuinely unique public IP (not just a unique port), because the application under test needed to be reachable inbound without the complications PAT introduces for inbound connections. Another: a merger/acquisition scenario where two networks with overlapping private address space temporarily needed unique, distinguishable translated addresses for a specific subset of systems during a phased migration, before eventually consolidating fully.
Security Considerations
- NAT is not a security control on its own, even though it has the side effect of hiding internal addressing. Don’t rely on NAT instead of a proper stateful firewall.
- Be deliberate with the ACL used for NAT matching — an overly broad ACL (
permit ip any any) can translate more traffic than intended. - Monitor pool exhaustion actively; a pool running near capacity is both an operational risk and, in some designs, a potential vector for denial-of-service style resource exhaustion if an attacker can force many translation requests.
Common Configuration Mistakes
- Forgetting to mark interfaces with
ip nat inside/ip nat outside— NAT simply won’t function without this, and there’s no obvious error message pointing you to it. - Using an ACL that’s too broad or too narrow relative to your intended internal address ranges.
- Assuming Dynamic NAT scales the same way PAT does — it doesn’t; the pool size is a hard ceiling on simultaneous unique translations.
- Not adjusting timeouts and then being confused when the pool appears “full” of stale, inactive translations.
- Confusing Dynamic NAT’s pool exhaustion behavior with a routing or connectivity problem during troubleshooting.
Troubleshooting Checklist
show ip nat statistics— confirm inside/outside interfaces are correctly recognized and check pool allocation percentage.show ip nat translations— confirm active translations exist and look correct.debug ip nat(use cautiously, it’s verbose under load) — shows real-time translation events per packet.- Confirm the ACL used for NAT matches your intended source traffic with
show access-list 10. - Check for pool exhaustion if new connections intermittently fail while existing ones work fine.
- Verify the default route or upstream routing correctly points traffic out the
ip nat outsideinterface.
Performance Tuning Tips
- Size your pool realistically based on peak concurrent sessions, not average — Dynamic NAT has zero flexibility once the pool is full.
- Tune
ip nat translation timeoutvalues to match your actual session patterns; shorter timeouts recycle pool addresses faster in environments with many short-lived connections. - For most production internet-edge use cases, seriously consider
overload(PAT) instead — it dramatically increases the effective capacity of a small public IP allocation and is far more common in real deployments.
FAQs
What’s the real difference between Dynamic NAT and PAT? Dynamic NAT maps one private address to one public address at a time (from a pool), so the number of simultaneous translations is capped by pool size. PAT (NAT overload) maps many private addresses to a single public address using unique port numbers, allowing thousands of simultaneous sessions from just one public IP.
Can inbound connections initiate through Dynamic NAT? Not directly and reliably — Dynamic NAT translation entries are created dynamically as internal hosts initiate outbound traffic. For predictable inbound access, you need Static NAT (covered in the port forwarding guide) instead.
What happens if the pool runs out of addresses? New translation requests fail until an existing translation times out and its address returns to the pool. Existing translations aren’t affected.
Does Dynamic NAT work with both TCP and UDP equally? Yes, since it works at the IP address level rather than the port level, it doesn’t distinguish between protocols the way PAT’s port-based approach does.
Summary
Dynamic NAT translates internal addresses to public addresses on a one-to-one basis, drawn dynamically from a defined pool — a middle ground between Static NAT’s permanent mappings and PAT’s many-to-one address sharing. The critical things to remember: mark your inside/outside interfaces correctly, size your pool for actual peak concurrent usage since exhaustion causes hard connection failures, and recognize that in most modern internet-facing deployments, PAT (NAT overload) is usually the better choice for maximizing a limited public address allocation. Understanding Dynamic NAT thoroughly, though, gives you the conceptual foundation to configure any NAT variant confidently.
References
- Cisco: Configuring NAT for IP Address Conservation
- RFC 1631: The IP Network Address Translator (NAT)
- Cisco IOS IP Addressing Services Command Reference
