Redes
Direcciones IP, CIDR y subnetting básico que no puedes saltarte
Notación CIDR, rangos privados y matemática de subnetting sin la jerga de networking. Base que todo backend necesita para firewalls, VPCs y routing.
El subnetting es uno de esos temas donde la versión completa de certificación de networking es overkill para backends, pero la versión pragmática es esencial. Si configuras VPCs, security groups, firewalls, o rate-limiting por IP, la necesitas. Esta guía es la versión pragmática.
Direcciones IPv4 en bits
Una dirección IPv4 son 32 bits, normalmente escritos como cuatro números de 8 bits separados por puntos: 192.168.1.10. Cada número va de 0 a 255.
192.168.1.10 en binario:
11000000 . 10101000 . 00000001 . 00001010
Ese número de 32 bits es la historia entera. “Direcciones IP” y “redes IP” son ambos prefijos derivados de este número.
Qué significa la notación CIDR
CIDR (Classless Inter-Domain Routing) escribe una red IP como dirección/longitud_de_prefijo. La longitud de prefijo es el número de bits iniciales que son identificador de red; los bits restantes son identificadores de host dentro de esa red.
192.168.1.0/24 significa “la red donde los primeros 24 bits son 192.168.1 y los últimos 8 son identificadores de host”. Esa red contiene 256 direcciones: 192.168.1.0 a 192.168.1.255.
| CIDR | Máscara | IPs totales | IPs usables | Uso típico |
|---|---|---|---|---|
| /32 | 255.255.255.255 | 1 | 1 | Host único, regla firewall para una IP |
| /30 | 255.255.255.252 | 4 | 2 | Enlaces punto a punto |
| /29 | 255.255.255.248 | 8 | 6 | Pequeño grupo de servidores |
| /28 | 255.255.255.240 | 16 | 14 | Subredes diminutas |
| /27 | 255.255.255.224 | 32 | 30 | Oficina pequeña |
| /26 | 255.255.255.192 | 64 | 62 | Subred mediana |
| /24 | 255.255.255.0 | 256 | 254 | ”Clase C” clásica, la mayoría de LANs |
| /22 | 255.255.252.0 | 1.024 | 1.022 | Edificio o departamento |
| /20 | 255.255.240.0 | 4.096 | 4.094 | Oficina grande |
| /16 | 255.255.0.0 | 65.536 | 65.534 | ”Clase B” clásica, org grande |
| /8 | 255.0.0.0 | 16.777.216 | 16.777.214 | ”Clase A”, muy grande |
| /0 | 0.0.0.0 | Todas las IPs | Todas las IPs | ”Internet” |
Las IPs usables son el total menos 2: la primera (bits de host todo a cero) es la dirección de red, y la última (bits de host todo a uno) es la dirección de broadcast. En la mayoría de despliegues no las puedes asignar a hosts. En enlaces /31 punto a punto, RFC 3021 permite usar las dos; los routers modernos lo manejan.
La matemática: una red /N contiene 2^(32-N) direcciones. /24 es 2^8 = 256. /16 es 2^16 = 65536. Halveas la longitud del prefijo cada paso, doblas el tamaño de red.
Rangos de IP privada
RFC 1918 define tres rangos de IPv4 no routeables en internet pública. Cualquiera puede usarlos en su red interna sin coordinación:
| Rango | Tamaño | Uso típico |
|---|---|---|
| 10.0.0.0/8 | 16,7M direcciones | Redes corporativas grandes, VPCs cloud |
| 172.16.0.0/12 | 1M direcciones (172.16.0.0 - 172.31.255.255) | Redes medianas, default de Docker |
| 192.168.0.0/16 | 65K direcciones | Redes de casa, oficinas pequeñas |
Otros dos a conocer:
127.0.0.0/8es loopback.127.0.0.1es “esta máquina”;::1es su equivalente IPv6.169.254.0.0/16es link-local (APIPA en Windows, usado por servicios metadata de instancias cloud:169.254.169.254es metadata de AWS/GCP/Azure).
Si tu aplicación recibe un request desde una dirección 10.*, 172.16-31.*, o 192.168.*, el cliente está en red privada. El tráfico de internet no puede llegar directamente a esas direcciones sin NAT.
Aritmética CIDR que sí necesitas
Tres operaciones cubren el 95% del trabajo real con CIDR.
¿Está esta IP en esta red? Pon a cero los bits de host de la IP y compara con la dirección de red.
import ipaddress
# ¿Está 192.168.1.100 en 192.168.1.0/24?
network = ipaddress.ip_network("192.168.1.0/24")
ip = ipaddress.ip_address("192.168.1.100")
ip in network # True
# ¿Está 10.0.5.5 en algún rango privado?
privates = [
ipaddress.ip_network("10.0.0.0/8"),
ipaddress.ip_network("172.16.0.0/12"),
ipaddress.ip_network("192.168.0.0/16"),
]
any(ipaddress.ip_address("10.0.5.5") in n for n in privates)
# True
¿Cuántos hosts caben en esta subred? 2^(32-prefijo) - 2. Memoriza /24 (254), /16 (65534), /8 (16,7M), e interpola.
Dividir una subred en piezas más pequeñas. Una /24 contiene dos /25s, cuatro /26s, ocho /27s, dieciséis /28s, etc. — cada subred a nivel /N se divide en 2^(M-N) subredes de prefijo M. Los wizards VPC cloud y herramientas de subnetting lo manejan por ti.
Patrones VPC y security group
En AWS, GCP, Azure o cualquier VPC cloud, el layout canónico es:
- Un CIDR VPC tipo
10.0.0.0/16(65K direcciones totales). - Subredes dentro tipo
10.0.1.0/24(254 usables) por zona de disponibilidad. - Reglas de security group escritas en CIDR: “permitir puerto 443 desde
0.0.0.0/0” significa desde todo internet; “permitir puerto 5432 desde10.0.0.0/16” significa solo desde dentro del VPC.
Tres reglas para evitar errores comunes:
- No superpongas CIDRs. Si tu VPC es
10.0.0.0/16y quieres peerear con otro VPC en10.0.0.0/16, no se van a hablar — los rangos chocan. Elige rangos no superpuestos desde el principio. - No uses
/0en una regla de security group a no ser que quieras decir “todo internet”. Error común: “permitir puerto 22 desde0.0.0.0/0” en SSH. Eso es SSH público al mundo. Probablemente solo quieres0.0.0.0/0en puerto 443 para un load balancer público. - Reserva suficiente espacio para crecer. Un VPC /16 parece mucho hasta que levantas EKS con miles de pods necesitando cada uno una IP. La mayoría de cloud providers recomiendan empezar con /16 o /18 para VPCs productivas.
Firewalls, rate limiting y matching por prefijo
Una regla de firewall, un rate limit o un match de geolocalización contra una IP es una pregunta CIDR. Tres patrones:
- IP individual: CIDR
/32. Útil para permitir una IP admin concreta. - Rango pequeño:
/24o/29para una oficina o edge de un cloud provider. - Nivel país o provider:
/16,/12, o incluso más grande, desde una BD GeoIP o los rangos publicados de un proveedor.
Matchear una IP entrante contra una lista de CIDRs es operación estándar. Las librerías la implementan con árbol (trie) para lookup O(log n) por request. No lo hagas con scan lineal contra millones de rangos.
IPv6 en un párrafo
IPv6 son 128 bits en vez de 32. CIDR funciona igual: 2001:db8::/32 es un /32 en IPv6, conteniendo 2^96 direcciones. Las privadas viven en fc00::/7 (unique local). ::1 es loopback. Casi todo el modelo mental se traslada; los números solo se vuelven más grandes. Los VPCs cloud modernos defaultean cada vez más a dual-stack (IPv4 + IPv6).
Tres comandos que se ganan su sitio
# Listar interfaces con sus IPs y CIDRs
ip addr show
# O en macOS:
ifconfig
# Ver la tabla de rutas (qué CIDR va por dónde)
ip route show
# O:
netstat -rn
# DNS inverso para una IP
dig -x 8.8.8.8 +short
# → dns.google.
Para la referencia shell que va con estos, mira el linux cheatsheet y el bash cheatsheet.
Conclusiones
CIDR es dirección/prefijo — los primeros N bits son red, el resto host. /24 son 256 direcciones, /16 son 65K, /8 son 16,7M; halvea el prefijo, dobla la red. Los rangos privados son 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16. Usa CIDR en firewalls y security groups con intención; nunca escribas 0.0.0.0/0 en un puerto interno.