The Raspberry Pi can be used as a router–great if you need a pocket-sized device to share an Internet connection. It can also be used in conjunction with a cantenna.
Requirements For This Walkthrough
- Local network
- Mac or PC
- Raspberry Pi running Raspbian “wheezy”
- Wireless USB Adapter
- HDMI Cable (*optional)
- Keyboard (*optional)
- Mouse (*optional)
- Monitor with HDMI input (*optional)
*If the Raspberry Pi is set up as a headless machine, you will not need a monitor, keyboard, or mouse–just another computer, which would be used to access it remotely over the network via SSH.
- Older hostapd (only needed if the driver via apt does not work)
- Copies of config files on Github (optional or for reference)
Knowledge, Skills, and Abilities
- Ability to navigate throughout a computer OS
- Knowledge of basic computer terminology
- Ability and confidence to enter commands in the Terminal, adjusting them to suit your environment, if necessary
- Familiarity with core networking concepts
- Install Required Components via apt-get
- Verify Wi-Fi Adapter dongle functionality
- Configure /etc/network/interfaces
- Create /etc/hostapd/hostapd.conf with desired AP settings
- Point hostapd to the configuration file in step 4 by modifying /etc/default/hostapd
- Replace /sbin/hostapd with the older version (if necessary)
- Configure DHCP to allow clients to connect
- Enable IPv4 forwarding to reach the Internet
Prepare the RPi
Make certain that the RPi is up-to-date and all the newest packages are available for download/installation.
sudo apt-get update sudo apt-get upgrade
Install Required Components
The following components will be required for setting this up as an access point:
- rfkill: a wireless utility
- zd1211-firmware: common firmware that works with many Wi-Fi dongles
- hostapd: the hostap wireless access point daemon
- hostap-utils: supplemental hostap tools
- iw: wireless configuration utility
- dnsmasq: DHCP and DNS utility
- bridge-utils: used for connecting multiple Ethernet devices together
Install these components using the command:
sudo apt-get install rfkill zd1211-firmware hostapd hostap-utils iw dnsmasq bridge-utils
Configure the Wireless Dongle
Verify The Dongle is Recognized by the RPi
Check that the RPi recognizes the Wi-Fi dongle.
You should see a listing mentioning the adapter you have plugged in.
Verify that the Wi-Fi dongle supports AP mode
If the output of the following command does not show anything about AP mode, then the dongle will not work for this project. But if it does, continue following the step-by-step directions.
Unfortunately, my dongle did not work and produced the error nl80211 not found , which is OK. Run this command:
dmesg | grep rtl
if the output is similar to:
[ 6.240292] usbcore: registered new interface driver rtl8192cu
then it will probably still work. This will be fixed in a later step.
Configure the Wireless Interface
Make a backup of /etc/network/interfaces and then open it in a text editor:
sudo cp /etc/network/interfaces /etc/network/interfaces.orig sudo vi /etc/network/interfaces
Modify the file as below (highlighted lines are the additions):
auto lo auto br0 iface lo inet loopback iface eth0 inet dhcp allow-hotplug wlan0 allow-hotplug eth0 iface wlan0 inet manual iface br0 inet dhcp bridge_fd 1 bridge_hello 3 bridge_maxage 10 bridge_stp off bridge_ports eth0 wlan0
Restart the wlan0 interface:
sudo ifdown wlan0 sudo ifup wlan0
Configure hostapd Settings
Next, make a backup of the /etc/hostapd/hostap.conf file and open it in a text editor to make some changes (ignore the first command if the file does not exist yet).
sudo cp /etc/hostapd/hostapd.conf /etc/hostapd/hostapd.conf.orig sudo vi /etc/hostapd/hostapd.conf
If using a different adapter than the one I used, just modify the file by adjusting any unique items (i.e. country_code , ssid , etc). If the iw list command mentioned previously reported the error nl80211 not found , then modify the file as follows:
interface=wlan0 bridge=br0 driver=rtl871xdrv country_code=US ctrl_interface=wlan0 ctrl_interface_group=0 ssid=RPiAP hw_mode=g channel=1 wpa=3 wpa_passphrase=password wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP beacon_int=100 auth_algs=3 macaddr_acl=0 wmm_enabled=1 eap_reauth_period=360000000
If the iw list command reported the error, you should also to make a backup of the /etc/default/hostapd file (if it exists),
sudo cp /etc/default/hostapd /etc/default/hostapd.orig sudo vi /etc/default/hostapd
and then modify the highlighted line below (be sure to uncomment the line):
# Defaults for hostapd initscript # # See /usr/share/doc/hostapd/README.Debian for information about alternative # methods of managing hostapd. # # Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration # file and hostapd will be started during system boot. An example configuration # file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz # DAEMON_CONF="/etc/hostapd/hostapd.conf" # Additional daemon options to be appended to hostapd command:- # -d show more debug messages (-dd for even more) # -K include key data in debug messages # -t include timestamps in some debug messages
If you are using the same dongle I did, you will need to take another additiona step and replace /usr/sbin/hostapd with a newer version, which you can get here (but we will use a command to download it next). Following our best practice, make a backup first and then edit it:
sudo cp /usr/sbin/hostapd /usr/sbin/hostapd.orig
Delete the original file, which will be replaced by the one downloaded via the command below:
cd /usr/sbin sudo rm -f hostapd sudo wget http://dl.dropbox.com/u/1663660/hostapd/hostapd
Set the proper permissions on the new file and make sure it is executable:
sudo chown root:root hostapd sudo chmod 755 hostapd
Restart thehostapd service to activate the settings.
sudo service networking restart sudo service hostapd restart
If the hostapd restart did not work. Try running this to view the output and see if you can find where the problem is in the config file and fix it:
sudo hostapd -d /etc/hostapd/hostapd.conf
The wireless network should show up if you were to scan for it from another device. However, a few other settings need to be configured before anyone can connect to it. In particular, dnsmasq .
Configure dnsmasq Settings
Following best practices, make a backup of the config file before editing it and then open the file in a text editor.
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo vi /etc/dnsmasq.conf
Uncomment the following lines and adjust them to your environment:
domain-needed interface=wlan0 dhcp-range=192.168.2.1,192.168.2.254,12h
After saving the file, you can easily verify all the settings were correct with the following command (it just parses out the comments and blank lines):
cat /etc/dnsmasq.conf | grep -v "#" | sed '/^$/d'
Restart thednsmasq service to apply the settings:
sudo service dnsmasq restart
Attempt to connect to the network using another device. You should be able to connect, but you won’t be able to get out the the Internet yet.
Enable Forwarding to Reach the Internet
Enable IPv4 forwarding
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
Other Dongles and Other Uses
The main reason I chose the Wi-Fi dongle that I did was so that I could connect my cantenna to it and blast the signal a long distance. It would have certainly been easier to use an adapter that worked right out of the box, but now I have a lot more flexibility with antenna types.
Here are all the commands from the walkthrough needed to set up the router (excluding the information needing to be added to the files):
sudo apt-get install rfkill zd1211-firmware hostapd hostap-utils iw dnsmasq bridge-utils sudo cp /etc/network/interfaces /etc/network/interfaces.orig sudo vi /etc/network/interfaces sudo ifdown wlan0 sudo ifup wlan0 sudo cp /etc/hostapd/hostapd.conf /etc/hostapd/hostapd.conf.orig sudo vi /etc/hostapd/hostapd.conf sudo cp /etc/default/hostapd /etc/default/hostapd.orig sudo vi /etc/default/hostapd sudo cp /usr/sbin/hostapd /usr/sbin/hostapd.orig cd /usr/sbin sudo rm -f hostapd sudo wget http://dl.dropbox.com/u/1663660/hostapd/hostapd sudo chown root:root hostapd sudo chmod 755 hostapd sudo service networking restart sudo service hostapd restart sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo vi /etc/dnsmasq.conf sudo service dnsmasq restart sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A POSTROUTING -j MASQUERADE
I recently followed my own walkthrough and ran into an issue on the last command for iptables . It returned the error:
libkmod: ERROR ../libkmod/libkmod.c:554 kmod_search_moddep: could not open moddep file '/lib/modules/3.10.25+/modules.dep.bin' iptables v1.4.14: can't initialize iptables table `nat': Table does not exist (do you need to insmod?) Perhaps iptables or your kernel needs to be upgraded.
I was using the image of raspian from back in January 2014. After running
I was able to execute the command and get out to the Internet via the Raspberry Pi Router!