# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Subnetting y cálculo de netmask desde línea de comandos


Si se os da tan mal como a mí el cálculo de subredes o simplemente queréis una herramienta rápida para hacerlo aquí tenéis ipcalc o sipcalc. A través de este comando podremos calcular subredes directamente desde la línea de comandos. La principal diferencia entre ambos es que sipcalc acepta IPV6 y permite subnetting.

Para instalarlos utilizamos los gestores de paquetes correspondientes, apt, yum…

$ sudo apt-get install ipcalc
$ sudo yum install ipcalc

Nota: en RHEL y CentOS hay que activar el repositorio rpmforge.

La utilización es bien sencilla, podemos pasar como parámetro la subred en formato CIDR y nos devuelve toda la información de la misma, máscara, red, nº de hosts, etc:

$ ipcalc 10.0.0.0/24
Address:   10.0.0.0             00001010.00000000.00000000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   10.0.0.0/24          00001010.00000000.00000000. 00000000
HostMin:   10.0.0.1             00001010.00000000.00000000. 00000001
HostMax:   10.0.0.254           00001010.00000000.00000000. 11111110
Broadcast: 10.0.0.255           00001010.00000000.00000000. 11111111
Hosts/Net: 254                   Class A, Private Internet

IPV6 con sipcalc:

$ sipcalc 2001:DB8::/24
-[ipv6 : 2001:DB8::/24] - 0

[IPV6 INFO]
Expanded Address	- 2001:0db8:0000:0000:0000:0000:0000:0000
Compressed address	- 2001:db8::
Subnet prefix (masked)	- 2001:d00:0:0:0:0:0:0/24
Address ID (masked)	- 0:b8:0:0:0:0:0:0/24
Prefix address		- ffff:ff00:0:0:0:0:0:0
Prefix length		- 24
Address type		- Aggregatable Global Unicast Addresses
Network range		- 2001:0d00:0000:0000:0000:0000:0000:0000 -
			  2001:0dff:ffff:ffff:ffff:ffff:ffff:ffff

Otra característica interesante es la posibilidad de sipcalc de especificar una red y hacer subneting con ella, si por ejemplo queremos dividir un /21 en redes /22 o /24:

$ sipcalc -s24 10.0.0.0/21
-[ipv4 : 10.0.0.0/21] - 0

[Split network]
Network			- 10.0.0.0        - 10.0.0.255
Network			- 10.0.1.0        - 10.0.1.255
Network			- 10.0.2.0        - 10.0.2.255
Network			- 10.0.3.0        - 10.0.3.255
Network			- 10.0.4.0        - 10.0.4.255
Network			- 10.0.5.0        - 10.0.5.255
Network			- 10.0.6.0        - 10.0.6.255
Network			- 10.0.7.0        - 10.0.7.255

-
$ sipcalc -s22 10.0.0.0/21
-[ipv4 : 10.0.0.0/21] - 0

[Split network]
Network			- 10.0.0.0        - 10.0.3.255
Network			- 10.0.4.0        - 10.0.7.255

Si revisáis la ayuda del comando encontraréis otras posibilidades de interés.

Escanear rango de Ips


Existen muchas formas de escanear desde shell un rango de IPs o subnet, por ejemplo con nmap o creando un script en bash, perl, etc. No obstante aquí va una forma sencilla que he encontrado en Shell Fu:

for IP in 192.168.1.{1..10}; do if ping $IP -c 1 > /dev/null; then echo $IP alive; else echo $IP dead; fi; done

Y la salida (escaneo desde la 192.168.1.1 a 192.168.1.10

~$ for IP in 192.168.1.{1..10}; do if ping $IP -c 1 > /dev/null; then echo $IP alive; else echo $IP dead; fi; done
192.168.1.1 alive
192.168.1.2 dead
192.168.1.3 dead
192.168.1.4 dead
192.168.1.5 dead
192.168.1.6 dead
192.168.1.7 dead
192.168.1.8 dead
192.168.1.9 dead
192.168.1.10 dead