Surf the Internet securely with your very own portable WiFi VPN/TOR router. You can configure a Raspberry Pi with Linux and some extra software to connect to a VPN server of your choice. The VPN connection encrypts your internet traffic so that hackers and spies can’t figure out what web sites you are visiting, and the web sites you are visiting can’t tell which computer you are surfing from.

Not sure what board is right for you? Make:’s interactive Board Guide lets you dial into the field to find the best one for your needs.

The router is small and portable, so you can plug it in anywhere, adding secure internet browsing to any occasion, from your room to the café. You can even connect WiFi devices that don’t support VPN, like your Chromecast or Pebl.

The project consists of a Raspberry Pi, two USB WiFi dongles, an SD card, and a power plug.

If you don’t have Ethernet available, your router can connect to a WiFi network in addition to creating its own, acting as a bridge between your personal WiFi access point and an insecure WiFi. The range of this router is just enough to fill a single room.

Once built, any WiFi device has a passive VPN connection. If the VPN connection disconnects, so does your connection to the internet, guaranteeing that unencrypted data is not leaked.

If you are so inclined, we can set it up your router to support TOR, so that you can dive deep into the internet within the internet.

Using open-source software, we can handle WiFi connections from your devices, connect to another WiFi access point, and encrypt your internet through a VPN anywhere you are.

When your friends come over, they will also be on a secure Internet connection, even if they don’t know how to set one up themselves. Additionally, you can access Hulu, Netflix, HBO, or your favorite team’s game while traveling overseas. If you want to take it further, you can add domain-based ad blocking using bind to stop web advertisements dead in their tracks.

Enjoy setting up your very own portable WiFi VPN/TOR router!

  • Difficulty: Intermediate
  • Cost: $60-80
  • Time: 1-4 hours

All images courtesy of NetNinja

Project Steps

Flash SD Card

Plug your SD card (and card reader) into your computer.

We will be using Raspbian Linux for this project. It is a small, Debian-compatible Linux distribution for Raspberry Pi. Go to and download the Raspbian ZIP. When the download is complete, unzip it to reveal an img file. You need to copy this disk image onto the SD card.

The Raspberry Pi website has excellent tutorials for how to install a disk image. Essentially, you can use Terminal on Mac or Linux with a command like this: $ sudo dd if=/path/to/raspbian-image.img of=/dev/name-of-sd-card-disk

On Windows, you can use a program called Win32DiskImager that lets you drag-and drop the Raspbian image file to the destination disk.

When the disk is finished copying, you are ready to assemble. Snap your Raspberry Pi into the case and plug in the WiFi adapters and the SD card. Plug the Pi into a monitor, keyboard, and power adapter, and start it up.

Boot Up the Raspberry Pi

When you boot the Pi for the first time, it will guide you through a setup process called raspi-config. This lets you change your user password, overclock your Pi, and set up the desktop environment.

For this project, you should change your user password, expand the disk, and choose “command line” as your Boot environment. If you live outside of the UK, you should change your internationalization options (keyboard, time zone, and locale) to match.

You may want to enable SSH, so you can access your Pi after you disconnect its monitor and keyboard.

When you exit, you will be brought to a console, ready to go. Log in with the username “pi” and the password you chose for your Pi.

Connect to the Internet

Connecting to Ethernet is simple; simply plug in an Ethernet cable and your Pi will figure out how to connect. Connecting to WiFi is a little more challenging. There are several WiFi network types and encryptions available, and each one is configured slightly differently in Linux.

To tell your Pi how to connect to WiFi, you’ll have to edit the /etc/network/interfaces file.

$ sudo nano –w /etc/network/interfaces

In this file, you can set rules for how to connect to a WPA, WEP, or an open WiFi network.

Depending on the encryption of the WiFi access point, you’ll need to configure this file differently.

[protected-iframe id=”37bc87e7b65f9fcd08c96ae5c3c32bdd-30206320-62929444″ info=”37bc87e7b65f9fcd08c96ae5c3c32bdd” ] For example, if you are connecting to a WPA WiFi network, your /etc/network/interfaces file will contain something like this:

