In this tutorial, we will show you how to set up make an ethernet router that provides internet access to other ethernet devices using WiFi bridge,For this purpose we will be using a library called DNSMASQ which acts as both a DHCP server and DNS proxy(Don’t worry if you don’t know what these terms are. We will discuss this shortly).
Unlike our previous blog post where we jump straight to the instructions on how to do a task, we will explain why we have to make a WiFi Bridge which shares internet to the ethernet port
Objectives of creating WiFi Bridge using Raspberry PI
Giving internet connection to connected devices, especially the devices which rely on the Internet for data communication, or to send and receive data to a server is like giving oxygen to a patient. It's a life-sustaining raw material for such devices. If such devices are having an ethernet port, then you have to provide a router or modem with Broadband/Optical Fibre connectivity. This is not always an option in case you don’t want a permanent network connection, or such service providers are not available in your area.
Also, nowadays we all have an internet connection available in our mobile phones and can share the network connectivity to other wifi devices by creating wifi hotspots. But in the devices must have WiFi chip for receiving the internet service through the hotspot access which you can provide easily. Here comes our solution for the ethernet only devices. We could receive the internet connection using Raspberry Pi WiFi and share the internet from Raspberry Pi WiFi to its own ethernet port so that the devices connected to the ethernet port of Raspberry Pi also get the network connection. Also, multiple devices can also be connected using Ethernet switches. A representational diagram can be found below.
Figure here
So we can summarise the objectives as below
1 Get an internet connection to ethernet only devices, using any WiFi access point.
2 Interconnect various ethernet devices to make a cluster, for making devices even smarter.
3 Raspberry Pi, can act as a data collection terminal which stores the data temporarily from the devices and push that to the server when an internet connection is accessible through its wifi.(This requires some code running in RPI as per the requirement)
You will need to keep in mind that the speed of the shared internet may not be as good as that of a router, as there can be bandwidth limitation of WiFi, as well as the processing capability of our Raspberry Pi router.
To follow along with this tutorial you would need the following hardware with you.
Equipment List
Below are all the bits and pieces that I used for this Raspberry Pi WiFI bridge tutorial, you will need A Wireless internet connection to be able to complete this tutorial.
Recommended
- Raspberry Pi 3 or 4
- Micro SD Card
- Ethernet Cable
- Raspberry Pi Power supply
- Any ethernet device (It can be your desktop PC or Laptop as well)
Optional
Introduction
What is Dnsmasq
Dnsmasq is a lightweight, but efficient library which acts as a DNS server, a DHCP server with support for DHCPv6 and PXE, and a TFTP server. It is designed to have a small footprint and memory overhead, suitable for resource-limited routers and firewalls. Dnsmasq can also be configured as a DNS cache for improved DNS lookup speeds to previously visited sites. Basically, DNSMasq gives the router some advanced enterprise functionality - caching DNS records locally so you have a faster browsing experience. For beginners, reading this stanza will be like seeing greek and roman. We will explain the import terminology below for better understanding.
DHCP server: A DHCP Server is a network server that automatically provides and assigns IP addresses, default gateways and other network parameters to client devices. It relies on the standard protocol known as Dynamic Host Configuration Protocol or DHCP to respond to broadcast queries by clients. In other words, since the Dnsmasq is running in RPI, our RPI will be acting as a DHCP server over the ethernet, which leases IP addresses to the connected devices in the ethernet port just like any other router. Thus the devices and RPI forms a LAN network of its own with RPI acting as the router.
DNS server: A DNS server is a computer server that contains a database of public IP addresses and their associated hostnames, and in most cases serves to resolve, or translate, those names to IP addresses as requested. DNS servers run special software and communicate with each other using special protocols. Storing all address resolution rules(ip and domain mapping) is impossible for a small device like RPI. Instead of that, the DNS queries will be proxied to a true updated DNS server such as Google DNS using the Dnsmasq library.
Setting up WiFi Bridge
To set up the Raspberry Pi Wifi bridge we will be utilizing the Dnsmasq package, this package handles most of the grunt work for this tutorial.
With the capability of Dnsmasq as discussed above, we can configure and run this package in a Raspberry Pi so that we can assign IP addresses and process DNS requests through the Raspberry Pi itself and make our little Raspberry Pi act as a router.
There are any alternative libraries which provide the similar functionality of Dnsmasq, but one of the bonuses to utilizing Dnsmasq is that it is very easy to configure while being somewhat lightweight in comparison to the isc-dhcp-server and bind9 packages.
Remember for this tutorial you will need to have an active WiFi router/ WiFi hotspot/WiFi access point to connect to and an ethernet device you intend on bridging the Wi-Fi connection.
Step 1. Before we get started with installing and setting up our packages, we will first run an update on the Raspberry Pi by entering the following two commands into the terminal.
sudo apt-get update
sudo apt-get upgrade
Step 2. With that done we can now install the one and only package we will be utilizing, run the following command to install dnsmasq.
sudo apt-get install dnsmasq
Step 3. Before we get too far ahead of ourselves, we should set up the wlan0 connection that we plan on using. If you have already set up your wireless connection then you can skip ahead to step 5.
Otherwise open up the wpa_supplicant file by running the following command:
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
Step 4. Within this file add the following, making sure you replace the SSID with the name of the network you want to connect to and replace the psk value with the password for that network.
network={
ssid="networkname"
psk="networkpassword"
}
Step 5. With the wireless network now setup to correctly connect we can proceed with setting up our eth0 interface. This will basically force it to use a static IP address, not setting this up can cause several issues.
To do this we need to modify the dhcpcd.conf file by running the following command:
sudo nano /etc/dhcpcd.conf
Important Note: If you’re on Raspbian stretch then wlan0 and eth0 may need to be changed if predictable network names is turned on. Use the ifconfig command to see the new names, they’re likely quite long and will contain the MAC address.
Make sure you update these for all the commands in this tutorial.
Step 6. Within this file we need to add the following lines, make sure you replace eth0 with the correct interface of your ethernet.
interface eth0
static ip_address=192.168.220.1/24
static routers=192.168.220.0
Now we can save and quit out of the file by pressing Ctrl+X then pressing Y and then Enter.
Step 7. With our changes made to dhcpcd configuration we should now restart the service by running the following command:
sudo service dhcpcd restart
Step 8. Before we get started with modifying dnsmasq’s configuration we will first make a backup of the original configuration by running the following command.
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
Step 9. With the original configuration now backed up and moved out of the way, we can now move on and create our new configuration file by typing the command below into the terminal.
sudo nano /etc/dnsmasq.conf
Step 10. Now that we have our new file created we want to add the lines below, these lines basically tell the dnsmasq package how to handle DNS and DHCP traffic.
interface=eth0 # Use interface eth0
listen-address=192.168.220.1 # Specify the address to listen on
bind-interfaces # Bind to the interface
server=8.8.8.8 # Use Google DNS
domain-needed # Don't forward short names
bogus-priv # Drop the non-routed address spaces.
dhcp-range=192.168.220.50,192.168.220.150,12h # IP range and lease time
Now we can save and quit out of the file by pressing Ctrl+Xthen pressing Y and then Enter.
Step 11. We now need to configure the Raspberry Pi’s firewall so that it will forward all traffic from our eth0 connection over to our wlan0 connection. Before we do this we must first enable ipv4p IP Forwarding through the sysctl.conf configuration file, so let’s begin editing it with the following command:
sudo nano /etc/sysctl.conf
Step 12. Within this file you need to find the following line, and remove the # from the beginning of it.
Find:
#net.ipv4.ip_forward=1
Replace with:
net.ipv4.ip_forward=1
Now we can save and quit out of the file by pressing Ctrl+X then pressing Y and then Enter.
Step 13. Now since we don’t want to have to wait until the next reboot before the configuration is loaded in, we can run the following command to enable it immediately.
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
Step 14. Now that IPv4 Forwarding is enabled we can reconfigure our firewall so that traffic is forwarded from our eth0 interface over to our wlan0 connection. Basically this means that anyone connecting to the ethernet will be able to utilize our wlan0 internet connection.
Run the following commands to add our new rules to the iptable:
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
Note: If you get errors when entering the above lines simply reboot the Pi using sudo reboot.
Step 15. Of course iptables are flushed on every boot of the Raspberry Pi so we will need to save our new rules somewhere so they are loaded back in on every boot.
To save our new set of rules run the following command.
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
Step 16. Now with our new rules safely saved somewhere we need to make this file be loaded back in on every reboot. The most simple way to handle this is to modify the rc.local file.
Run the following command to begin editing the file.
sudo nano /etc/rc.local
Step 17. Now we are in this file, we need to add the line below. Make sure this line appears above exit 0. This line basically reads the settings out of our iptables.ipv4.nat file and loads them into the iptables.
Find:
exit 0
Add Above:
iptables-restore < /etc/iptables.ipv4.nat
Now we can save and quit out of the file by pressing Ctrl+X then pressing Y and then Enter.
Step 18. Finally all we need to do is start our dnsmasq service. To do this, all you need to do is run the following command:
sudo service dnsmasq start
Step 19. Now you should finally have a fully operational Raspberry Pi WiFi Bridge, you can ensure this is working by plugging any device into its Ethernet port, the bridge should provide an internet connection to the device you plug it into.
To ensure everything will run smoothly, it’s best to try rebooting now. This will ensure that everything will successfully re-enable when the Raspberry Pi is started back up. Run the following command to reboot the Raspberry Pi:
sudo reboot
Hope you enjoy this tutorial. Happy hacking...