==== Convert your Raspberry Pi into a Router ====
\\
Today we are going to **convert our raspberry pi** into an effective **router** to create a new local subnet where we can safely host our servers and their services.\\
The device we are going to use is a **Raspberry Pi 3b model** with latest Raspbian installed, but **any device** with *nix, an **ethernet adapter** and 1 free **usb slot** (either 2.0, 3.0, usb c, micro usb) with **usb-to-ethernet support** compiled, should work (most systems have this compiled by default, so it should not be a problem). \\
\\
=== THINGS YOU WILL NEED: ===
a **small device** (in this case a Pi), a **usb-to-ethernet** cable (to create a new physical address), a **switch** (in case you want to extend your connections), **ethernet cables** (with different sizes, depends on your setup)\\
=== THINGS YOU COULD NEED: ===
a **usb hub** just in case your device only has 1 usb slot.
\\
=== Let's get things started! ===
- **Connect** the your small device to a **working router** (any router with internet access would do the work), connect it using the **onboard ethernet adapter**. In this case the gateway **interface will be eth0**
- Connect your **usb-to-ethernet** dongle to any free usb slot on your device.
- You should see a **new interface** (`ip addr`), our subnet **will be on eth1**. If you don't see the new interface, make sure your **system supports usb-to-ethernet**)
- Connect a **small ethernet cable** from the usb-to-ethernet to a **switch** (for providing networking to other devices)
I highly recommend you do this operations on a physical screen
connected to your device, and a usb keyboard.
Some operations over SSH could make you lose access.
I also recommend you to **remove** network-manager, netplan, or any **networking auto-configuration software**, as our server will be **configured statically** in a way that is **supported by most *nix systems**.\\
\\
Start by installing `isc-dhcp-server` package, which is a **dhcp server** so we can automatically **assign ips to our local sub-network** on eth1.
apt-get install isc-dhcp-server
\\
Modify **/etc/default/isc-dhcp-server** to tell isc-dhcp-server to use **your eth1 interface**. You can uncomment the ipv6 line if you need ipv6 on your local network (which usually is not required).
vim /etc/default/isc-dhcp-server
# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)
# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf
# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid
# Additional options to start dhcpd with.
# Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eth1"
#INTERFACESv6="eth1"
We will be using the **192.168.2.0/24 network** for our new subnet, but you can use **anyone you want**!\\
Modify our dhcpd configuration on **/etc/dhcp/dhcpd.conf**
vim /etc/dhcp/dhcpd.conf
# time in seconds, setup to your needs
default-lease-time 600;
max-lease-time 7200;
# 192.168.2.0/24
subnet 192.168.2.0 netmask 255.255.255.0 {
authoritative;
# the range of ips to give to clients
# set at your own needs
range 192.168.2.2 192.168.2.254;
# i guess this can be omitted
option subnet-mask 255.255.255.0;
# this is important i guess
option broadcast-address 192.168.2.255;
# we are going to be 192.168.2.1, the router
option routers 192.168.2.1;
# you will be the dns server too
option domain-name-servers 192.168.2.1;
# otherwise, you can simply not configure a dns server and use any other
#option domain-name-servers 1.1.1.1;
}
# an example of dhcp reservation by mac address
host adevicename {
hardware ethernet 01:23:45:6a:bc:de;
fixed-address 192.168.2.130; # .130 is just an example
}
Set yourself (the router) a **static ip address**:
ifconfig eth1 up
ip addr add 192.168.2.1/24 dev eth1
Configure iptables to **route traffic** from **eth1 to eth0 and viceversa**:
# postrouting to our gateway interface eth0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# this should in theory, block incoming packets that were not established first
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
# enable ip forwarding if you haven't done yet
echo 1 > /proc/sys/net/ipv4/ip_forward
To finish the setup, **restart the isc-dhcp-server**
systemctl restart isc-dhcp-server
\\
=== Setup a DNS Server (Highly recommended) ===
We will be using **dnsmasq** as our DNS Server, because it is very easy to install and configure.
apt-get install dnsmasq
Configure the dns server:
vim /etc/dnsmasq.conf
# bind on custom interface or ip
#except-interface=lo
#bind-interfaces
#listen-address=192.168.2.1
# log dns queries and dhcp requests
#log-queries
#log-dhcp
# expand /etc/hosts hosts to your dns
expand-hosts
# forward dns request to this ip
# when you can't resolve an address
server=1.1.1.1
# if omitted, dnsmasq will use resolvconf to return
# the dns configuration inherited by the dhcp server
Restart the **dnsmasq** server
systemctl restart dnsmasq
\\
=== Connect your server or laptop to the switch you've configured earlier, and wollah! ===
==== Enjoy! ====