===== OpenVPN with a 6in4 tunnel for Debian 10 (Buster) =====
Adapted from [[https://wiki.quietlife.nl/doku.php?id=manuals:networking:openvpn-6in4|Quietlife wiki]] to reflect changes in easy-rsa distributed by Debian 10.
\\
==== Server installation ====
Install the packages:
sudo apt install openvpn easy-rsa
Copy an example config file:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | \
sudo tee /etc/openvpn/server.conf
Some example values are used. The WAN IP addresses ''111.222.333.444/32'' and ''2001:1:2:3:4:5:6::/64'' are made up. Also, ethernet interface ''enp0s25'' will very likely be different on your system.\\
\\
==== Main server configuration ====
# Listen on UDP port 1194
port 1194
proto udp
proto udp6
# Use a tun device and push an IPv6 tunnel to clients
dev tun
# Certificate settings
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
# Create subnets for the clients
topology subnet
server 10.8.0.0 255.255.255.0
server-ipv6 2001:1:2:3:80::/112
# Have all traffic go through the VPN
push "redirect-gateway def1 bypass-dhcp"
## OpenDNS is used in this example, but anything reachable by the VPN server will work
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
# Allow direct client-to-client connections
client-to-client
# Ping every 10 seconds, assume disconnect after 120 seconds
keepalive 10 120
# TLS parameters
## This is the server
tls-auth ta.key 0
key-direction 0
## Use strong ciphers
cipher AES-256-CBC
auth SHA512
# Run the daemon with minimal privileges
user nobody
group nogroup
persist-key
persist-tun
# Logging settings
status openvpn-status.log
verb 3
explicit-exit-notify 1
\\
==== Networking configuration ====
Allow packet forwarding and enable the IPv6 neighbour detection proxy:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp=1
Load the kernel parameters:
sudo sysctl -p
\\
=== SLAAC ===
If your server gets its IPv6 configuration through SLAAC, also do this:
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_ra=2
Load the kernel parameters:
sudo sysctl -p
Force acceptance of router advertisements for the WAN ethernet interface:
# This setting is not inherited from 'all' or 'default' when the interface is already up.
# It will be inherited after the next reboot, so this only has to be done once.
sudo su -c 'echo 2 > /proc/sys/net/ipv6/conf/enp0s25/accept_ra'
\\
=== Firewall rules ===
Allow masquerading for the OpenVPN subnet:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o enp0s25 -j MASQUERADE
COMMIT
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 2001:1:2:3:80::/112 -o enp0s25 -j MASQUERADE
COMMIT
Don't drop forwarded packets:
DEFAULT_FORWARD_POLICY="ACCEPT"
Allow incoming connections on UDP port 1194 and restart the firewall:
sudo ufw allow 1194/udp
sudo ufw disable && sudo ufw enable
\\
==== Setting up your own certificate authority ====
Create a working directory:
cd
make-cadir openvpn-ca
cd openvpn-ca/
Fill in these variables as desired (saves time):
export KEY_COUNTRY="..."
export KEY_PROVINCE="..."
export KEY_CITY="..."
export KEY_ORG="..."
export KEY_EMAIL="..."
export KEY_OU="..."
Clean the directory:
./easyrsa init-pki
Build a certificate authority:
./easyrsa build-ca nopass
Build a server key called ''server'':
./easyrsa build-server-full server nopass
Build a Diffie-Hellman key:
./easyrsa gen-dh
Generate a pre-shared key:
/usr/sbin/openvpn --genkey --secret pki/ta.key
Copy the generated keys to the server configuration directory:
cd pki/
sudo cp ca.crt private/ca.key issued/server.crt private/server.key ta.key dh.pem /etc/openvpn/
sudo mv /etc/openvpn/dh.pem /etc/openvpn/dh2048.pem
Restart the server:
sudo systemctl daemon-reload
sudo systemctl restart openvpn@server.service
\\
==== Creating configuration files automatically ====
Create a working directory next to ''openvpn-ca'':
cd ../../
mkdir -p client-configs/files/
cd client-configs/
\\
=== Client configuration ===
Add a base configuration file for your clients:
# Specify that we are a client
client
# Use the same setting as you are using on the server
dev tun
# Connect to the server on UDP port 1194
proto udp
remote vpn.quietlife.nl 1194
# Run the daemon with minimal privileges
user nobody
group nogroup
# Unset these defaults (certificates will be provided by the .ovpn file)
#ca ca.crt
#cert client.crt
#key client.key
# Use strong ciphers
cipher AES-256-CBC
auth SHA512
# This is the client
key-direction 1
# Run these scripts after connecting (sets up DNS)
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DNSSEC allow-downgrade
dhcp-option DOMAIN-ROUTE .
\\
=== Build script ===
Add a configuration build script:
#!/bin/bash
KEY_DIR=../openvpn-ca/pki
OUTPUT_DIR=./files
BASE_CONFIG=./base.conf
cat ${BASE_CONFIG} \
<(echo -e '') \
${KEY_DIR}/ca.crt \
<(echo -e '\n') \
${KEY_DIR}/issued/${1}.crt \
<(echo -e '\n') \
${KEY_DIR}/private/${1}.key \
<(echo -e '\n') \
${KEY_DIR}/ta.key \
<(echo -e '') \
> ${OUTPUT_DIR}/${1}.ovpn
Make it executable:
chmod 770 ./make_config.sh
\\
==== Generating client certificates and configurations ====
Create and store a new password for the client, for example using ''[[start:pass|pass]]'' (on your laptop):
pass generate --clip openvpn/$name-clientkey 20
Build a client certificate with password:
cd ~/openvpn-ca/
./easyrsa build-client-full $name
Create a client configuration file:
cd ../client-configs/
./make_config.sh $name
The resulting configuration will be in ''client-configs/files/$name.ovpn''
Copy this to your client with SFTP. Repeat as many times as desired.\\
\\
==== Revoking a client certificate ====
Revoke the certificate:
cd ~/openvpn-ca/
./easyrsa revoke $name
./easyrsa gen-crl
Copy the revocation list to the server configuration directory:
sudo cp ./pki/crl.pem /etc/openvpn/
Make sure that the OpenVPN server configuration file contains this line:
crl-verify crl.pem
Then restart the server:
sudo systemctl restart openvpn@server
\\
==== Client installation ====
Use the password you generated earlier (on laptop):
pass --clip openvpn/$name-clientkey
=== GNU/Linux (Debian) ===
sudo apt install network-manager-openvpn-gnome
Then simply import the ''.ovpn'' file and use the password.
\\
For more information, see [[https://help.gnome.org/users/gnome-help/stable/net-vpn-connect.html|GNOME Help on Connecting to VPN]] (In step 5, choose ''Import from file'').
=== Android ===
Install and open [[https://f-droid.org/en/packages/de.blinkt.openvpn|OpenVPN for Android]].
Then simply import the ''.ovpn'' file and use the password.
----