I got an email earlier in the week from some students at SoonChunHyang University, about 100km from Seoul, Korea. They are working on a project where they are using Raspberry Pi’s as a web server, but also wanted to be able to control the Pi’s via their smart phones and desktops. They ran into issues because they were using the (previously) unsupported WiFi Adapter (RTL8188CUS chipset) that I wrote about in this Raspberry Pi WiFi Hotspot post.

A computer science graduate myself, I offered to write a tutorial for them to help them out. This entire tutorial might not be relevant for everyone, but I cover a lot of issues that people struggle with.

  • -Setting up a DHCP Server
  • -Setting up a Wireless Access Point
  • -Setting up an rPi as a Router
  • -Enabling IP Forwarding

I’ll begin with a fresh image of the Raspbian and just a regular ethernet cable to configure it. I’ve always recommended Raspbian because it is an optimized version of Debian built specifically for Raspberry Pi’s. The last stable downloads can be found here.

To flash your SD Card, you will need to unzip the image and write it your SD card using Win32DiskImager. This tool can also be used to after our initial setup to create an image of our finalized implementation(very useful as a backup).


After the image is flashed, you can boot your device. At this point you can use your HDMI Cable/Mouse/Keyboard for your initial configuration, or you can use an SSH Client like Putty to connect. The default hostname, login, and password are as follows:

Username: pi
Password: raspberry

raspberry pi putty

For this tutorial, I will be using putty. On first boot, you will be prompted with a configuration tool called Raspi-Config. If the raspi-config doesnt load automatically, just enter the following command from the shell to get started.

sudo raspi-config


The settings I recommend you update are


The usual distribution images are 2 GB. When you copy the image to a larger SD card you have a portion of that card unused. expand_rootfs expands the initial image to expand to fill the rest of the SD card, giving you more space. By default, 64mb is reserved for the Graphical UI. Since we plan on using this as a web server, I reduce this to 32mb with the memory_split command.

After you finish your changes to the raspi-config, you should reboot your pi using the following command:

sudo shutdown -r now

At this point we have a fully functional linux server, but we still need to install apache and get the hotspot/routing functions working. The first part is pretty easy. Run the following commands from the shell to install Apache.

sudo apt-get update
sudo apt-get install apache2

The location of the Apache configuration file is


After this is completed, give it a try! Navigate to the IP or Hostname of your Rasberry Pi in your browser, and you should see the Apache Splash “It works!” Screen.

it works apache

I believe this is what the students at SoonChunHyang already have working. But, they want to be able to access this web server over a WiFi Hotspot running on the same Raspberry Pi. In order to do this, we need to install hostapd.

sudo apt-get install hostapd

The following steps are only for people who have WiFi adapters with the RTL8188CUS Chipset, if you don’t, please skip ahead to the section titled configuring Hostapd.
I believe the whole crux of their problem so far is that it is the apt hosted copy of hostapd is not compatible with the RTL8188CUS chipset they are using. But, thanks to the Edimax team, I’ve got a replacement hostapd binary to resolve this issue. I don’t think they will be able to get this working without it.

To download and replace the installed binary version of hostapd we just installed, they need to issue the following commands:

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 we’ve updated the binary copy of hostapd, we need to configure it. To do so, create the following file

sudo nano /etc/hostapd/hostapd.conf

with the following contents:



In previous tutorials, I have used bridge-utils here to help bridge the connection between the interfaces wlan0 and eth0, but in this case we want the wireless card and rPi to handle the routing and dhcp. So , we may be able to connect to the access point, but we won’t get an IP just yet. To do that, we need to define a subnet for our wireless card.

sudo nano /etc/network/interfaces

and add the following 3 lines

iface wlan0 inet static


Then we have to enable dhcp on the pi for this network so that any devices that connect can get an IP addresss

sudo apt-get install isc-dhcp-server
sudo nano /etc/dhcp/dhcpd.conf

and make sure you have the following contents:

authoritative; #be careful with this setting
ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;

#for the wireless network on wlan0
subnet netmask {
option domain-name-servers,;
option routers;
interface wlan0;


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

sudo reboot

After the rPi comes back up, start hostapd in the background, then reboot the dhcp server

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. If it connects, we will want to start this wireless access point on boot with the following commands

sudo nano /etc/default/hostapd

and uncommenting and updating the following line


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

it works apache raspberry pi

There is only one problem remaining. The clients who have connected to your access point can not get further than your Raspberry Pi, therefore have no internet access.

To solve this, we need to enable IP forwarding on the rPi. You can not reboot at this point forward or all future changes will be lost. To save time, we are going to run the final commands as root.

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

Then, update /etc/sysctl.conf and uncomment this line

nano /etc/sysctl.conf


Save the file.

The final step is to insert an iptables rule to allow NAT. (eth0 being the interface which is connected to the internet)

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

We also need to save these IP Table 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, we need to create a script in /etc/network/if-pre-up.d/

nano /etc/network/if-pre-up.d/iptables

with the following contents:

#This script restores iptables upon reboot

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

Then, verify the permissions so that it will start on boot.

chown root:root /etc/network/if-pre-up.d/iptables 
chmod +x /etc/network/if-pre-up.d/iptables
chmod 755 /etc/network/if-pre-up.d/iptables

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

internet working raspberry pi