Install your VPN server with pi-hole on OVH VPS in 30 min

Prereqs : You must have an SSH client (native Linux SSH command, or putty on windows… poor you), you must know how to edit a file in command line (using vim or nano, as you like), you must know how to use terminal menu (tab to switch options, space to select, enter to validate)
Port : This tutorial expect to run Openvpn on port 443 (SSL port), if you want to use another one, just replace 443 by the port you wish in the whole tutorial below.

Note : This is done using an OVH VPS, with Debian 9, other cloud VPS might differ if not default debian 9.

Note2 : This will allow all devices on VPN to communicate with each other (client to client options enabled by default, and firewall rules allows this as well) – If you want to block client to client communication, check this page

Order OVH VPS with latest Debian (VPS SSD, cheapest at CAD $4.49/month ! )
SSH to it. (credentials for SSH root in the email you receive after OS installation)

Update and Install tools we want (editors, firewall, auto updates) :

apt-get update
apt upgrade
apt install aptitude iptables-persistent vim curl unattended-upgrades

It should look like this :

(YES to save current IPv4 rules and YES to save current IPv6 fules when install iptables)

Replace /etc/resolv.conf file content with the following

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)

Configure iptables

We add the following content in /etc/iptables/rules.v4 (replace all the content using vim or another tool or remotely with filezilla)

#Generated by ourselves for pivpn and pi-hole
:INPUT ACCEPT [663907:41179802]
:FORWARD ACCEPT [57036644:76048011107]
:OUTPUT ACCEPT [5009068:528571183]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
#Don t change the port 443 in the 3 lines below, this is for pihole performance
-A INPUT -i tun0 -p tcp -m tcp --dport 443 -j REJECT --reject-with tcp-reset
-A INPUT -i tun0 -p udp -m udp --dport 80 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i tun0 -p udp -m udp --dport 443 -j REJECT --reject-with icmp-port-unreachable
#End of don t change these
#Port allowed for VPN, change if you decide to use another port for your VPN server (replace 443 below by whatever you chose)
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p udp -m udp --dport 443 -j ACCEPT
#End of port to change if you get your VPN server to run on another port
-A INPUT -i lo -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
#Completed on Sat Apr 27 16:18:39 2019
#Generated by iptables-save v1.6.0 on Sat Apr 27 16:18:39 2019
:PREROUTING ACCEPT [496992:46323248]
:INPUT ACCEPT [335723:24234770]
:OUTPUT ACCEPT [486171:32444728]
:POSTROUTING ACCEPT [491702:32816107]
#if you need to use 1 or more other port(s), just add as many line as below, whitout the # so it is actually loaded, ens3 is the NIC of the VPS, adjust if yours differ
#Below will allow to connect to port 8080 aside of 443.
#- A PREROUTING -i ens3 -p udp -m udp --dport 8080 -j REDIRECT --to-port 443
#Completed certainly after 2019 Apr 27t
iptables rules.v4 should look like above

Load the new rules as follow :

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

Install pi-vpn
adduser vpn (set a password of your choice)

Adding VPN user
 curl -L | bash

(if you have a name resolution issue, type the command again until it moves on)

The installer will transform your Raspberry Pi into an openvpn server (will do for your debian VPS too :P ) OK

the PiVPN need a static address, fine we are on VPS with assigned IP, OK

Since we think you are not using raspbian… correct, fine, OK

Choose user OK, select « vpn » that we just created and OK

It is recommended that you enable « unattended upgrade », OK, we already did this at the beginning

Do you want to enable unattended upgrades of security : NO (it is already done, no need to redo)

We want to use UDP protocol, Select UDP and OK

We modify the port to 443 as this will most likely will be allowed on most networks and OK

Are these settings correct : YES

YES to the next screen about Elliptic curves for key exchanges

Next, i’d recommend at least 384-bit encryption, safer, not crazy overhead. OK

Client can use the public IP, OK, this is totally fine as VPS has static IP (DNS is more useful in case of dynamic DNS use) – It should be the IP of YOUR VPS

Select DNS provider, this is a key point, we want the benefit of pi-hole on our VPN, so we’ll go down the list, and select « Custom » (go down with arrows on keyboard to select custom), then OK

Fill the info with and OK (this will be the IP of the openvpn server on tap0 that we allowed in firewall)

