Je suis en train de tester les machines virtuelles proposées par scaleway et il y a la possibilité de les prendre sans connectivité ipv4, ce qui permet de gagner 1 euro par VM.

J’ai donc mis en place un vpn avec tinc pour pouvoir faire sortir une machine sans ipv4 publique par une machine passerelle avec elle une adresse publique.

Machines en place

Serveur

Le serveur sera une machine OpenBSD 6.0 qui servira de passerelle. Son installation fait l’objet d’un précédent post.

Il a une adresse ipv4 publique et il redirigera le trafic réseau à l’origine de la ou les machines sans ipv4 vers internet. Il pourra aussi rediriger certains services vers ces vms.

Client

Le client peut être n’importe quelle machine qui possède un client tinc. Tout son trafic réseau qui ne sera pas pour une adresse du vpn passera par la machine passerelle. Dans notre cas ce sera une machine avec Debian Jessie.

Configuration

Tinc utilise un tunnel chiffré pour créer un réseau privé entre plusieurs machines. Il faudra donc installer tinc sur les machines et distribuer les clefs des machines. C’est un bon exercice pour un outil de gestion de configuration (cf. ansible).

On va créer un réseau privé 192.168.1.0/24. Le serveur aura pour ip 192.168.1.1 et le client 192.168.1.2. Le nom du réseau tinc sera private

Configuration du serveur

L’installation se fait avec doas pkg_add tinc.

On active le forwarding ip avec la commande sysctl net.inet.ip.forwarding=1.

Ensuite il faut créer le fichier de configuration /etc/tinc/private/tinc.conf

# Sample tinc configuration file

# This is a comment.
# Spaces and tabs are eliminated.
# The = sign isn't strictly necessary any longer, though you may want
# to leave it in as it improves readability :)
# Variable names are treated case insensitive.

# The name of this tinc host. Required.
Name = puffy

# The internet host to connect with.
# Comment these out to make yourself a listen-only connection
# You must use the name of another tinc host.
# May be used multiple times for redundance.
#ConnectTo = beta

# The tap device tinc will use.
# /dev/tap0 for ethertap, FreeBSD or OpenBSD
# /dev/tun0 for Solaris
# /dev/net/tun for Linux tun/tap
Device = /dev/tap0

Mode = switch

Il faut aussi créer le fichier de configuration de l’interface du vpn.

#!/bin/sh
# This file sets up the tap device.
# It gives you the freedom to do anything you want with it.
# Use the correct name for the tap device:
# The environment variable $INTERFACE is set to the right name
# on most platforms, but if it doesn't work try to set it manually.

# Give it the right ip and netmask. Remember, the subnet of the
# tap device must be larger than that of the individual Subnets
# as defined in the host configuration file!
ifconfig $INTERFACE 192.168.1.1 netmask 255.255.255.0

On met en place le nat, tout ce qui arrive de l’interface du vpn (tap:0) est naté sur l ‘interface publique (vio0:0) :

#       $OpenBSD: pf.conf,v 1.54 2014/08/23 05:49:42 deraadt Exp $
#
# See pf.conf(5) and /etc/examples/pf.conf

set skip on lo

block return    # block stateless traffic
pass            # establish keep-state

# By default, do not permit remote connections to X11
block return in on ! lo0 proto tcp to port 6000:6010

pass out on vio0 from tap0:network to any nat-to (vio0:0)
match out on vio0 from tap0:network to any nat-to (vio0:0)

Configuration du client

Tout le trafic du client passera par le serveur. Il faut modifier sa passerelle par défaut tout en conservant une route permettant de joindre le serveur vpn.

Le fichier /etc/tinc/private/tinc.conf est assez simple :

Name = pecan
AddressFamily = ipv4
Interface = tun0
Device = /dev/net/tun
Mode = switch

Par contre le fichier de configuration de l’interface du vpn est un peu plus compliqué et nécessite des explications.

1!/bin/sh
2ifconfig $INTERFACE 192.168.1.2 netmask 255.255.255.0
3
4VPN_GATEWAY=192.168.1.1
5ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
6REMOTEADDRESS=42.3.56.83
7ip route add $REMOTEADDRESS $ORIGINAL_GATEWAY
8ip route del default $ORIGINAL_GATEWAY
9ip route add default via $VPN_GATEWAY
  • 2 : configure l’interface du vpn avec l’adresse 192.168.1.2
  • 4, 5, 6 : définissent des variables pour le script
    • 4 : l’adresse privée de la passerelle du vpn (qui sera la nouvelle passerelle)
    • 5 : la passerelle actuelle qu’il nous faut garder
    • 6 : l’adresse publique du serveur vpn
  • 7 : on ajoute une route vers l’adresse publique du vpn passant par la passerelle actuelle, hors vpn
  • 8 : on supprime la passerelle par défaut
  • 9 : on ajoute la passerelle par défaut, c’est à dire l’adresse du vpn