Private IP addresses are reserved for internal network use and are not routable on the public internet. RFC 1918 defines three private address ranges for IPv4, while additional special-use ranges serve specific purposes like link-local addressing and loopback testing.
Private IPs can be reused across different networks. Your home router uses 192.168.1.1 - and so do millions of others. NAT (Network Address Translation) maps private IPs to public IPs for internet access.
RFC 1918 Private Ranges
These three ranges are defined by RFC 1918 for private internets. They will never be assigned as public addresses.
10.0.0.0/8
Class A private range. The largest block, commonly used by enterprises and cloud providers.
172.16.0.0/12
Class B private range. Often used for container networks and internal services.
192.168.0.0/16
Class C private range. The most recognized range, used by home routers worldwide.
Quick Lookup Table
| CIDR Block | First IP | Last IP | Addresses | Type |
|---|---|---|---|---|
| 10.0.0.0/8 | 10.0.0.0 | 10.255.255.255 | 16,777,216 | Private |
| 172.16.0.0/12 | 172.16.0.0 | 172.31.255.255 | 1,048,576 | Private |
| 192.168.0.0/16 | 192.168.0.0 | 192.168.255.255 | 65,536 | Private |
10.x.x.x - Starts with 10 (easy to remember)
172.16-31.x.x - Second octet 16-31 only (not all 172.x.x.x)
192.168.x.x - The "home network" range everyone knows
Other Special-Use IPv4 Ranges
Beyond RFC 1918, several other address ranges have special purposes and are not routable on the public internet.
| CIDR Block | Range | Purpose | RFC |
|---|---|---|---|
| 127.0.0.0/8 | 127.0.0.0 - 127.255.255.255 | Loopback Local host (typically 127.0.0.1) | RFC 1122 |
| 169.254.0.0/16 | 169.254.0.0 - 169.254.255.255 | Link-Local Auto-configured when DHCP fails | RFC 3927 |
| 100.64.0.0/10 | 100.64.0.0 - 100.127.255.255 | CGN Carrier-grade NAT (ISP internal) | RFC 6598 |
| 192.0.0.0/24 | 192.0.0.0 - 192.0.0.255 | IETF Protocol Protocol assignments | RFC 6890 |
| 192.0.2.0/24 | 192.0.2.0 - 192.0.2.255 | Documentation TEST-NET-1 for examples | RFC 5737 |
| 198.51.100.0/24 | 198.51.100.0 - 198.51.100.255 | Documentation TEST-NET-2 for examples | RFC 5737 |
| 203.0.113.0/24 | 203.0.113.0 - 203.0.113.255 | Documentation TEST-NET-3 for examples | RFC 5737 |
| 198.18.0.0/15 | 198.18.0.0 - 198.19.255.255 | Benchmarking Network device testing | RFC 2544 |
| 224.0.0.0/4 | 224.0.0.0 - 239.255.255.255 | Multicast One-to-many delivery | RFC 5771 |
| 240.0.0.0/4 | 240.0.0.0 - 255.255.255.254 | Reserved Future use (Class E) | RFC 1112 |
| 255.255.255.255/32 | 255.255.255.255 | Broadcast Limited broadcast address | RFC 919 |
| 0.0.0.0/8 | 0.0.0.0 - 0.255.255.255 | This Network Source only, for DHCP/boot | RFC 1122 |
IPv6 Private/Special Ranges
| Prefix | Purpose | IPv4 Equivalent |
|---|---|---|
| ::1/128 | Loopback Localhost | 127.0.0.1 |
| fc00::/7 | Unique Local Private IPv6 (ULA) | 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 |
| fe80::/10 | Link-Local Auto-configured, single link only | 169.254.0.0/16 |
| ::ffff:0:0/96 | IPv4-Mapped IPv4 addresses in IPv6 format | N/A |
| 2001:db8::/32 | Documentation Examples and documentation | 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 |
| ff00::/8 | Multicast One-to-many delivery | 224.0.0.0/4 |
Common Network Configurations
Home Router
Hosts: 192.168.1.2 - 192.168.1.254
AWS Default VPC
65,536 total addresses
Docker Default
Gateway: 172.17.0.1
Kubernetes Pods
Per-node: /24 subnets
Is This IP Private?
# Quick regex check for private IPv4
# 10.x.x.x
^10\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
# 172.16.x.x - 172.31.x.x
^172\.(1[6-9]|2[0-9]|3[0-1])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
# 192.168.x.x
^192\.168\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
# Bash function to check if IP is private
is_private_ip() {
local ip=$1
if [[ $ip =~ ^10\. ]] || \
[[ $ip =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]] || \
[[ $ip =~ ^192\.168\. ]]; then
echo "Private"
else
echo "Public (or special-use)"
fi
}
# Usage
is_private_ip "192.168.1.100" # Private
is_private_ip "8.8.8.8" # Public
172.16-31.x.x is private, but 172.0-15.x.x and 172.32-255.x.x are PUBLIC. The entire 172.x.x.x range is not private - only 172.16.0.0 through 172.31.255.255.