In een vorige blog heb ik uitgelegd welke stappen je moet uitvoeren als je een OpenVPN server wilt opzetten met de Tomato Shibby software. Heb je echter geen router die deze firmware ondersteunt, dan kun je ook gewoon een OpenVPN server opzetten op een Debian based server en vervolgens de gebruikte OpenVPN poort forwarden op je router naar de server die de OpenVPN server software draait. Dit kan dus ook een Raspberry Pi met Raspian, daar deze op Debian is gebasseerd. In deze blog leg ik uit welke stappen je moet uitvoeren om dit werkend te krijgen.

Stap 1: Installeer OpenVPN

Ik ga in deze handleiding ervan uit dat je met een user met root privileges bent ingelogd. Zorg eerst dat al je packages up te date zijn:

apt-get update

We gaan nu de OpenVPN server met Easy-RSA (voor de encryptie) installeren

apt-get install openvpn easy-rsa

Stap 2: Configueer OpenVPN

Als eerste moet we de voorbeeld configuratie file uitpakken in de /etc/openvpn directory:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Vervolgens gaan we de OpenVPN configuratie ‘/etc/openvpn/server.conf’ editten. Dit doen we in 4 stappen:

  1. Sterke encryptie niveau instellen
  2. Forward web verkeer naar bron
  3. Voorkom dat DNS requests buiten de VPN connectie lekken
  4. Opzetten permissies

Om het encryptie niveau te verhogen zoek je in de file ‘/etc/openvpn/server.conf’ naar de regel:

# Diffie hellman parameters.
# Generate your own with:
# openssl dhparam -out dh1024.pem 1024
# Substitute 2048 for 1024 if you are using
# 2048 bit keys.
dh dh1024.pem

Verander dh1024.pem in dh2048.pem

dh dh2048.pem

Nu gaan we ervoor zorgen dat al het verkeer naar de juiste lokatie wordt omgeleid. In dezelfde file zoek nu naar:

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
;push "redirect-gateway def1 bypass-dhcp"

Verwijder de ; voor de laatste regel zodat er staat:

push "redirect-gateway def1 bypass-dhcp"

Nu gaan we OpenVPN vertellen om gebruik te maken van de OpenDNS server om hostnames in IP addressen om te zetten. Zoek in de file naar:

# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses. CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

Verwijder de ; voor de laatste 2 regels:

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Tenslotte gaan we de permissies goed zetten. Zoek naar:

# You can uncomment this out on
# non-Windows systems.
;user nobody
;group nogroup

Verwijder de ; voor de laatste 2 regels:

user nobody
group nogroup

Stap 3: Enable Packet Forwarding

Hier vertellen we dat verkeer van de clients naar het internet wordt omgeleid, anders stopt het verkeer bij de OpenVPN server. Voer hiervoor het volgende commando uit:

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

Om deze instelling definitief te maken moet je de file ‘/etc/sysctl.conf’ aanpassen. Zoek hier naar de volgende regel:

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

Haal nu # weg bij de laatste regel:

net.ipv4.ip_forward=1

Stap 4: Configureer en bouw ‘Certificate Authority’

OpenVPN gebruikt certficaten om het verkeer te encrypten. OpenVPN ondersteunt bi-directionele authenticatie gebasseerd op certificaten. Dat betekent dat de client het certificaat van de server moet authentiseren en de server moet het certificate van de client authentiseren voordat er wederzijds vertrouwen is. We maken hierbij gebruik van Easy RSA’s script.

Copieer eerst de Easy-RSA generatie scripts:

cp -r /usr/share/easy-rsa/ /etc/openvpn

Creëer een directory waarin de keys worden opgeslagen:

mkdir /etc/openvpn/easy-rsa/keys

Nu gaan we een aantal parameters instellen voor ons certificaat. Edit de file ‘/etc/openvpn/easy-rsa/vars’ en verander de waardes van de volgende regels naar jouw behoefte:

export KEY_COUNTRY="US"
export KEY_PROVINCE="TX"
export KEY_CITY="Dallas"
export KEY_ORG="My Company Name"
export KEY_EMAIL="sammy@example.com"
export KEY_OU="MYOrganizationalUnit"

Verander verder in deze file de volgende regels:

# X509 Subject Field
export KEY_NAME="EasyRSA"

in:

# X509 Subject Field
export KEY_NAME="server"

De volgende stap is het genereren van de Dilfie-Helmans parameters met behulp van de OpenSSL ‘dhparams’ tool. Dit kan een aantal minuten duren:

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

Het certificaat is nu gegenereerd en hierna gaan we een key genereren. Ga hiervoor naar de ‘/etc/openvpn/easy-rsa’ directory:

cd /etc/openvpn/easy-rsa

Nu gaan we CA instellen. Eerst moeten we de Public Key Infrastructure (PKI) initialiseren met het commando:

. ./vars

Je krijgt nu de volgende waarschuwing te zien, maar dat is niet erg:

NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys.

Hierna gaan we voor de zekerheid alle andere keys leegmaken met het commando:

./clean-all

Tenslotte gaan we CA bouwen met een OpenSSL commando. Deze zal vragen om ‘Distinguished Name’ waardes, maar je kunt hierbij de default waarde telkens overnemen.

./build-ca

Stap 5: Genereren certificaat en key voor Server

In deze stap gaan OpenVPN instellen en opstarten. Bouw eerst de key met het commando:

./build-key-server server

Er zal weer om ‘Distinguished Name’ waardes gevraagd worden en je kunt weer de defaults overnemen. Deze keer zijn er twee extra prompt en deze kun je gewoon (leeg) overnemen:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Aan het einde moet je nog twee maal ‘y’ opgeven:

