Skip to content

Instantly share code, notes, and snippets.

@xero
Last active May 24, 2023 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xero/1cc1d623a472417c0665f4fab365df86 to your computer and use it in GitHub Desktop.
Save xero/1cc1d623a472417c0665f4fab365df86 to your computer and use it in GitHub Desktop.
CIDR - the CIDR block calc & cheatsheet
#!/bin/bash
# CIDR - the CIDR block calc & cheatsheet
# CC0 xero | https://x-e.ro | https://github.com/xero
usage() {
EXITCODE=0
if [ -n "$1" ] && [ "$1" -eq "$1" ] 2>/dev/null; then
EXITCODE=$1
fi
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
echo "usage: ${me} [-c|-i IP CIDR|-n IP]"
echo " [--chart] display the CIDR chart"
echo " [--in IP CIDR] checks if an ip in a given CIDR"
echo " [--netmask IP] returns the netmask of a given CIDR"
exit "$EXITCODE"
}
# check if required commands/bins exist
function isinstalled() {
builtin type -P "$1" &> /dev/null || {
echo >&2 "'$1' dependancy required"; exit 1
}
}
# print the CIDR cheatsheet
chart() {
cat << X0
Netmask Netmask (binary) CIDR Notes
_____________________________________________________________________________
255.255.255.255 11111111.11111111.11111111.11111111 /32 Host (single addr)
255.255.255.254 11111111.11111111.11111111.11111110 /31 Unuseable
255.255.255.252 11111111.11111111.11111111.11111100 /30 2 useable
255.255.255.248 11111111.11111111.11111111.11111000 /29 6 useable
255.255.255.240 11111111.11111111.11111111.11110000 /28 14 useable
255.255.255.224 11111111.11111111.11111111.11100000 /27 30 useable
255.255.255.192 11111111.11111111.11111111.11000000 /26 62 useable
255.255.255.128 11111111.11111111.11111111.10000000 /25 126 useable
255.255.255.0 11111111.11111111.11111111.00000000 /24 "Class C" 254 useable
255.255.254.0 11111111.11111111.11111110.00000000 /23 2x Class C's = 510 usable
255.255.252.0 11111111.11111111.11111100.00000000 /22 4x Class C's = 1022 usable
255.255.248.0 11111111.11111111.11111000.00000000 /21 8x Class C's = 2046 usable
255.255.240.0 11111111.11111111.11110000.00000000 /20 16x Class C's = 4094 usable
255.255.224.0 11111111.11111111.11100000.00000000 /19 32x Class C's = 8190 usable
255.255.192.0 11111111.11111111.11000000.00000000 /18 64x Class C's = 16382 usable
255.255.128.0 11111111.11111111.10000000.00000000 /17 128x Class C's = 32766 usable
255.255.0.0 11111111.11111111.00000000.00000000 /16 "Class B" 65534 usable
255.254.0.0 11111111.11111110.00000000.00000000 /15 2x Class B's = 131070 usable
255.252.0.0 11111111.11111100.00000000.00000000 /14 4x Class B's = 262142 usable
255.248.0.0 11111111.11111000.00000000.00000000 /13 8x Class B's = 524286 usable
255.240.0.0 11111111.11110000.00000000.00000000 /12 16x Class B's = 1048574 usable
255.224.0.0 11111111.11100000.00000000.00000000 /11 32x Class B's = 2097150 usable
255.192.0.0 11111111.11000000.00000000.00000000 /10 64x Class B's = 4194302 usable
255.128.0.0 11111111.10000000.00000000.00000000 /9 128x Class B's = 8388606 usable
255.0.0.0 11111111.00000000.00000000.00000000 /8 "Class A" 16777214
254.0.0.0 11111110.00000000.00000000.00000000 /7
252.0.0.0 11111100.00000000.00000000.00000000 /6
248.0.0.0 11111000.00000000.00000000.00000000 /5
240.0.0.0 11110000.00000000.00000000.00000000 /4
224.0.0.0 11100000.00000000.00000000.00000000 /3
192.0.0.0 11000000.00000000.00000000.00000000 /2
128.0.0.0 10000000.00000000.00000000.00000000 /1
0.0.0.0 00000000.00000000.00000000.00000000 /0 IP space
Net Host Total
Net Addr Addr Addr Number
Class Range NetMask Bits Bits of hosts
----------------------------------------------------------
A 0-127 255.0.0.0 /8 24 16777216 (i.e. 114.0.0.0)
B 128-191 255.255.0.0 /16 16 65536 (i.e. 150.0.0.0)
C 192-254 255.255.255.0 /24 8 256 (i.e. 199.0.0.0)
D 224-239 (multicast)
E 240-255 (reserved)
F 208-215 255.255.255.240 28 4 16
G 216/8 ARIN - North America
G 217/8 RIPE NCC - Europe
G 218-219/8 APNIC
H 220-221 255.255.255.248 29 3 8 (reserved)
K 222-223 255.255.255.254 31 1 2 (reserved)
(ref: RFC1375 & http://www.iana.org/assignments/ipv4-address-space )
( http://www.iana.org/numbers.htm )
----------------------------------------------------------
X0
}
# calcuate minimum netmask for a given ip
netmask () {
c=0 x=0$( printf '%o' ${1//./ } )
while [ "$x" -gt 0 ]; do
let c+=$((x%2)) 'x>>=1'
done
echo /$c
}
# check if ip is inside a given cidr block
inside() {
[ -z "$1" ] && usage 1
[ -z "$2" ] && usage 1
IP=$1
CIDR=$2
isinstalled nmap
if [ $(nmap -sL -n "$CIDR" | awk '/Nmap scan report/{print $NF}' | grep "$IP") ]; then
echo "true"
exit 0
else
echo "false"
exit 1
fi
}
# parse command arguments
case "$1" in
--chart|"chart"|-c)
chart
;;
--in|"in"|-i)
inside "$2" "$3"
;;
--netmask|"netmask"|-n)
netmask "$2"
;;
*)
usage
;;
esac
# EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment