Vendredi 23 novembre 2018 (Modifié le Vendredi 23 novembre 2018)

2017-06-17-OpenVPN-IPV6-sur-IPV4

Créer un serveur OpenVPN sur Ubuntu pour fournir un tunnel IPv6 sur IPv4

J’utilise mon ordinateur portable à partir de divers endroits . Il est important de toujours avoir la même configuration LAN / Internet partout et la meilleure solution pour y parvenir est l’utilisation d’un VPN.

Si vous disposez d’un serveur dédié connecté à Internet via un système d’exploitation Linux, cela peut être réalisé facilement et gratuitement avec OpenVPN. Les clients OpenVPN sont disponibles sur presque toutes les plates-formes, Linux, MacOS, Windows, Android et iOS. Si votre serveur a une connectivité IPv6, vous pouvez également en profiter, même si tout ce que vous avez est une connexion IPv4 avec beaucoup de restrictions.

Toutes les commandes doivent être exécutées en tant que root.

Nous considérons que le serveur possède IPv4 1.2.3.4 externe et IPv6 aaaa: bbbb: cccc: dddd :: / 64 sur l’interface eth0. Le sous-réseau aaaa: bbbb: cccc: dddd: 80 :: / 112 est attribué aux clients VPN sur l’interface tun0.

Activer NAT et NDP proxy

La première étape consiste à activer NAT pour IPv4 et NDP proxy pour IPv6. Nous pourrions faire du NAT avec IPv6 mais cela ne sert à rien car seule l’adresse IP du serveur VPN serait accessible à l’extérieur. Le proxy NDP est le seul moyen de rendre les clients directement accessibles depuis Internet à l’aide de leur adresse IPv6.

Tout d’abord, permettez au noyau du serveur de transférer le trafic des périphériques clients vers Internet.

nano /etc/sysctl.conf

Décommenter/ajouter les lignes suivantes:

	...
net.ipv4.ip_forward=1
	...
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp = 1
	...
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
	...
net.ipv4.conf.all.send_redirects = 0
	...

Maintenant, nous pouvons activer NAT pour IPv4 (considérant que eth0 est l’interface connectée à Internet):

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables-save > /etc/iptables.rules

Pour activer NAT à nouveau après le redémarrage, créez le script suivant:

nano /etc/network/if-up.d/iptables
#!/bin/sh
iptables-restore < /etc/iptables.rules

Rendre le script exécutable.

chmod +x /etc/network/if-up.d/iptables

Vous pouvez maintenant redémarrer les services de réseau

sysctl -p
/etc/init.d/networking restart

Installation openvpn

OpenVpn sur debian jessie

Configuration du serveur

Voici un exemple de configuration pour les paramètres suivants:

  • Connectivité IPv6 complète sur IPv4.
  • Connexion IPv4 UDP au port 1194. Le paramètre par défaut (UDP 1194) peut offrir de meilleures performances mais peut être bloqué sur certaines connexions telles que les réseaux mobiles.
  • Les clients peuvent communiquer entre eux .
  • Correction d’adresses IP pour certains clients spécifiques, par exemple pour l’ordinateur portable sur lequel le serveur Web du site de développement fonctionne.
  • NDP proxying est activé sur demande à l’aide de scripts de connexion client et fournit un accès bidirectionnel à Internet aux clients.

37.235.49.24
2a03:f80:354:37:235:49:24:0/112

Tout d’abord, créez un utilisateur vpn pour le démon:

useradd -r -s /bin/false vpn

Créez le répertoire de configuration du client:

mkdir /etc/openvpn/ccd

Créez un fichier de variables OpenVPN qui sera utilisé par les scripts de connexion client. Modifiez le préfixe de sous-réseau tunnel par le vôtre:

nano /etc/openvpn/variables
# Tunnel subnet prefix
prefix=2a03:f80:354:37:235:49:80:
# netmask
prefixlen=112

Créez les scripts server-clientconnect.sh et server-clientdisconnect.sh. Ces scripts créeront et supprimeront les règles de proxy NDP pour chaque connexion client .

server-clientconnect.sh

nano /etc/openvpn/server-clientconnect.sh
#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file  
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ \t]+([0-9a-fA-F\\:]+).*$/\1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eth0

server-clientdisconnect.sh

nano /etc/openvpn/server-clientdisconnect.sh
#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file  
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ \t]+([0-9a-fA-F\\:]+).*$/\1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Delete proxy rule
/sbin/ip -6 neigh del proxy $ipv6 dev eth0

Rendre les scripts exécutables.

chmod +x /etc/openvpn/server-clientconnect.sh
chmod +x /etc/openvpn/server-clientdisconnect.sh

OpenVPN a besoin de privilèges root pour exécuter les scripts afin d’ajouter ce qui suit dans le fichier sudoers:

visudo
# OpenVPN
Defaults:vpn env_keep += "ifconfig_pool_remote_ip common_name"
vpn ALL=NOPASSWD: /etc/openvpn/server-clientconnect.sh
vpn ALL=NOPASSWD: /etc/openvpn/server-clientdisconnect.sh

Création du fichier de configuration principal:

nano /etc/openvpn/server.conf
# Listen port
port 1194
# Protocol
proto udp
# IP tunnel
dev tun0
tun-ipv6
push tun-ipv6
# Master certificate
ca ca.crt
# Server certificate
cert server.crt
# Server private key
key server.key
# Diffie-Hellman parameters
dh dh.pem
# Allow clients to communicate with each other
client-to-client
# Client config dir
client-config-dir /etc/openvpn/ccd
# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"
# Server mode and client subnets
server 10.8.0.0 255.255.255.0
server-ipv6 2a03:f80:354:37:235:49:80:/112
topology subnet
# IPv6 routes
push "route-ipv6 2a03:f80:354:37:235:49::/64"
push "route-ipv6 2000::/3"
# DNS (for Windows)
# These are OpenDNS
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
# Configure all clients to redirect their default network gateway through the VPN
push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway ipv6" #For iOS
# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun
# Ping every 10s. Timeout of 120s.
keepalive 10 120
# Enable compression
comp-lzo
# User and group
user vpn
group vpn
# Log a short status
status openvpn-status.log
# Logging verbosity
verb 4