Utiliser un proxy Squid via un tunnel SSH inverse pour accéder à internet

Ça c’est du titre qui en impose ! Personne n’a rien compris, y compris moi.

Je vais vous expliquer ma problématique. On m’a fourni un serveur de test sous Ubuntu 18.04. Je dois y installer l’applicatif Zabbix via les dépôts et faire quelques tests pour valider une procédure. Le problème est que ce serveur n’a pas accès à internet, ni a aucune autre connexion sortantes. Seules les connexions entrantes depuis une petite plage d’IP (dont la mienne) sont autorisées. Un schéma pour mieux visualiser la situation :

Dans ces conditions, impossible d’installer Zabbix via les dépôts, puisque l’accès internet n’est pas possible. J’ai donc installé Squid sur mon ordinateur (un Ubuntu 18.04 lui aussi), pour qu’il serve de proxy entre le serveur et internet : apt-get install squid

Ensuite je me suis connecté en SSH au serveur, en montant au passage un tunnel SSH inverse pour permettre la communication serveur → ordinateur : ssh -R 3128:localhost:3128 root@1.2.3.4
1.2.3.4 est l’IP du serveur et 3128 est le port Squid par défaut.
Avec cette commande, le port 3128 sur le serveur sera automatiquement redirigé vers le port 3128 de mon ordinateur. C’est un peu comme si Squid avait été installé en local sur le serveur mais avait quand même accès à internet.

En pratique, les données vers internet vont suivre ce trajet :

Il ne reste plus qu’à modifier la configuration de Aptitude pour qu’il utilise le proxy Squid. Il faut créer le fichier /etc/apt/apt.conf et mettre dedans :

Acquire::http {
        Proxy "http://127.0.0.1:3128";
};

Zabbix : faire un export de tous les équipements supervisés et de leur statut

Cette technique est super crade. Je l’ai utilisé pour faire un export en urgence des serveurs supervisés. Elle tient en une seule requête SQL :

SELECT
  hosts.hostid AS ID,
  hosts.host AS Serveur,
  CASE
    WHEN hosts.status=0 THEN 'Activé'
    WHEN hosts.status=1 THEN 'Désactivé'
  END AS Statut,
  CASE
    WHEN hosts.maintenance_status=0 THEN 'Pas en maintenance'
    WHEN hosts.maintenance_status=1 THEN 'En maintenance'
  END AS Maintenance,
  interface.ip AS IP
  FROM hosts, interface
  WHERE hosts.status<>3
  AND hosts.hostid=interface.hostid;

Cette requête fait un export des serveurs contenant :

  • L’ID de l’équipement dans Zabbix
  • Le nom de l’équipement
  • Son status (Activé ou Désactivé)
  • L’état de sa maintenance (En maintenance ou Pas en maintenance)
  • Son adresse IP

La requête est assez simple mais comporte quelques subtilités :

  • Les conditions en utilisant CASE / WHEN / THEN / END, qui permettent de convertir le numéro du status en son texte
  • Les AS qui permettent d’affiche un en-tête de colonne plus clair
  • La condition WHERE hosts.status<>3 qui permets de masquer les templates