Showing posts with label networking. Show all posts
Showing posts with label networking. Show all posts

Thursday, September 4, 2014

Zen Load Balancer 3.0.3 Perfomance and Security Customization Part 4

Time to fine-tune our IP stack:

root@zen-lb:~# vi /etc/sysctl.conf
# Performance:
# Turn down swappiness, 0 means no swap on modern kernels, number is percent of free system memory swap will kick in.
vm.swappiness = 2
# Contains, as a percentage of total system memory, the number of pages at which a process which is generating disk writes will start writing out dirty data.
# Defaults to 10 (percent of RAM). Consensus is that 10% of RAM when RAM is say half a GB (so 10% is ~50 MB) is a sane value on spinning disks, but it can be MUCH worse when RAM is larger, say 16 GB (10% is ~1.6 GB), as that's several seconds of writeback on spinning disks. A more sane value in this case is 3 (16*0.03 ~ 491 MB).
vm.dirty_ratio = 3
# Contains, as a percentage of total system memory, the number of pages at which the background kernel flusher threads will start writing out dirty data.
# Defaults to 5 (percent of RAM). It may be just fine for small memory values, but again, consider and adjust accordingly for the amount of RAM on a particular system.
vm.dirty_background_ratio = 2
# Will not change the number of System V IPC message queue resources allowed
# Will not change Kernel semaphores (kernel.sem [semmsl semmns semopm semmni], kernel.shmmax and kernel.shmmin)