Sign the certificate? [y/n]
1 out of 1 certificate requests certified, commit? [y/n]

Als alles goed is gegaan dan zie je de volgende melding:

Write out database with 1 new entries
Data Base Updated

Stap 6: Verplaatsen van Certificaten en Keys van de Server

Je moet de gegenereerde certificaat en key plaatsen in de directory van OpenVPN, daar deze zoekt in de ‘/etc/openvpn’ directory voor de CA, certificaat en key van de server:

cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

Alle stappen voor de OpenVPN server zijn nu klaar en je kunt deze nu opstarten en de status checken:

service openvpn start
service openvpn status

Stap 7: Genereren certificaten en keys voor de clients

Je kunt het beste voor elke client die gebruik wilt maken van je OpenVPN server een uniek certificaat en key genereren daar OpenVPN default geen meerdere connecties van hetzelfde certificaat/key paar toestaat. Dit betekent dat je onderstaande stappen voor elke client moeten uitvoeren. Ik gebruik hieronder als voorbeeld een client met de naam ‘henri’.

We gaan eerst de key voor de client bouwen:

cd /etc/openvpn/easy-rsa
./build-key henri

Er zal weer om ‘Distinguished Name’ waardes gevraagd worden en je kunt weer de defaults overnemen. Ook de twee extra prompt kun je gewoon (leeg) overnemen:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Aan het einde moet je nog twee maal ‘y’ opgeven:

Sign the certificate? [y/n]
1 out of 1 certificate requests certified, commit? [y/n]

Als alles goed is gegaan dan zie je de volgende melding:

Write out database with 1 new entries
Data Base Updated

Voer nu het volgende commando uit:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/henri.ovpn

We gaan nu de file ‘/etc/openvpn/easy-rsa/keys/henri.ovpn’ aanpassen. Zoek naar:

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194

Verander hierbij ‘your_server_ip’ naar de host-name waarop je OpenVPN server nu draait (en die bekend is in je DynDNS setting).

Zoek nu naar de volgende tekst ‘user nobody’ en ‘group nogroup’ en haal ; weer weg.

# Downgrade privileges after initialization (non-Windows only)
user nobody
group no group

Zoe nu naar de volgende regels en zet een ‘;’ voor de entries ‘ca’, ‘cert’ en ‘key’:

# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key

We maken geen gebruik van een tls-auth key dus commentarieer die uit met ;

# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1

Voer tenslotte de volgende commando’s uit:

echo '<ca>' >> /etc/openvpn/easy-rsa/keys/henri.ovpn
cat /etc/openvpn/ca.crt >> /etc/openvpn/easy-rsa/keys/henri.ovpn
echo '</ca>' >> /etc/openvpn/easy-rsa/keys/henri.ovpn

echo '<cert>' >> /etc/openvpn/easy-rsa/keys/henri.ovpn
cat /etc/openvpn/easy-rsa/keys/henri.crt >> /etc/openvpn/easy-rsa/keys/henri.ovpn
echo '</cert>' >> /etc/openvpn/easy-rsa/keys/henri.ovpn

echo '<key>' >> /etc/openvpn/easy-rsa/keys/henri.ovpn
cat /etc/openvpn/easy-rsa/keys/henri.key >> /etc/openvpn/easy-rsa/keys/henri.ovpn
echo '</key>' >> /etc/openvpn/easy-rsa/keys/henri.ovpn

Stap 8: Port-forward instellen op je router.

Je moet op je router nog een port-forward van poort ‘1194’ instellen naar het IP adres waarop je de OpenVPN server hebt draaien.

Stap 9: Installeren van client profiel op je iPhone

Installeer nu op je iPhone de OpenVPN App. Je moet ook nog de files ‘/etc/openvpn/easy-rsa/keys/henri.ovpn’ op je iPhone krijgen. Dit doe je door in iTunes naar je Device te gaan en in de Apps tab OpenVPN te selecteren. Scroll vervolgens naar beneden en voeg deze file toe aan het File Sharing window.




Synchroniseer tenslotte je iPhone met iTunes.

Een andere, eenvoudiger, manier is om je .ovpn file naar jezelf te emailen en dan op je iPhone te openen (dubbelklikken). Je moet deze dan vervolgens naar je ‘OpenVPN’ App sturen.

Als je nu OpenVPN opstart op je iPhone zal deze het nieuwe client profiel detecteren en kun je deze importen.




Je bent nu klaar en kunt op je iPhone client gebruik maken van je OpenVPN server thuis. Zoals je ziet een hele handleiding, maar als het eenmaal werkt heb je er geen omkijken meer naar en kun je voortaan een veilige verbinding naar thuis opzetten.

Addendum

Indien je de UFW firewall hebt geinstalleerd op je Debian based server moet je nog een aantal extra stappen uitvoeren. Zorg er eerst voor dat een aantal poorten open staan:

ufw allow ssh
ufw allow 1194/udp

Verder moeten we nog een UFW forwarding policy aanpassen in file ‘etc/default/ufw’. Zoek hier naar de volgende regel:

DEFAULT_FORWARD_POLICY="DROP"

en verander deze in:

DEFAULT_FORWARD_POLICY="ACCEPT"

Tenslotte moeten we nog wat regels toevoegen voor netwerk vertaling en IP masquerade van verbonden clients. Voeg de volgende regels toe aan de file ‘/etc/ufw/before.rules’

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Disable en Enable UFW weer met de commando’s:

ufw disable
ufw enable