VPS + Wireguard + Mikrotik : accédez à vos serveurs locaux !

Voici une config demandée par un client :

Il utilise :

  • un serveur Wireguard hébergé sur un VPS Pulseheberg
  • une connexion internet gérée par un routeur Mikrotik
  • plusieurs serveurs locaux avec pas mal d’applications dédiées sous Linux, Docker, etc.

Pour simplifier la configuration, un script a été créé pour envoyer les commandes au Mikrotik :

#!/bin/bash

# Ce script génère les lignes à saisir sur Mikrotik Router OS 7
# pour arriver sur le wireguard du Mikrotik via un port externe du tunnel
# et se connecter à une IP locale, accessible depuis le routeur Mikrotik
# sur un port de destination précis
#
# #############################################################################
# #                               SCHÉMA DE PRINCIPE                          #
# #############################################################################
# #                                                                           #
# #      INTERNET (Utilisateur)                                               #
# #          |                                                                #
# #          | Requête sur vpn.monserveur.com:[EXT_PORT]                      #
# #          v                                                                #
# #  +-----------------------------+                                          #
# #  |       VPS (Linux)           |                                          #
# #  |  [ IP Publique : X.X.X.X ]  |                                          #
# #  |                             |                                          #
# #  |  (Serveur WireGuard)        | <--- Interface wg0 (10.10.20.1)          #
# #  +--------------|--------------+                                          #
# #                 |                                                         #
# #        [ TUNNEL WIREGUARD ]    <--- Flux Chiffré                          #
# #                 |                                                         #
# #  +--------------|--------------+                                          #
# #  |   MIKROTIK (RouterOS 7)     | <--- Interface [WG_INT] (10.10.20.2)     #
# #  |                             |                                          #
# #  |  1. DST-NAT (Ext -> Int)    | (Vers $DEST_IP:$DEST_PORT)               #
# #  |  2. SRC-NAT (Masquerade)    | (Assure le retour via le tunnel)         #
# #  |  3. FILTER (Forward)        | (Autorise le passage)                    #
# #  +--------------|--------------+                                          #
# #                 |                                                         #
# #         [ RÉSEAU LOCAL ]       <--- Switch / LAN                          #
# #                 |                                                         #
# #  +--------------|--------------+                                          #
# #  |     SERVEUR LOCAL           |                                          #
# #  |    ($DEST_IP)               | <--- Reçoit sur $DEST_PORT               #
# #  +-----------------------------+                                          #
# #                                                                           #
# #############################################################################

echo "--- Configuration de redirection MikroTik via WireGuard ---"

# Fonction pour forcer une saisie non vide
ask_required() {
    local prompt_text=$1
    local var_name=$2
    local input=""
    while [[ -z "$input" ]]; do
        read -p "$prompt_text : " input
        if [[ -z "$input" ]]; then
            echo "Erreur : Ce champ est obligatoire. Veuillez saisir une valeur."
        fi
    done
    eval "$var_name=\"$input\""
}

# Demande des informations avec validation
ask_required "IP de destination locale (ex: 192.168.1.182)" DEST_IP
ask_required "Port de destination local (ex: 80)" DEST_PORT
ask_required "Port externe (sur le tunnel) arrivant sur le Mikrotik (ex: 8097)" EXT_PORT
ask_required "Nom de l'interface WireGuard sur le Mikrotik (ex: wireguard-client)" WG_INT

# Génération du bloc de commande
echo ""
echo "------------------------------------------------------------"
echo " COPIEZ ET COLLEZ LES COMMANDES CI-DESSOUS DANS MIKROTIK :"
echo "------------------------------------------------------------"
echo ""

cat << EOF
# 1. Destination NAT (Redirection entrante)
/ip firewall nat
add chain=dstnat action=dst-nat to-addresses=$DEST_IP to-ports=$DEST_PORT \\
    protocol=tcp in-interface=$WG_INT dst-port=$EXT_PORT \\
    comment="Redirection $EXT_PORT vers $DEST_IP:$DEST_PORT"

# 2. Source NAT (Masquerade pour le retour des paquets)
/ip firewall nat
add chain=srcnat action=masquerade dst-address=$DEST_IP \\
    protocol=tcp dst-port=$DEST_PORT \\
    comment="Masquerade retour pour $DEST_IP"

# 3. Autorisation dans le Firewall (Forward)
/ip firewall filter
add chain=forward action=accept connection-nat-state=dstnat \\
    in-interface=$WG_INT \\
    comment="Autoriser flux NAT via $WG_INT"
EOF

echo ""
echo "------------------------------------------------------------"

Vous allez donc obtenir les lignes de commande nécessaires pour qu’une demande arrivant sur le port Eth1 du Mikrotik, avec un port spécifique, soit redirigée vers une IP et le bon port de destination.

Prenons un exemple, avec un serveur Web local sur 192.168.1.90, port 80.
Voici les commandes à entrer dans le Mikrotik :