# Network Performance:
# Turn off TCP prequeue processing
net.ipv4.tcp_low_latency = 1
# Reuse time-wait sockets, better than recycling
net.ipv4.tcp_tw_reuse = 1
# Fast recycling TIME-WAIT sockets using recycling rather than reusing. Default value is 0. It should not be changed without advice/request of technical experts.
net.ipv4.tcp_tw_recycle = 0
# Maximum time-to-live of entries. Unused entries will expire after this period of time if there is no memory pressure on the pool.
net.ipv4.inet_peer_maxttl = 5
# How often to send out keepalive messages when keepalive is enabled. Default is 7200 seconds.
net.ipv4.tcp_keepalive_time = 512
# How frequent probes are retransmitted, when a probe isn't acknowledged. Default is 75 seconds
net.ipv4.tcp_keepalive_intvl = 15
# Number of keepalive probes to send until the server decides that the connection is broken.
net.ipv4.tcp_keepalive_probes = 5
# Number of outstanding syn requests allowed. This setting tells the system when to start using syncookies. When you have more TCP connection requests in your queue than this number, the system will start using syncookies. Note that syncookies can have an impact on performance.
net.ipv4.tcp_max_syn_backlog = 36000
# Size of the listen queue
net.core.somaxconn = 36000
# Maximum number of timewait sockets held by the system simultaneously.
net.ipv4.tcp_max_tw_buckets = 100000
# Increase TCP default and max receive/send buffer size
net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216
# Same for UDP
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
# Increase the maximum amount of option memory buffers
net.core.optmem_max= 20480
# Increase Linux autotuning TCP receive/send buffer limit
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Increase the length of the packets queue waiting on an interface until the kernel is ready to process them
# The backlog of pending connections allows the server to hold connections it’s not ready to accept, and this allows it to withstand a larger slow HTTP attack, as well as gives legitimate users a chance to be served under high load. However, a large backlog also prolongs the attack, since it backlogs all connection requests regardless of whether they’re legitimate. If the server supports a backlog, I recommend making it reasonably large to so your HTTP server can handle a small attack.
net.core.netdev_max_backlog = 30000
# This setting determines the time that must elapse before TCP/IP can release a closed connection and reuse its resources.
net.ipv4.tcp_fin_timeout = 30
# Turn connection accounting on
net.netfilter.nf_conntrack_acct = 1
# Maximum number of tracked connections, the toll is 300-350 bytes of unswapped RAM per connection. Hash table should accordingly be hashsize = conntrack_max / 8, that why the options ip_conntrack hashsize=25000 and options nf_conntrack hashsize=25000 in modprobe.conf
net.ipv4.netfilter.ip_conntrack_max = 200000
# Dynamically-assigned ports range; bear in mind that in theory IANA has officially designated the range 49152 - 65535 for dynamic port assignment. The default linux range for modern kernels is 32768 - 61000.
net.ipv4.ip_local_port_range = 10000 65535
# Now that we've increased the ports, we need to increase the number of file handlers as well. This parameter should be at least as twice big as the number of network connections you expect to support. We should also change the number of max number of open files a user can have in /etc/security/limits.conf.
fs.file-max = 1048576
# Increase the number of allowed mmapped files
vm.max_map_count = 1048576
# This setting determines the number of SYN+ACK packets sent in part 2 of a 3-way-handshake before the kernel gives up on the connection. Default is 5.
net.ipv4.tcp_synack_retries = 3
# Number of times initial SYNs for a TCP connection attempt will be retransmitted. This is only the timeout for outgoing connections. Default is 5.
net.ipv4.tcp_syn_retries = 3
# This defines how often an answer to a TCP connection request is retransmitted before it gives up. This is only the timeout for incoming connections. Default is 3.
net.ipv4.tcp_retries1 = 3
# Determines how the TCP stack should behave for memory usage; each count is in memory pages (typically 4KB).
net.ipv4.tcp_mem = 50576 64768 98152
#net.ipv4.tcp_mem = 128000 200000 262144 # Use this for 1Gb+ connections
# The TCP window scale option is an option to increase the receive window size allowed in TCP above its former maximum value of 65535 bytes. See IETF RFC 1323.
# Linux kernels from 2.6.8 have enabled TCP Window Scaling by default
net.ipv4.tcp_window_scaling = 1
# How may times to retry before killing TCP connection, closed by our side. Default 0.
net.ipv4.tcp_orphan_retries = 0
# Security:
# Debian does not have kernel.exec-shield, check that you have NX (Execute Disable) protection: active with dmesg | grep protection. To have NX protection, your BIOS, your CPU, your OS must support it and you must have a 32-bit PAE or 64 bit kernel (NX bit works on the 63rd bit of the address)
#kernel.exec-shield = 1
# Turn on protection and randomize stack, vdso page and mmap + randomize brk base address.
kernel.randomize_va_space = 2
# tcp_syncookies with appropriate tcp_synack_retries and tcp_max_syn_backlog can mitigate SYN flood attacks. Note That without SYN cookies, a much larger value for tcp_max_syn_backlog is required. Default is 1.
net.ipv4.tcp_syncookies = 1
# Protect against tcp time-wait assassination hazards
net.ipv4.tcp_rfc1337 = 1
# Timestamps can provide security by protecting against wrapping sequence numbers (at gigabit speeds) but they also allow uptime detection. Definitely enable for Gb+ speeds, up to the admin to decide what to do for slower speeds.
# 1 is the default value but it has some overhead, use 0 for slightly better performance.
net.ipv4.tcp_timestamps = 0
#net.ipv4.tcp_timestamps = 1 # Use this for 1Gb+ connections
# Source address verification, helps protect against spoofing attacks.
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1    
# Usually, we'd want to disable IP forwarding but our LB is also a router so no choice here:
net.ipv4.ip_forward = 1
# Log martian packets
# This is a router, it will receive martians all the time, better turn this off. Otherwise, we'd want to turn this on.
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.log_martians = 0   
# Ignore echo broadcast requests to prevent being part of smurf attacks (default)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Ignore *all* echo requests, including on localhost (default 0). Enabling it is paranoid really.
net.ipv4.icmp_echo_ignore_all = 0
# Ignore bogus icmp errors (default)
net.ipv4.icmp_ignore_bogus_error_responses = 1
# IP source routing (insecure, disable it) (default)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0 
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
# Send redirects: Usually, we'd want to disable it but we're a LB aka router:
net.ipv4.conf.all.send_redirects = 1
net.ipv4.conf.default.send_redirects = 1
# ICMP only accept secure routing redirects (we could deny redirects altogether actually).
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0 
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0 
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.default.secure_redirects = 1
# Disable IPv6 router solicitations:
net.ipv6.conf.default.router_solicitations = 0
# Do not accept Router Preference in RA
net.ipv6.conf.default.accept_ra_rtr_pref = 0
# Do not learn Prefix Information in Router Advertisement
net.ipv6.conf.default.accept_ra_pinfo = 0
# Will not accept Hop Limit settings from a router advertisement
net.ipv6.conf.default.accept_ra_defrtr = 0
# Do not assign a global unicast address to an interface according to router advertisements
net.ipv6.conf.default.autoconf = 0
# Do not send neighbor solicitations
net.ipv6.conf.default.dad_transmits = 0
# Only one global unicast IPv6 address per interface
net.ipv6.conf.default.max_addresses = 1
# And after all this, we disable IPv6 awwww :(                  
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1