Are these settings ok ? YES

validate the end of installation OK

reboot the VPS – YES and confirm OK

After reboot, SSH again on it

We’ll generate a client certifacte
as root :
pivpn -a
provide a client name (like device name such as myphone1) and a password.
As shown, the client ovpn file will be placed in /home/vpn/ovpns/ (since we use the user « vpn » to handle VPN).

Copy this file using filezilla via SFTP(SSH) or cat on ovpn (cat /home/vpn/ovpns/user-you-chose.ovpn) and copy the content to a local ovpn file.

Open this file with openvpn application on your phone and connect :D
If on linux,

openvpn --config user-you-chose.ovpn

and it will connect.
You should be connected after providing the chosen password used when creating VPN user, and surf internet (when pi-hole below is installed too :P ) from your VPS with pi-hole filtering enabled !
go to to check the IP seen by websites (it should be the IP of your VPS).

Create as many users as you want ! Yes it’s free !
To delete a user : pivpn -r user
To see more options : pivpn

Done on VPN, but now we miss the pi-hole DNS filtering service, here we go (otherwise DNS resolution and filtering won’t work)

Install pi-hole, use the following command :

 curl -sSL | bash

(will install needed packages)

Enter on OK to start.

Enter on OK to pass donation page (donate if you want to support pihole project, it is amazing)

Select interface TUN0 (DNS server must listen on VPN interface)
We have a static IP, ok

Pick the DNS server you want above pihole (i pick Quad9, but anything is good as you like) and press ok

Pi-hole third party list, select all and press OK

Select Protocols, leave both IPv4 and IPv6 checked, OK

Do you want to use your current network settings, YES ! ( This should show the IP of YOUR VPS)

IP Conflict, OK…fine fine move on :P

Do you wish to install the web admin interface : OFF and OK (we don’t need it, we won’t connect to it, won’t open it)

Do you wish to install the web server (lighttpd) ? OFF and OK (not needed)

Do you want to log queries : OFF (no we don’t want to leave tracks…)

Select a privacy mode on FTP : 4 Disabled statistics (we are all about privacy here)

Firewall Detected, Install Pi-hole default firewall rules? NO, they are already in the iptables rules we copied

Configure your devices to use the pi-hole…. OK, we’ll do this in VPN config after.

We then want pi-hole to update its blacklist automatically everyday.
Create the file /etc/cron.daily/piholeupdate with the following content :

/usr/local/bin/pihole -g

Save and make it executable :

chmod +x /etc/cron.daily/piholeupdate

Done for pihole.

Enjoy !

Use the command « pivpn » to generate as many users as devices you have, install openvpn client on it (android, iOS, linux or windows or tunnelblick on MAC), and import the .ovpn file that you generated using the password you entered when creating user.

If one of your device is stolen or lost, revoke the certificate.

You can now browse internet, seen as your VPS, and no one can snoop on your traffic, without adds, without tracking :P (still take a canvas randomizer plugin for your browser to avoid device signature).

Security note : By default the OVH VPS is installed with a ROOT account and a password provided to you. Online servers are under attack on a permanent basis.
I recommend that you log on your VPS with an SSH private/public key instead of the password.
To do this, you need to generate a private/public key on your client machine (on linux, usually located in /home/your_user/.ssh/ If you have one, you can use it otherwise, generate one with the command « ssh-keygen -t rsa », then you copy the content of your local file to your VPS in the file /root/.ssh/authorized_keys)
Then try to ssh to the machine, ssh root@your_server, accepting he signature, you should be logged in without password
Now that we can SSH without password, we’ll disable the password authentication in SSH server. Edit the file /etc/ssh/sshd_config, and add the following line (if not already set) :
PasswordAuthentication no
Save and quit, restart the sshd server : service sshd restart
From this point, you can no longer login with a password, only the SSH key is accepted.
No more dictionary attack or password guessing. If ever you lose your local machine/private key, you can always go in the OVH console,through web management interface, and open the vKVM, to connect on the machine through the console with the root password. Enjoy.


dimanche, avril 28th, 2019 Technologie

