Introduction

The Raspberry Pi 3 comes with a built-in wireless adapter, which makes it easy to configure it as a WiFi hotspot to share Internet or host your own internal web site. The first part of this guide will show you how to set up the Pi to broadcast its SSID, accept WiFi connections, and hand out IP addresses (using DHCP). The next section shows you how to enable a pass-through Ethernet connection should you want to share your Internet connection.

Before You Get Started!

You will want to load an operating system (OS) onto the SD card and be able to log into the Pi and open a terminal.

Note: This tutorial was created with Raspbian Stretch (version: March 2018). Using a different version may require performing different steps than what's shown in this tutorial. If you would like to download the March 2018 version of Raspbian, it can be found below.

Set Up WiFi Access Point

Make sure your Raspberry Pi is connected to the Internet. Open a terminal window (either in a console window or over a serial/SSH connection).

Install Packages

To install the required packages, enter the following into the console:

language:bash
sudo apt-get -y install hostapd dnsmasq

Hostapd is a program that allows you to use the WiFi radio as an access point, and Dnsmasq is a lightweight combination of DHCP and DNS services (handing out IP addresses and translating domain names into IP addresses).

Set Static IP Address

In recent versions of Raspbian, network configuration is managed by the dhcpcd program. As a result, we’ll need to tell it to ignore the wireless interface, wlan0, and set a static IP address elsewhere.

Note: If you are connected to your Raspberry Pi using SSH over wireless, you will want to connect with a keyboard/mouse/monitor, Ethernet, or serial instead until we get the access point configured.

Edit the dhcpcd file:

language:bash
sudo nano /etc/dhcpcd.conf

Scroll down, and at the bottom of the file, add:

language:bash
denyinterfaces wlan0

Your terminal window should look similar to the image below.

Save and exit by pressing ctrl + x
and y when asked.

Next, we need to tell the Raspberry Pi to set a static IP address for the WiFi interface. Open the interfaces file with the following command:

Configure Hostapd

We need to set up hostapd to tell it to broadcast a particular SSID and allow WiFi connections on a certain channel. Edit the hostapd.conf file (this will create a new file, as one likely does not exist yet) with this command:

language:bash
sudo nano /etc/hostapd/hostapd.conf

Enter the following into that file. Feel fee to change the ssid (WiFi network name) and the wpa_passphrase (password to join the network) to whatever you’d like. You can also change the channel to something in the 1-11 range (if channel 6 is too crowded in your area).

Unfortunately, hostapd does not know where to find this configuration file, so we need to provide its location to the hostapd startup script. Open /etc/default/hostapd:

language:bash
sudo nano /etc/default/hostapd

Find the line #DAEMON_CONF="" and replace it with:

language:bash
DAEMON_CONF="/etc/hostapd/hostapd.conf"

Your terminal window should look similar to the image below.

Save and exit by pressing ctrl + x
and y when asked.

Configure Dnsmasq

Dnsmasq will help us automatically assign IP addresses as new devices connect to our network as well as work as a translation between network names and IP addresses. The .conf file that comes with Dnsmasq has a lot of good information in it, so it might be worthwhile to save it (as a backup) rather than delete it. After saving it, open a new one for editing:

In the blank file, paste in the text below. Note that we set up DHCP to assign addresses to devices between 192.168.5.100 and 192.168.5.200. Remember that 192.168.5.1 is reserved for the Pi. So, anything between 192.168.5.2 - 192.168.5.9 and between 192.168.5.201 - 192.168.5.254 can be used for devices with static IP addresses.

Test WiFi connection

After your Pi restarts (no need to log in), you should see MyPiAP appear as a potential wireless network from your computer.

Connect to it (the network password is raspberry, unless you changed it in the hostapd.conf file). Open a terminal on your computer and enter the command ipconfig (Windows) or ifconfig (Mac, Linux). You should see that you have been assigned an IP address in the 192.168.5.100 - 192.168.5.200 range.

Here's an example of what you may see after connecting wirelessly to the Pi.

If you just want to use the Pi as a standalone WiFi access point, you can stop here. If you want to connect it to another network (over Ethernet) in order to share Internet (much like a WiFi router), continue on.

Enable Packet Forwarding

We can use the Raspberry Pi as a router by being able to connect it to another network over Ethernet and have WiFi-connected devices be able to talk to that network. By doing this, we can share an Internet connection from the Pi.

Configure NAT

Make sure you are logged into your Pi. Edit the /etc/sysctl.conf file:

language:bash
sudo nano /etc/sysctl.conf

Look for the line #net.ipv4.ip_forward=1, and uncomment it by deleting the #.

language:bash
net.ipv4.ip_forward=1

Your terminal window should look similar to the image below.

Save and exit by pressing ctrl + x and y when prompted.

Finally, we need to configure Network Address Translation (NAT) between the Ethernet and WiFi interfaces to allow devices on both networks to communicate with each other. In the terminal, enter the following:

This will work for now, but on reboot, the Pi will revert back to its previous state. To fix this, we need these NAT rules to be applied each time it starts up. Save the current rules to a file with this command:

language:bash
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

Linux provides us with a number of ways to run commands on boot. Usually, the easiest is to put those commands into the /etc/rc.local script. To have our NAT rules restored on boot, we edit the rc.local file:

language:bash
sudo nano /etc/rc.local

Just above the exit 0 line (which ends the script), add the following:

language:bash
iptables-restore < /etc/iptables.ipv4.nat

Your terminal window should look similar to the image below.

Save and exit by pressing ctrl + x and y when prompted.

Test It Out

Restart your Pi:

language:bash
sudo reboot

Give your Pi a couple minutes to restart (once again, no need to log in). Connect an Ethernet cable from your Internet router (or switch, etc.) to your Pi. Once the Pi has started, connect to the MyPiAP network from your computer. Open a web browser, and navigate to the website of your choice.

You can also open a terminal on your computer and ping a known Internet address (e.g. 8.8.8.8 is one of Google’s Public DNS servers).

Resources and Going Further

With the Raspberry Pi set up as an access point, you can now configure it to host a web site (e.g. using Apache), share drive space (e.g. Samba), and any other fun router customizations you might want (but on a Pi, instead!).

Looking for some inspiration for your Raspberry Pi? Check out these tutorials:

This tutorial will show you how to use a headless Raspberry Pi to flash hex files onto AVR microcontrollers as a stand-alone programmer. It also tells the story about production programming challenges, how SparkFun came to this solution, and all the lessons learned along the way.

In 2003, CU student Nate Seidle fried a power supply in his dorm room and, in lieu of a way to order easy replacements, decided to start his own company. Since then, SparkFun has been committed to sustainably helping our world achieve electronics literacy from our headquarters in Boulder, Colorado.

No matter your vision, SparkFun's products and resources are designed to make the world of electronics more accessible. In addition to over 2,000 open source components and widgets, SparkFun offers curriculum, training and online tutorials designed to help demystify the wonderful world of embedded electronics. We're here to help you start something.