allow-hotplug wlan0 # detect WiFi adapter

iface wlan0 inet dhcp # connect WiFi with DHCP

wpa-ssid "myhostnetwork" # WPA access point name

wpa-psk "myhostpassword" # WPA access point password

Manually restart WiFi to connect the Raspberry Pi to the Internet.

$ sudo ifdown wlan0

$ sudo ifup wlan0

You can validate that you have a WiFi connection by pinging a website or running the command: $ ifconfig wlan0

Create an Access Point

Before proceeding further, update apt-get. $ sudo apt-get update

An access point allows a computer to connect to a network over WiFi. On our Pi we will be using hostapd to create the access point and isc-dhcp-server to give IP addresses to computers that connect to our access point.

Install access point: You will need a custom version of hostapd, the access point software that supports the Edimax cards you have. Installing hostapd takes about 10 minutes.

$ wget

$ tar -zxvf v1.1.tar.gz

$ cd RTL8188-hostapd-1.1/hostapd

$ make

$ sudo make install

Tell hostapd the name and password of our access point and the name of the device we are using to host WiFi connections: $ sudo nano –w /etc/hostapd/hostapd.conf

Change three lines in /etc/hostapd/hostapd.conf to: interface=wlan1



Finally, start hostapd and add it as a service on boot: $ sudo service hostapd start

$ sudo update-rc.d hostapd enable

Install DHCP server

Install dnsmasq:

$ sudo apt-get install dnsmasq

We will tell our DHCP server that it controls an IP address range between and, with our Pi router having the IP of It will be configured as an “authoritative” server acting on the wlan1 device, meaning that it will force clients to discard expired IP addresses.

$ sudo nano –w /etc/dnsmasq.d/dnsmasq.custom.conf

Add the following to /etc/dnsmasq.d/dnsmasq.custom.conf: interface=wlan1


dhcp-option=3, # our router

dhcp-option=6, # our DNS Server

dhcp-authoritative # force clients to grab a new IP

Configure the DHCP server to use wlan1 as the device that manages DHCP requests: $ sudo nano -w /etc/resolv.conf

In the file /etc/resolv.conf, add the following this line, pointing DNS to the Google public DNS servers: nameserver



Now configure the wlan1 device to load at boot with a static IP address of$ sudo –w nano /etc/network/interfaces

Add the following lines for wlan1: iface wlan1 inet static



Finally, restart the wlan1 WiFi adapter: $ sudo ifdown wlan1

$ sudo ifup wlan1

Now start the DHCP server and add it as a service at boot: $ sudo service dnsmasq start

$ sudo update-rc.d dnsmasq enable

You should now be able to see “mySecureRouter” as a WiFi access point from your computer. You can connect to it with WPA2 encryption and the password “mySecurePassword.”

Connect to a VPN or TOR

Now we are getting to the meat of this project – the encrypted connection to the internet! VPN and TOR are both encryption technologies that hide your browsing activities from prying eyes. It’s not easy to use TOR and VPN on the same network connection, so you should choose which one you want to use on your Pi.


TOR, or The Onion Router, is an encryption technology that encrypts and distributes your internet data across a network of computers on the way back and forth to a website, like in image 1.

Tor is very easy to install. To use it, you need to also surf on a special TOR-enabled web browser. TOR is relatively slow because it encrypts and routes your Internet traffic over several random nodes on the network before connecting your computer to a web site. TOR also gives you access to a hidden layer of the internet, called the Dark Web, which is unavailable over VPN.

VPNs, or Virtual Private Networks, work passively in the background by creating a single encrypted tunnel between your computer and a website, like in image 2.

VPNs can be more secure than TOR if you trust your VPN server. A VPN is harder to configure, but don’t require any other special software to use correctly. To use them you must have an account on the VPN server and several files generated on the VPN server that validate your account. You should trust that your VPN server is not recording you or publishing your private information.

If you don’t want to pay for a VPN service or you just want to learn to make your own, you can Roll Your Own OpenVPN Server here.

To install TOR, install the TOR software: $ sudo apt-get install tor

