Posted on

Pi Wi-Fi Access Point

I searched the web for instructions on how to set up a RPi as an access point using a Wi-Fi adapter, and found some very good material. Dave Conroy has a how to that is the basis of this post. As with most situations there were some tweaks to fit my needs. So I thought I would offer up my experience on how to build a wireless router with an RPi.

Update: Feb 17, 2015 – I repeated this with my raspberry pi 2 and nothing needed to be changed. 🙂

There are a few caveats.

  • The range of a Wi-Fi dongle is not that great
  • The Wi-Fi package was not plug and play
  • You don’t have the cool GUI interface that commercial Wi-Fi AP’s have for configuration
  • The RPi is not cheaper than most low-end Wireless routers – I just bought an ASUS unit for $39, and about a month before that I picked up a Netgear for $29.

But that’s not the point. The point is a RPi is a teaching tool. So with that in mind, this little project was certainly a learning experience. Please keep that in mind as you try this project.

The Goods

This is the hardware I used for this project:

  • Raspberry Pi Model B
  • Edimax Nano USB EW-7811Un (RTL8188CUS chipset)
  • 4GB SD card

These are the software packages I used during the project:

  • hostapd
  • special drivers for the RTL8188CUS
  • apache2
  • isc-dhcp-server

There are thousands of web pages on how to get an RPi up and running. I won’t go through all that here, but here are the cliff notes:

  • I started with a 4GB SD card so I could create a reasonably small shareable image
  • I used SDFormatter to properly clean up the SD card
  • I downloaded Raspbian Linux using a link on raspberrypi.org
  • I flashed the Raspbian O/S onto the SD card with Win32Diskimager

Once booted, I ran through the raspi-config utility and

  • updated the config tool
  • expanded the filesystem to the 4GB max
  • set the locale, time zone, and keyboard to my needs
  • enabled SSH
  • set a host name
  • overclocked slightly to 800Mhz (not necessary)

Feel free to change your password, if you plan to make your RPi visible to the Internet

So enough with the chit chat – log into your Pi and lets get to it!

Get the Web Server up – Install Apache

The first part is pretty easy. Run the following command from the shell to install Apache.

sudo apt-get install apache2

The location of the Apache configuration file is…

/etc/apache2/apache2.conf

You should not need to edit this file, as the defaults are fine for most purposes.

Install Wireless Support – hostapd

To be able to access this new web server over a WiFi Hotspot running on the same Raspberry Pi, we need to install hostapd.

sudo apt-get install hostapd

Patching hostapd for Edimax Wi-Fi adapter (Thanks Dave Conroy!!)

The following steps are only for people who have WiFi adapters with the RTL8188CUS Chipset. If you have a different chipset please skip ahead to the section titled “Configuring hostapd”.

Download and replace the installed binary version of hostapd you just installed and issue the following commands at the console:

wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip

unzip hostapd.zip

sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak

sudo mv hostapd /usr/sbin/hostapd.edimax

sudo ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd

sudo chown root.root /usr/sbin/hostapd

sudo chmod 755 /usr/sbin/hostapd

Configuring hostapd

Now that you have updated the binary copy of hostapd, you need to configure it. Start by creating the following file

sudo nano /etc/hostapd/hostapd.conf

with the following contents (updated 9/6/14 to include 802.11g/n options):

interface=wlan0

driver=rtl871xdrv

ssid=PiNetwork

channel=1

hw_mode=g

wmm_enabled=1

ieee80211n=1

ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40][SHORT-GI-20][MAX-AMSDU-7935]

wpa=3

wpa_passphrase=0000000000

wpa_key_mgmt=WPA-PSK

wpa_pairwise=TKIP

rsn_pairwise=CCMP

auth_algs=1

macaddr_acl=0

Change the ssid and wpa_passphrase values to something appropriate for your network. Be sure to use a passphrase that is at least 8 characters long.

Networking Configuration

The wireless card and RPi need to handle the routing and DHCP services, so you need to define a subnet for the wireless card.

sudo nano /etc/network/interfaces