3 Commentaires to Install your VPN server with pi-hole on OVH VPS in 30 min

  • David dit :

    Wow, after multiple tries and reading blog after blog, your tutorial actually worked. Thank you. I appreciate it.
    Is it possible you can show how to get the web page for pi-hole to work instead of disabling it?

  • Ajouter un commentaire

    Not f'd — you won't find me on Facebook
    avril 2019
    L M M J V S D

    Suivez moi sur twitter - follow me on twitter
    Follow on LinkedIn
    [FSF Associate Member]
    Free Software, Free Society
    Compacter une image virtualbox VDI
    Bon petit tutoriel esxi
    Marche d'appliances vmware
    Installer ESXi sur un disque IDE
    Installer ESXi 3.5 sur un disque USB
    Installer proxmox avec DRBD et migration / réplication à chaud
    Installer OSSEC avec VMware
    Information sur le VDI
    Ouvrir des ports dynamiquement iptables - knockd
    Autre tres bon tuto knockd
    Docs Arp poisoning - Anglais
    Metasploit test de pénétration
    Zone H - sites piratés en temps réel
    Blog invisible things
    Tips protection sécurité wordpress
    Pfsense - distribution firewall opensource - adsl internet failover
    Iproute 2 mini how to - linux advanced routing
    ClearOS - la passerelle sécuritaire lan - wan
    CDN - Accélération de la distribution de données
    drbd iscsi ocfs2 dm multipath tutoriel
    Load balancing LVS
    Load balancing opensource list
    HA-Proxy :
    HAproxy - http load balancer
    Simple tutoriel HAproxy
    HAproxy - debian tutoriel
    Centos - Ip failover
    Configuratoin DM-Multipath Redhat
    VMware Doubletake - continuité
    Quelques liens sur la réplication MySQL : Manuel MySQL, chapitre sur la réplication
    Manuel MySQL, Tutoriel clair sur la mise en place
    Autre tuto sur la mise en place de la réplication MySQL
    Références pour optimisation du serveur MySQL
    Utilisation de EXPLAIN mysql pour optimiser vos bases
    optimiser vos bases - requetes et index
    Un outil de clonage disque en reseau
    Internet NAS 250Go 250 accès VPN
    Server ISCSI avec Ubuntu tuto
    ISCSI centos redhat tutoriel
    Gérer et étendre un LVM
    Créer sa piratebox ! trop cool
    Deaddrops, les clés USB dans les murs, aussi cool !
    Télécharger Xenu
    Comment utiliser Xenu
    optimisation hébergement wordpress
    Super howto wordpress (En)
    Test de charge serveur web - Load impact
    Zeroshell - le mini-routeur wifi tout en un
    Retroshare, votre réseau d'échange crypté!
    Openvpn sur centos redhat
    Intégrer Linux dans active directory
    Routage inter-vlan avec Linux
    Routage avec OSPF
    Network Weathermap
    Boutons twitter
    Analyser les tendances des recherches Google
    Protocole sitemap - robots.txt
    Creer des animations CSS3
    Code php pour interagir avec twitter
    E reputation
    TRUCS ET ASTUCES GNU/LINUX : - Actus et tips linux
    Configurer GRUB2 et grub2 ici
    Panoet - en anglais - tips & tricks
    Readylines tips and trick pertinents
    Squid Clamav - proxy antivirus
    Apprendre Unix en 10 minutes
    13 tips sur les expressions régulières
    IE Sous linux IES
    LDAP 2.4 Quickstart guide
    Tutoriel LDAP
    Installation annuaire LDAP
    Serveur Mail Postfix - Dovecot - LDAP - MDS
    Créer un linux personnalisé en ligne - custom linux
    Super site sur linux - en
    Capistrano - déploiement automatisé
    Nagios tutoriel et doc
    Nagios plugin NRPE tuto
    Nagios plugin NRPE autre tuto
    Nagios plugin NRPE officiel
    Zabbix - fonctionnalités
    Zabbix - installation
    Guide MRTGsys - grapher la charge locale
    MRTGsys - ajouter des graphs
    MRTGsys - interpréter les données
    Shinken - Monitoring
    Thruk Monitoring webinterface
    Shinken - Tutoriel
    Shinken - Référence chez Nicolargo
    RemixJobs IT jobs
    USB Multiboot
    Reset mot de passe windows
    Java python et autres tips, intéressant !
    Forum inforeseau
    Open Clipart
    Excellent comic en ligne