If you have memore to spare, you can use replace these corresponding settings with:

.... 
net.core.rmem_max=1677721600
net.core.rmem_default=167772160
net.core.wmem_max=1677721600
net.core.wmem_default=167772160
net.core.optmem_max= 2048000
....
net.ipv4.tcp_rmem= 1024000 8738000 1677721600
net.ipv4.tcp_wmem= 1024000 8738000 1677721600
net.ipv4.tcp_mem= 1024000 8738000 1677721600
net.ipv4.udp_mem= 1024000 8738000 1677721600
....


Monday, August 18, 2014

Zen Load Balancer 3.0.3 Perfomance and Security Customization Part 3

Time to do a little network tweaking.

Increase our iptables connection tracking numbers:

ipt_recent parameters:

Note that by default these values are used by ipt_recent module:
ip_list_tot=100     Number of addresses remembered per table
ip_pkt_list_tot=20     Number of packets per address remembered
ip_list_hash_size=0     Hash table size. 0 means to calculate it based on ip_list_tot, default: 512
ip_list_perms=0644     Permissions for /proc/net/ipt_recent/* files
 
root@zen-lb:~# vi /etc/modprobe.d/ipt_recent.conf
options ipt_recent ip_list_tot=3000 ip_pkt_list_tot=100
options xt_recent ip_list_tot=3000 ip_pkt_list_tot=100
options ip_conntrack hashsize=25000
options nf_conntrack hashsize=25000

In some kernels, ipt_recent is xt_recent and ip_conntrack is nf_conntrack, so I've included them all. It won't hurt, but you may get a warning when your system is running about it.

root@zen-lb:~# iptables -F
root@zen-lb:~# modprobe -r ipt_recent
root@zen-lb:~# modprobe ipt_recent  
root@zen-lb:~# modprobe -r xt_recent
root@zen-lb:~# modprobe xt_recent
root@zen-lb:~# modprobe xt_recent
root@zen-lb:~# cat /sys/module/xt_recent/parameters/ip_list_tot
3000
root@zen-lb:~# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
100

Cool. It worked. Let's get to our iptables rules. Don't forget that your load balancer is a router, so we're going to start off with NAT. We assume that eth0 is our external interface.

root@zen-lb:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Now, we create two new iptables tables. One to log and drop illegal packets and another for rate limiting purposes. The latter is especially useful if we have a webserver running.

root@zen-lb:~# iptables -N LOGDROP
root@zen-lb:~# iptables -N RATELIMIT

Our "always accept from the loopback interface" and "always accept related and established connections" rules follow:

root@zen-lb:~# iptables -A INPUT -i lo -j ACCEPT
root@zen-lb:~# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

OK, time to separate the wheat from the chaff. Disallow any type of invalid packets by sending them to our new table, LOGDROP:

root@zen-lb:~# iptables -A INPUT -m state --state INVALID -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j LOGDROP
root@zen-lb:~# iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOGDROP

Following this, we should add any hosts we trust, such as incoming connections from your VPN and generally any incoming connections that you don't want to add to your rate limit:

root@zen-lb:~# iptables -A INPUT -s 172.16.200.0/24 -j ACCEPT

Now, assuming that we have a webserver running, I am going to allow access to ports 80 (http) and 443 (https). This is not complete access as you can see, as any new connection goes to my RATELIMIT.

root@zen-lb:~# iptables -A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -j RATELIMIT

Next, we can add some new trusted connections but this time, not completely trusted. Say some partners. We want them to be actually rate limited, just in case.

root@zen-lb:~# iptables -A INPUT -s 192.168.200.0/24 -j ACCEPT

Now, we'll add ports 80 and 443 once again. Why? Well, if our client hasn't hit our rate limit, they're going to return from our RATELIMIT chain, so we want to accept that.

root@zen:~# iptables -A INPUT -m tcp -p tcp --dport 80 -j ACCEPT
root@zen-lb:~# iptables -A INPUT -m tcp -p tcp --dport 443 -j ACCEPT

And the obligatory "if it doesn't fit any of our aforementioned rules, kill it with fire":

root@zen-lb:~# iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

Now, once again, our load balancer is a router so we need to enable IP forwarding on it. BUT, for security purposes what we'll do is that we'll only allow it to forward packets from our network to specific hosts, such as NTP, DNS, apt-get and yum update servers. In this example, we assume that the subnets behind our load balancer are the 172.16.104.0/22 and the 172.16.108/24 ones.

root@zen-lb:~# iptables -A FORWARD -s 172.16.104.0/22,172.16.108.0/24 -d 8.8.8.8,8.8.4.4 -j ACCEPT #DNS
root@zen-lb:~# iptables -A FORWARD -s 172.16.104.0/22,172.16.108.0/24 -d 62.1.38.19,62.1.38.25,140.211.169.197,152.19.134.146,66.35.62.166,66.135.62.201,209.132.181.16,67.203.2.67,85.236.55.6,213.175.193.206,195.154.241.117,74.121.199.234 -j ACCEPT #Oracle Linux, EPEL, Remi and Percona Update Servers
root@zen-lb:~# iptables -A FORWARD -s 172.16.104.0/22,172.16.108.0/24 -d 193.93.167.241,79.107.99.220,83.212.114.205,193.239.214.226,83.212.118.71,193.164.227.145,194.177.210.54,83.212.96.50 -j ACCEPT #Red Hat NTP Servers
root@zen-lb:~# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
root@zen-lb:~# iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited

Anything that originates from our network should be allowed:

root@zen-lb:~# iptables -A OUTPUT -j ACCEPT

Our LOGDROP chain:

root@zen-lb:~# iptables -A LOGDROP -j LOG --log-prefix "INVALID PACKET:"
root@zen-lb:~# iptables -A LOGDROP -j DROP

And finally our RATELIMIT chain:

root@zen-lb:~# iptables -A RATELIMIT -m recent --set --name RATELIMIT --rsource
root@zen-lb:~# iptables -A RATELIMIT -m recent --rcheck --seconds 5 --hitcount 80 --name RATELIMIT --rsource -j LOG --log-prefix "EXCEEDED RATE:"
root@zen-lb:~# iptables -A RATELIMIT -m recent --rcheck --seconds 5 --hitcount 80 --name RATELIMIT --rsource -j DROP

As you can see, this is extremely liberal. It needs 80 new connections attempts every 5 seconds from the same IP address to start dropping packets. You need to tweak the values according to the needs of your webserver.

Let's make the changes permanent:

root@zen-lb:~# iptables-save > /etc/iptables.up.rules
root@zen-lb:~# vi /etc/init.d/iptables_fw
#!/bin/sh
### BEGIN INIT INFO
# Provides:          iptables_init
# Required-Start:    $local_fs $network
# Required-Stop:
# Default-Start:     2 3 4 5 
# Default-Stop:      0 1 6
# Short-Description: Firewall script
# Description:       Start iptables-based firewall
### END INIT INFO
#
iptables-restore < /etc/iptables.up.rules
 
root@zen-lb:~# iptables-restore < /etc/iptables.up.rules
root@zen-lb:~# chmod 755 /etc/init.d/iptables_fw
root@zen-lb:~# iptables -F
root@zen-lb:~# service iptables_fw start
root@zen-lb:~# update-rc.d iptables_fw defaults

And finally, tell to the kernel that it should allow forwarding as well:

root@zen-lb:~# echo "1" > /proc/sys/net/ipv4/ip_forward
root@zen-lb:~# vi /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1


Friday, June 6, 2014

Subnetting made easy Part 2

Class A:
0.0.0.0     - 127.255.255.255 default subnet mask: 255.0.0.0 (or /8, 8 network bits and 24 host bits)
Class B:
128.0.0.0 - 191.255.255.255 default subnet mask: 255.255.0.0 (or /16, 16 network bits and 16 host bits)
Class C:
192.0.0.0 - 223.255.255.255 default subnet mask: 255.255.255.0 (or /24, 24 network bits and 8 host bits)
Class D: (Used for multicasting, not used for IP addressing)
224.0.0.0 - 239.255.255.255
Class E: (Unused)
240.0.0.0 - 255.255.255.255

Subnetting based on the number of hosts:

Example A:

Say that our assigned network is 213.213.213.0 and we need to divide it into networks that have 30 hosts each.

Let's consult a table for our decimal to binary conversion to find what 30 is in binary. We work with 8 bits and we start from 0, so we work from 20 to 27:

2726252423222120
1286432168421
00011110

That means we need 5 bits to represent number 30 (24 is the 5th bit, we start from 0) and therefore we need 5 bits for our hosts. 52=32, and the number of the actual usable hosts is 52-2=30.

213.213.213.0 is a Class C network.

Class C subnet mask: 255.255.255.0 (/24) or in binary:   11111111 11111111 11111111 00000000

Our subnet mask will be the default mask with the number of network bits that we will need to have in order to have the number of hosts we desire.

Class C subnet mask: 11111111 11111111 11111111 00000000
                                                                                  ^^^ we need 5 host bits, so we'll need to turn the last 5 bits to 0; the rest will be assigned as network bits by turning them to 1.                    

Our     subnet mask: 11111111 11111111 11111111 11100000
 In other words     :      255          255       255           224   (/27, since we have 27 network bits enabled)

So now, the number of our hosts will be the remaining host bits. In our case 32. The network bits are 3, so 23=8 networks.

The number of usable hosts in our network though will be the remaining host bits minus the network
address and the broadcast address, so 2 to the power of our remaining host bits minus 2.

So, in our case 25-2=32-2=30. We will have 30 hosts -exactly as many as we needed- in 8 networks.

A faster way to find this number is with what Cisco refers to as the interesting part. The interesting part is
the part of the subnet mask which is not 255. We subtract this number from 256 and that will be our IP address increment.

This in our case is the fourth part of the IP address. Also, In our case, 256-224=32.

So our first IP allocation will be 213.213.213.32. Just write the increments and fill the spaces in-between.

213.213.213.0
213.213.213.32
213.213.213.64
213.213.213.96
etc.
So our network is:

213.213.213.0 - 213.213.213.31
213.213.213.32 - 213.213.213.63
213.213.213.64 - 213.213.213.95
etc.
.....

Example B:

We are given the network 130.130.0.0 and we want to divide it into networks with 600 hosts each.

Let's consult a table for our decimal to binary conversion to find how 600 is represented:

The sum of our 8-bit table (128 to 1) amounts to 255 (obviously). 8 bits are not enough. We need more entries:

5122561286432168421
1001011000


So we need 10 bits for our hosts. 102-2=1024 number of hosts, 1022 usable hosts.

This is a Class B network so its network mask looks like this:

11111111 11111111 00000000 00000000


We need 10 host bits, so we'll need to turn the last 10 bits to 0; the rest will be assigned as network bits by turning them to 1. And now our netmask looks like this:

11111111 11111111 11111100 00000000 (/22)
   255          255           252          0

As we already said, we need 10 bits for our hosts. 102-2=1024 number of hosts, 1022 usable hosts.
The network bits are 6, so 26=64 networks.

256-252=4. So this is our network:

130.130.0.0
130.130.4.0
130.130.8.0
etc.

and our IP ranges are:

130.130.0.0 - 130.130.3.255
130.130.4.0 - 130.130.7.255
etc.
.....

Example C:

We have the network 10.0.0.0 and we want to split it into networks with 96 hosts each.

Let's consult a table for our decimal to binary conversion to find how 96 is represented:

12864.................
01.................

No need to calculate any more, we are sure that this is the correct bit, we go over after that
So we need 7 bits for our hosts. 27=128 hosts, 128-2=126 usable addresses.

This is a Class A network so its netmask looks like ths:

11111111 00000000 00000000 00000000

We need to have 7 host bits, so our netmask should look like this:

11111111 11111111 11111111 10000000 (/25)
   255           255         255         128

So 27=128 hosts, 128-2=126 usable addresses, 217=131072 networks.

256-128=128. Our IP ranges are:

10.0.0.0 - 10.0.0.127
10.0.0.128 - 10.0.0.255
10.0.1.0 - 10.0.1.127
etc.

Now that we've gone through the basics and learned how to subnet, we need to note:
It's always a good idea to add one when trying to subnet based on hosts just in case our number is on a binary calculation boundary (e.g. 128,64,32,16,8,4,2,1).

Let's go over an example again with our new method:

Say that our assigned network is 213.213.213.0 and we need to divide it into networks that have 32 hosts each.

We need to add one so instead of calculating for 32, we calculate for 32+1=33:

Let's consult a table for our decimal to binary conversion to find what 33 is in binary.

1286432168421
00100001

We need 6 bits to represent number 33. 62=36, and the number of the actual usable hosts is 62-2=34.

213.213.213.0 is a Class C network.

Class C subnet mask: 255.255.255.0 (/24) or in binary:   11111111 11111111 11111111 00000000

Our subnet mask will be the default mask with the number of network bits that we will need to have in order to have the number of hosts we desire.

Class C subnet mask: 11111111 11111111 11111111 00000000
                                                                                                     
Our subnet mask:       11111111 11111111 11111111 11000000
In other words:             255          255          255         192   (/26, since we have 26 network bits enabled)

The network bits are 2, so 22=4 networks.

The number of usable hosts in our network will be the remaining host bits minus the network address and the broadcast address, so 2 to the power of our remaining host bits minus 2. As calculated earlier, 62=36, and the number of the actual usable hosts is 62-2=34.


This in our case is the fourth part of the IP address. Also, In our case, 256-192=64.

So our first IP allocation will be 213.213.213.64. Just write the increments and fill the spaces in-between.

213.213.213.0
213.213.213.64
213.213.213.128
213.213.213.192

So our network is this:

213.213.213.0 - 213.213.213.63
213.213.213.64 - 213.213.213.127
213.213.213.128 - 213.213.213.191
213.213.213.192 - 213.213.213.255

If we had done the calculation without adding one, we would have provisioned for 30 hosts (5 bits,25=32,30 usable hosts)

Sunday, May 25, 2014

Subnetting made easy Part 1

Class A:
0.0.0.0     - 127.255.255.255 default subnet mask: 255.0.0.0 (or /8, 8 network bits and 24 host bits)
Class B:
128.0.0.0 - 191.255.255.255 default subnet mask: 255.255.0.0 (or /16, 16 network bits and 16 host bits)
Class C:
192.0.0.0 - 223.255.255.255 default subnet mask: 255.255.255.0 (or /24, 24 network bits and 8 host bits)
Class D: (Used for multicasting, not used for IP addressing)
224.0.0.0 - 239.255.255.255
Class E: (Unused)
240.0.0.0 - 255.255.255.255

Subnetting based on the number of networks:

Example A:

Say that our assigned network is 213.213.213.0 and we need to divide it into 5 networks.

Let's consult a table for our decimal to binary conversion to find what 5 is in binary. We work with 8 bits and we start from 0, so we work from 20 to 27:

27 26 25 24 23 22 21 20
128 64 32 16 8 4 2 1
0 0 0 0 0 1 0 1

That means we need 3 bits to represent number 5 (22 is the 3rd bit, we start from 0). That also means we need to borrow 3 host bits for our network.

That means that in reality we will have 23=8 networks.

Class C subnet mask: 255.255.255.0 (/24) or in binary:   11111111 11111111 11111111 00000000
Our subnet mask will be the default mask with the number of host bits that we are required to borrow. In our case, we need to borrow 3 host bits and move them as network bits. Note that we always borrow the first available network bits, so:                  

Our  subnet mask:      11111111 11111111 11111111 11100000
In other words     :           255         255         255           224   (/27, since we have 27 network bits enabled)

So now, the number of our hosts will be the remaining host bits. In our case 32.
The number of usable hosts in our network though will be the remaining host bits minus the network address and the broadcast address, so 2 to the power of our remaining host bits minus 2.

So, in our case (25)-2=32-2=30. We will have 30 hosts in 8 networks.

A faster way to find this number is with what Cisco refers to as the interesting part. The interesting part is
the part of the subnet mask which is not 255. We subtract this number from 256 and that will be our IP address increment.

This in our case is the fourth part of the IP address. So, In our case, 256-224=32.

Another way to find our IP address increment is to find out the least number where "1" was put in our subnet mask (in our case that was the third place from the end) which corresponds to "32" if we do a lookup on our binary table. 

So our first IP allocation will be 213.213.213.32. Just write the increments and fill the spaces in-between.

213.213.213.0
213.213.213.32
213.213.213.64
213.213.213.96
etc.

So our network is:

213.213.213.0   - 213.213.213.31
213.213.213.32 - 213.213.213.63
213.213.213.64 - 213.213.213.95
etc.
.....

Example B:

We are given the network 130.130.0.0 and we want to divide it into 900 networks.

The sum of our 8-bit table (128 to 1) amounts to 255 (obviously). 8 bits are not enough. We need more entries:

1024 512 .................
0 1 .................

No need to calculate any more, we are sure that this is the correct bit, we go over after that.
So we need to borrow 10 host bits. 210=1024 networks.

This is a Class B network so its network mask looks like this:

11111111 11111111 00000000 00000000

So borrowing 10 host bits, our netmask looks like this:

11111111 11111111 11111111 11000000 (/26)
   255           255          255          192

256-192=64. So we have 64 hosts per network, 62 usable ones and our IP allocation
increments go like so:

130.130.130.0
130.130.130.64
130.130.130.128
etc.

Our IP ranges are:

130.130.130.0   - 130.130.130.63
130.130.130.64 - 130.130.130.127
etc.
.....

Example C:

We have the network 10.0.0.0 and we want to split it into 500 networks.

Let's consult a table for our decimal to binary conversion to find how 500 is represented:

The sum of our 8-bit table (128 to 1) amounts to 255 (obviously). 8 bits are not enough. We need one more entry:

256 128 64 32 16 8 4 2 1
1 1 1 1 1 0 1 0 0

That means that we need to borrow 9 host bits.

This is a class A address and its network mask looks like this:

11111111 00000000 00000000 00000000

So adding 9 bits makes our netmask like so:

11111111 11111111 10000000 00000000 (/17) or:
   255            255          128             0

29=512, so we have 512 networks.
256-128=128, so we have 128 hosts in total and 126 usable hosts per network,so our IP allocation increments and our ranges are the following:

10.0.0.0     - 10.0.127.255
10.0.128.0 - 10.0.255.255
10.1.0.0     - 10.1.127.255
10.1.128.0 - 10.1.255.255
10.2.0.0     - 10.2.127.255
10.2.128.0 - 10.2.255.255
.......

Now that we've gone through the basics and learned how to subnet, we need to note:
It's always a good idea to subtract one when trying to subnet based on networks just in case our number is on a binary calculation boundary (e.g. 128,64,32,16,8,4,2,1).

Let's go over an example again with our new method:

We have the network 192.168.0.0 and we need to divide it into 16 networks.

We need to subtract one so instead of calculating for 16, we calculate for 16-1=15:

128 64 32 16 8 4 2 1
0 0 0 0 1 1 1 1

We need 4 bits, so 24; that means we will have 16 networks.

Class C so:

11111111 11111111 11111111 11110000
   255           255          255          240           or /28 in CIDR notation.

And 24=16 IP addresses and 14 usable hosts. Our IP allocation is arranged by 256-240=16 increments.

192.168.0.0   - 192.168.0.15
192.168.0.16 - 192.168.0.31
192.168.0.32 - 192.168.0.63
etc.

If we had done the calculation without subtracting one, we would have provisioned for 32 networks.