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 !