# 1. Destination NAT (Redirection entrante)
/ip firewall nat
add chain=dstnat action=dst-nat to-addresses=192.168.1.90 to-ports=80 \
    protocol=tcp in-interface=wg0 dst-port=8080 \
    comment="Redirection 8080 vers 192.168.1.90:80"

# 2. Source NAT (Masquerade pour le retour des paquets)
/ip firewall nat
add chain=srcnat action=masquerade dst-address=192.168.1.90 \
    protocol=tcp dst-port=80 \
    comment="Masquerade retour pour 192.168.1.90"

# 3. Autorisation dans le Firewall (Forward)
/ip firewall filter
add chain=forward action=accept connection-nat-state=dstnat \
    in-interface=wg0 \
    comment="Autoriser flux NAT via wg0"

Pour la configuration du VPS, installons Apache2, Let’s Encrypt pour obtenir une connexion SSL sécurisée, dans cet exemple sur le port 8070, et allons éditer par exemple : etc/apache2/sites-enabled/vpn-proxy.conf :

<VirtualHost *:8070>
    ServerName vpn.monserveur.com

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/vpn.monserveur.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/vpn.monserveur.com/privkey.pem

    ProxyPreserveHost On
    ProxyRequests Off

    # Redirection vers le serveur local via WireGuard
    ProxyPass / http://10.20.20.2:8080/
    ProxyPassReverse / http://10.20.20.2:8080/

    ProxyPass /api/live/ ws://10.20.20.2:8080/api/live/
    ProxyPassReverse /api/live/ ws://10.20.20.2:8080/api/live/

</VirtualHost>

Allons maintenant éditer /etc/apache2/ports.conf et ajoutons une simple ligne :

Listen 8070

Cela mettra votre serveur Apache 2 en écoute du port 8070, utilisé pour notre exemple, en plus des autres ports.

Vous allez alors pouvoir tout activer et relancer Apache 2 :

a2enmod ssl proxy proxy_http proxy_wstunnel
a2ensite vpn-proxy.conf
systemctl restart apache2

Vous allez désormais pouvoir accéder à votre serveur local, 192.168.1.90, sur son port 80 (ou autre), en demandant https://vpn.monserveur.com:8070 : le VPS reçoit la demande du port 8070, la dirige sur le Mikrotik port 8080 via un tunnel sécurisé, Mikrotik qui va alors convertir vers le bon port de destination : 80. Vous avez désormais accès à votre serveur local depuis internet !

Publications similaires

  • Sat2way : précisions

    Une petite précision concernant Sat2way : en précisant le code « infracom44 » lors de votre commande en ligne ou par téléphone, vous indiquez simplement venir de la part d’Infracom, sur nos conseils. Toutefois, depuis les nouvelles offres, vous ne recevez plus 40 €, un choix de Sat2way qui a modifié sa politique commerciale vis à vis des revendeurs, ce qui nous désolé un petit peu pour tout dire. Il aurait été par exemple commercialement agréable de pouvoir accorder ces 40 €…

  • SkyDSL : la facture… ou presque…

    On n’arrête pas le progrès chez SkyDSL, voici un extrait d’une facture reçue ce matin : Alors, reprenons : 19.90 + 3.18 € de TVA, cela fait donc… 89.90 € ! Tout va bien, tout va très bien, mon professeur de math vient d’avaler une équerre pour se suicider 😉 Je pense avoir du mal à pouvoir passer une telle pièce en comptabilité et justifier d’un versement de 89,90 € en cas de contrôle fiscal… Attendons du coup une facture rédigée…

  • Jura & haut-débit… déception et colère

    Un article du Progrès évoque les déboires de nombreuses communes du Juras, isolées du haut débit, impossibles à raccorder en Wimax, ou alors avec trop de problèmes que cela en deviendrait hélas presque risible. Un article édifiant sur toutes ces promesses Wimax non tenues en France, et quelque part un constat d’échec que je me dois hélas de partager quant à cette technologie. Source : Le Progrès

  • Atlanta : ouverture du réseau Wimax

    Clear Wireless a annoncé l’ouverture du réseau Wimax d’Atlanta. Activé depuis 6 semaines environ, l’ouverture des abonnements n’a commencé que récemment. Quelques zones d’ombre subsistent mais devraient être rapidement couvertes. Les abonnés au service Wimax Clear peuvent donc désormais profiter d’une couverte dans plusieurs villes importantes : Portland, Las Vegas, et Atlanta… en attendant d’autres villes américaines. Et nous en France ? 🙂 Source : AJC

  • Peekfon : les emails partout en Europe

    Fon, bien connu pour ses AP à bas prix et ses accès WiFi hors de prix, va prochainement lancer Peekfon, un terminal mobile Peek ressemblant à un téléphone, mais n’offrant que la fonction email. Le terminal sera commercialisé au prix de 99 €, incluant 6 mois d’abonnement illimité en Europe, sans limitations, sans frais cachés, dixit Fon depuis le blog de son fondateur, Martin Varsavsky. Au delà, l’abonnement vous sera facturé 12.90 €/mois, sans engagement ni frais de résiliation !…

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.