Change the file to read as shown below (commenting out the client-specific configuration commands)

# loopback interface

auto lo

iface lo inet loopback

# wired interface

iface eth0 inet dhcp

# wireless interface for use as AP (no gateway value required)

allow-hotplug wlan0

iface wlan0 inet static

address 192.168.10.1

netmask 255.255.255.0

# commented three lines used when the Pi is a DHCP client, not a server

#iface wlan0 inet manual

#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

#iface default inet dhcp

Now you need to enable DHCP services on the RPi for the network the Wi-Fi adapter is running on, so that other Wi-Fi devices can connect and get an IP address.

sudo apt-get install isc-dhcp-server

 The DHCP server will try to startup during the installation, and it will fail – that’s normal because you need to configure the subnet information.

sudo nano /etc/dhcp/dhcpd.conf

 Make sure the following lines are enabled by removing any comment tag (#). They are spread out a bit throughout the file.

authoritative; #be careful with this setting

ddns-update-style none;

default-lease-time 600;

max-lease-time 7200;

log-facility local7;

Add these lines to the end of the file. You can change the subnet to something else if you have a conflict. Also, if you need a bigger range of addresses, you can change the starting and ending address in the range definition. The Google DNS servers could be replaced with others, or you can simply add more servers to the list. If you intend to install a second Ethernet interface for a wired client you will have to add another subnet block to the list. For now just use this to support the wireless interface clients:

# for the wireless network on wlan0

subnet 192.168.10.0 netmask 255.255.255.0 {

range 192.168.10.25 192.168.10.50;

option domain-name-servers 8.8.8.8, 8.8.4.4;

option routers 192.168.10.1;

}

 To keep your DHCP server from conflicting with other DHCP servers that are visible on other interfaces, you need to specify the wlan0 interface in the DHCP server default values used at boot time.

sudo nano /etc/default/isc-dhcp-server

Edit the line INTERFACES=””; to instruct DHCP server to only offer to wlan0 users. If you intend to install a second Ethernet interface for a wired client you will have to add “eth1” to the list. For now just use this to support the wireless interface clients:

INTERFACES=”wlan0″

At this point you should reboot to test HostAPD and DHCP.

sudo reboot

 After the RPi comes back up, start hostapd in the background, then restart the DHCP service

sudo hostapd -B /etc/hostapd/hostapd.conf

sudo /etc/init.d/isc-dhcp-server restart

At this point you should be able to join the wireless network, get an IP, and also hit the local apache web server. You can watch the Wi-Fi processes actively while connecting a wireless device using the following command:

sudo hostapd -dd /etc/hostapd/hostapd.conf

If it connects, you will want to start this wireless access point on boot with the following commands…

sudo nano /etc/default/hostapd

… uncomment and update the following line

DAEMON_CONF=”/etc/hostapd/hostapd.conf”

So, if you have followed these steps correctly, you can now provide DHCP services to any client, and serve those clients your Apache web pages.

 Enable access beyond the WAP

The last step is to enable your clients who have connected to your access point reach networks beyond the RPi. You need to enable IP forwarding (routing).

Do not reboot until the end of this section or all future changes will be lost. Run these final commands as the root user.

sudo su

echo 1 > /proc/sys/net/ipv4/ip_forward

Update /etc/sysctl.conf…

nano /etc/sysctl.conf

and uncomment this line…

net.ipv4.ip_forward=1

… then save the file.

The final step is to allow Network Address Translation (NAT). Insert the following iptables rule to allow NAT (assuming that the eth0 interface is connected to the internet).

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -A FORWARD -i eth0 -o wlan0 -m state –state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

 We need to save these iptables settings so they are enabled every time you boot the RPi. To save these settings to a file, use the following command.

iptables-save > /etc/iptables.up.rules

To load them at boot time, we need add a line to the end of the /etc/network/interfaces file.

nano /etc/network/interfaces

Add the following at the end of the file:

iptables-restore < /etc/iptables.up.rules

Finishing up …

When you reboot your Raspberry Pi it should be working as an Access Point, a Web Server, a DHCP Server, and an Internet Ready Router!