Déployer un VPN sur des serveurs headless
FreeGuard CLI fonctionne nativement sur les serveurs Linux headless sans environnement de bureau requis. Que vous sécurisiez une instance cloud, protégiez un laboratoire domestique ou acheminiez le trafic de conteneurs via VPN, ce guide couvre l'installation, l'authentification, la configuration du service et la surveillance pour les déploiements en production.

Déployer un VPN sur des serveurs headless

FreeGuard CLI fonctionne nativement sur les serveurs Linux headless sans environnement de bureau requis. Que vous sécurisiez une instance cloud, protégiez un laboratoire domestique ou acheminiez le trafic de conteneurs via VPN, ce guide couvre l’installation, l’authentification, la configuration du service et la surveillance pour les déploiements en production.

Pourquoi exécuter un VPN sur un serveur ?

Les serveurs gèrent du trafic sensible : connexions aux bases de données, appels API, transferts de sauvegardes et communication inter-services. Exécuter un VPN sur le serveur lui-même garantit que tout le trafic sortant est chiffré sans configurer les applications individuellement.

Cas d’utilisation courants :

  • Instances cloud accédant à des API géo-restreintes
  • Runners CI/CD nécessitant une identité réseau constante
  • Services auto-hébergés bénéficiant du masquage d’IP
  • Serveurs de développement utilisés par des équipes distribuées

Installation

Ubuntu / Debian

curl -fsSL https://cli.freeguard.com/install.sh | bash

Ou installer depuis le dépôt APT :

curl -fsSL https://cli.freeguard.com/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/freeguard.gpg
echo "deb [signed-by=/usr/share/keyrings/freeguard.gpg] https://apt.freeguard.com stable main" | sudo tee /etc/apt/sources.list.d/freeguard.list
sudo apt update
sudo apt install freeguard-cli

CentOS / RHEL / Fedora

curl -fsSL https://cli.freeguard.com/install.sh | bash

Ou utiliser le dépôt RPM :

sudo rpm --import https://cli.freeguard.com/gpg.key
sudo tee /etc/yum.repos.d/freeguard.repo <<EOF
[freeguard]
name=FreeGuard CLI
baseurl=https://rpm.freeguard.com/stable
gpgcheck=1
gpgkey=https://cli.freeguard.com/gpg.key
EOF
sudo yum install freeguard-cli

Alpine Linux

curl -fsSL https://cli.freeguard.com/install.sh | bash

Les utilisateurs d’Alpine devront peut-être installer libc6-compat d’abord :

apk add libc6-compat
curl -fsSL https://cli.freeguard.com/install.sh | bash

Vérifier l’installation

freeguard --version

Authentification headless

Sur les serveurs sans navigateur, vous ne pouvez pas utiliser le flux de connexion OAuth par défaut. FreeGuard CLI fournit une authentification par e-mail pour les environnements headless.

Connexion par e-mail

freeguard login --method email

Le CLI vous demande de saisir l’e-mail de votre compte. Un code de vérification est envoyé à cette adresse. Entrez le code dans le terminal pour terminer l’authentification.

$ freeguard login --method email
Enter your email: [email protected]
Verification code sent. Check your inbox.
Enter code: 483291
Login successful.

Connexion par token

Pour les déploiements automatisés, utilisez un token de service :

freeguard login --method token --token YOUR_SERVICE_TOKEN

Générez des tokens de service depuis votre tableau de bord. Les tokens peuvent être limités à des serveurs spécifiques et avoir une expiration configurable.

Vérifier l’authentification

freeguard status --json | jq '.authenticated'

Exécution en tant que service systemd

Pour les déploiements en production, exécutez FreeGuard CLI en tant que service systemd afin qu’il démarre au boot et redémarre en cas d’échec.

Créer le fichier de service

sudo tee /etc/systemd/system/freeguard.service <<EOF
[Unit]
Description=FreeGuard VPN
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/freeguard connect --server us-east --no-color
ExecStop=/usr/local/bin/freeguard disconnect
Restart=on-failure
RestartSec=10
User=root

[Install]
WantedBy=multi-user.target
EOF

Activer et démarrer

sudo systemctl daemon-reload
sudo systemctl enable freeguard
sudo systemctl start freeguard

Vérifier le statut du service

sudo systemctl status freeguard

Consulter les logs

sudo journalctl -u freeguard -f

Scripting avec --json et --no-color

Les scripts de production doivent analyser une sortie structurée plutôt que du texte lisible par l’homme.

Sortie JSON

Chaque commande prend en charge --json :

# Connection status
freeguard status --json

Sortie :

{
  "connected": true,
  "server": "us-east-1",
  "server_name": "New York",
  "protocol": "hysteria2",
  "uptime": 86400,
  "bytes_sent": 1048576,
  "bytes_received": 5242880
}

Mode sans couleur

Supprimez les codes de couleur ANSI pour des fichiers de log propres :

freeguard status --no-color >> /var/log/freeguard-status.log

Exemple de script

Un script de vérification de santé qui se reconnecte en cas d’échec :

#!/bin/bash
STATUS=$(freeguard status --json 2>/dev/null)
CONNECTED=$(echo "$STATUS" | jq -r '.connected')

if [ "$CONNECTED" != "true" ]; then
  echo "$(date): VPN disconnected, reconnecting..." >> /var/log/freeguard-health.log
  freeguard connect --server us-east --json >> /var/log/freeguard-health.log 2>&1
fi

Ajoutez-le à cron pour des vérifications régulières :

# Check VPN health every 5 minutes
*/5 * * * * /opt/scripts/freeguard-health.sh

Surveillance et vérifications de santé

Vérification de santé basique

freeguard status --json | jq -r '.connected'

Retourne true ou false. Suffisamment simple pour n’importe quel système de surveillance.

Intégration avec les outils de surveillance

Exportez le statut vers Prometheus, Datadog ou tout système de surveillance capable d’exécuter des commandes shell :

#!/bin/bash
# prometheus-exporter.sh
STATUS=$(freeguard status --json)
CONNECTED=$(echo "$STATUS" | jq -r '.connected')
UPTIME=$(echo "$STATUS" | jq -r '.uptime')

if [ "$CONNECTED" = "true" ]; then
  echo "freeguard_connected 1"
  echo "freeguard_uptime_seconds $UPTIME"
else
  echo "freeguard_connected 0"
  echo "freeguard_uptime_seconds 0"
fi

Alertes

Combinez la vérification de santé avec votre système d’alertes. Exemple avec un simple webhook :

#!/bin/bash
CONNECTED=$(freeguard status --json | jq -r '.connected')
if [ "$CONNECTED" != "true" ]; then
  curl -X POST https://hooks.example.com/alert \
    -H "Content-Type: application/json" \
    -d '{"text": "FreeGuard VPN disconnected on '"$(hostname)"'"}'
fi

Considérations de sécurité

  • Exécution en tant que root : Le tunnel VPN nécessite les privilèges root pour modifier les routes réseau. Le service systemd s’exécute en tant que root par défaut.
  • Stockage des tokens : Les tokens de service sont stockés dans ~/.config/freeguard/. Assurez-vous que les permissions de fichiers sont appropriées (chmod 600).
  • Règles de pare-feu : Si vous utilisez UFW ou iptables, assurez-vous que l’interface du tunnel VPN est autorisée.
  • Kill switch : Activez le kill switch pour bloquer tout le trafic si le VPN se déconnecte : freeguard config set kill-switch true.

Étapes suivantes

Dernière mise à jour : mars 2026