Home

Awesome

<!-- MIT License Copyright (c) 2019 Rémi Ducceschi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE -->

License: MIT

VPN Manager

Script to easily manage OpenVPN and create a firewall kill switch with UFW.

It allows easy start and stop of the VPN connection and the kill switch, and easy change of the VPN server.

Current version is bounded to OpenVPN, though it is easy to make it work with other VPN as only a small subset of code is concerned. More information below.

Installation

Configuration

Usage

Use another VPN provider

Installation

You need to install the following packages:

<!-- - dnsmasq - resolvconf--> <!-- To be able to use the box as a router, you need to run: ```bash sudo modprobe ipt_MASQUERADE ```-->

Configuration

Below, we assume that your computer is connected to internet via the interface enp1s0, that the VPN interface is called tun0, and that you are on the local network 192.168.1.0/24.

If it is not the case, change the values below.

Firewall (ufw)

First, create the firewall rules:

As root

# global rules
ufw default deny incoming
ufw default deny outgoing
ufw default allow routed
# kill switch
ufw allow in on enp1s0 from 192.168.1.0/24
ufw allow out on enp1s0 to 192.168.1.0/24
# bypass killswitch
ufw allow in on enp1s0
ufw allow out on enp1s0
# VPN
ufw allow in on tun0
ufw allow out on tun0

Thus, when we start the VPN, we just have to delete the 2 bypassing rules and add one to authorize traffic to VPN server only. This will create a kill switch as as soon as we can't connect to the VPN server, all traffic will be stopped.

This is automatically done thanks to vpn-mgr.sh.

OpenVPN

We need to create a file with our VPN credentials, so OpenVPN can connect to VPN server by itself. Replace EMAIL and PASSWORD with your credentials.

Note that it is important that the file is created in /etc/openvpn/. If you want to change the filename, you'll have to change the variable AUTHFILE in vpn-mgr.sh.

As root

echo "EMAIL" > /etc/openvpn/nordvpn_authentication
echo "PASSWORD" >> /etc/openvpn/nordvpn_authentication
chmod a-rwx,u=r /etc/openvpn/nordvpn_authentication

You now need to copy the files etc/default/openvpn, etc/openvpn/update-resolv-conf and etc/sysctl.d/00_tun0_noipv6.conf in the proper folders (respectively /etc/default/openvpn, /etc/openvpn/update-resolv-conf and /etc/sysctl.d/00_tun0_noipv6.conf).

The first file is the configuration for OpenVPN. The only interesting line is AUTOSTART="nordvpn" which allows OpenVPN to automatically connect to a VPN server, which configuration file is in /etc/openvpn/nordvpn.conf. This file will be automatically generated by vpn-mgr.sh

The second file is used to prevent DNS leak.

The last file is to avoid ipv6 leaks as NordVPN doesn't support ipv6.

Finally, to automatically start OpenVPN on boot, we enable its service:

systemctl enable openvpn

vpn-mgr.sh

You can put the file vpn-mgr.sh wherever it is the most convenient for you. A good folder would be in /usr/local/sbin/.

You can update the following variables (at the top of the file) with your values:

Usage

You need to be root to use vpn-mgr.sh.

You can run vpn-mgr.sh help to see the full help. Briefly, you can invoke it with the following commands:

More infornation on the set command.

You can chose which server to use for NordVPN here: https://nordvpn.com/servers/tools/.

vpn-mgr.sh set se203

This will automatically use the VPN server se203.nordvpn.com. What happens exactly:

You then need to wait around 30 seconds before Internet comes back on the new server.

Use another VPN provider

This script has been created because the NordVPN app on Linux is not free (open source), and is widely bugged (lots of crashes).

This solution uses widely known tools (OpenVPN and UFW), and as far as I used it, it didn't crashed yet...

Now, if you want to use this script with another VPN provider, you only have to change the vpn-mgr.sh script a bit. Indeed, only these 2 functions are bounded to NordVPN:

These functions are 10 lines length so it should be very easy to use another provider. The main reason why it is not already here is because I only used NordVPN so far...

Feel free to contribute :)