Start TOR and set it up as a service at boot: $ sudo service tor start

$ sudo update-rc.d tor enable

Lastly, on the computer you will be browsing on, you will have to install the TOR web browser from

Installing VPN: Linux supports OpenVPN easily. Many VPN providers also support the OpenVPN protocol. To connect to a VPN, you will need some information from your VPN provider. This may include a CA certificate, and possibly a username and password. You will also need to know the domain name of the VPN server, the port (typically 1194) and protocol (typically UDP).

Install OpenVPN: $ sudo apt-get install openvpn

If you were provided a CA certificate by a VPN service, save it as /etc/openvpn/ca.crt. If your VPN service provides you with a username and password, put it in /etc/openvpn/auth.txt. auth.txt will look like this: myVPNUserName


Configure the OpenVPN settings to connect to your VPN server. $ sudo nano –w /etc/openvpn/client.conf

Although your VPN configuration will depend on your server’s settings, your /etc/openvpn/client.conf should look something like this: client # client mode

dev tun

proto udp # this must match the server’s protocol

remote 1194 # must match the server

resolv-retry infinite # reconnect when disconnected




ca ca.crt # this file is given by the server

#cert client.crt # uncomment if the VPN server requires a client.crt

#key client.key # uncomment if the VPN server requires a client.key

ns-cert-type server

#comp-lzo # uncomment if the server supports lzo compression

#auth-user-pass auth.txt # uncomment if your server requires a username and password

script-security 3 # must match the server’s script security setting

keepalive 5 30 # keep connection alive

verb 3

log-append /var/log/openvpn-client.log

OpenVPN will not work without a matching timestamp. Since Raspberry Pis don’t have a real-time clock, you’ll need to use the Network Time Protocol (NTP) service. $ sudo service ntp start

$ sudo update-rc.d ntp enable

Start the OpenVPN client and set it up as a service at boot: $ sudo service openvpn start

$ sudo update-rc.d openvpn enable

Once you are connected, you can use traceroute to test out your connection by mapping your Internet connection’s path to The first step should show that you are connecting to your VPN server on

Set up Routing

Routing is what connects your computer to the internet. It takes packets of data that your computer sends to the Pi, then forwards it on to a website. When the web site responds, packets of data are sent back to your Pi across the internet. Your Pi figures out which WiFi client the response is intended for, and passes it forward to your computer.

If you have VPN or TOR configured, these packets will also pass through an encrypted service within the internet. This is done using software called iptables. We must enable and configure the rules that allow our Pi to know how to route packets of data the right way.

Let’s enable routing: $ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Tell Linux to remember this change: $ sudo nano /etc/sysctl.conf

In this file, uncomment the line: net.ipv4.ip_forward=1

Depending on how you are connecting to the Internet on your Pi (VPN, TOR, Ethernet, or WiFi), you will be routing through one of several devices. Choose the device to route through based on the connection method: [protected-iframe id=”65ac4502bc06dd3c23837be5405ed3e6-30206320-62929444″ info=”65ac4502bc06dd3c23837be5405ed3e6″ ]

Tell Linux to masquerade as your computer on the internet: $ sudo iptables –t nat –A POSTROUTING –o tun0 -j MASQUERADE

Tell it to forward all traffic to the Internet: $ sudo iptables –A FORWARD –i wlan1 –o tun0 -j ACCEPT

Finally, tell it to forward returning Internet data to the appropriate client: $ sudo iptables –A FORWARD –i tun0 -o wlan1 –m state --state RELATED,ESTABLISHED –j ACCEPT

Save these settings for the next reboot:$ sudo sh –c “iptables-save > /etc/iptables.restore”

$ echo “up iptables-restore < /etc/iptables.restore” | sudo tee --append /etc/network/interfaces

Connect a WiFi client

Go on your computer and try to connect to your WiFi access point.

Access point: mySecureRouter

Password: mySecurePassword

You’ll be able to see the computer that just connected on your Pi using the arp command: $ sudo arp –i wlan1

If you set up TOR on your Pi, you’ll have to also install the TOR browser on your computer.