Le blog du petit geek malin

;-)

Accéder à des partages Samba via SSH


Procédure pour accéder à des partages Samba / CIFS à travers une connexion SSH


Principe


Il s'agit encore de monter des tunnels sur SSH, mais il y a une subtilité pour Samba :
Le serveur Samba (ou plutôt CIFS) Windows (service NetBIOS) écoute déjà sur le port 139 et le client CIFS Windows ne permet pas de lancer une connexion CIFS sur un autre port que le 139.
Donc on ne peut faire un tunnel avec un autre port d'origine que le 139, ni depuis une adresse de loopback / localhost classique (i.e. 127.x.x.x), à moins de désactiver le service NetBIOS, donc le partage de fichiers, sur le poste client, ce qui n'est pas souhaitable. Il va donc falloir utiliser une autre interface virtuelle de boucle locale avec une adresse IP différente du localhost classique, mais en désactivant bien cette fois le service NetBIOS dessus.

Références





1. Créer une interface de boucle locale sous Windows


Panneau de configuration > Ajout de matériel > suivant > Oui, j'ai déjà connecté le matériel > Ajouter un nouveau matériel > Installer le matériel que je sélectionne manuellement dans la liste > Carte réseau > Microsoft > Carte de bouclage Microsoft

Il est alors possible de renommer cette nouvelle interface virtuelle avec n'importe quel nom, par exemple "Microsoft loopback".

Connexions réseau > Microsoft loopback > Propriétés > Décocher "Partage de fichiers et d'imprimantes pour les réseaux Microsoft"
Protocole internet (TCP/IP) - Propriétés > Utiliser l'adresse IP suivante : Adresse IP : 10.10.10.10, Masque : 255.255.255.0
> Bouton "Avancé..." > Onglet "WINS" > Cocher "Désactiver NetBIOS avec TCP/IP"

L'idéal est de choisir une adresse IP privée (telle que définie par la RFC 1918) qui ne soit pas en conflit dans le réseau du poste client, par exemple 10.10.10.10, comme ici.

2. Créer un script batch de montage des tunnels à l'aide de plink


PLINK est un exécutable en mode ligne de commandes fourni avec PuTTY.

Exemple de script batch "ssh-tunnels.bat"


Seul le port tcp 139 est indispensable pour Samba (CIFS / NetBIOS), c'est donc le seul tunnel que j'ai initialisé depuis l'adresse de l'interface de boucle locale mais j'ai également ajouté d'autres tunnels pour d'autres services : tcp 5900 pour VNC, tcp 3389 pour RDP.

@echo off
"C:\Program Files\PuTTY\plink.exe" login@host.public-domain.com -ssh -N -C -v -L 127.0.0.1:5901:192.168.0.1:5900 -L 127.0.0.1:33892:192.168.0.2:3389 -L 10.10.10.10:139:192.168.0.250:139

-ssh : Pour utiliser le protocole SSH (et non telnet...)
-N : Pour ne pas ouvrir une console de commandes.
-C : Pour activer la compression
-v : Mode bavard.
-L:[listen-local-ip:]listen-local-port:remote-host:remote-port : Déclarations des tunnels avec l'IP et le port locaux en premier et distants en second.
10.10.10.10 : Adresse IP de l'interface virtuelle de boucle locale Windows créée pour le tunnel Samba.

Remarques


1) Il est tout aussi possible de créer les tunnels dans une session console de PuTTY mais la boîte de dialogue n'est pas très commode de par sa taille...

2) En utilisant l'interface de boucle locale comme origine de tous les tunnels, on a l'avantage de pouvoir utiliser sans conflit les ports originaux des services.

3) Bien entendu, tout comme les autres clients (vnc...), le client Samba Linux ou Cygwin en ligne de commandes, fonctionne très bien avec un tunnel classique du type -L 127.0.0.1:1390:192.168.0.1:139 (donc sans utiliser d'interface de boucle supplémentaire), à condition de lui indiquer le port local :
smbclient //127.0.0.1/share -p 1390 -U user

3. Utilisation


Une fois que le script a été lancé, l'authentification de la session SSH effectuée et que les tunnels sont montés, on est en mesure d'accéder aux serveurs distants.

Pour accéder aux partages du serveur Samba distant,
On peut taper dans la barre d'adresses de l'explorateur Windows :
"\\10.10.10.10"
Ou bien monter un lecteur réseau Z: vers le partage "share" en ligne de commandes :
net use Z: \\10.10.10.10\share /user:login /persistent:no

Il est également possible de définir une résolution de nom locale dans le fichier :
C:\WINDOWS\system32\drivers\etc\hosts
par exemple :
10.10.10.10 loop
Il sera alors possible de taper : "\\loop" pour accéder aux partages Samba de la machine distante.

Conclusion


Au final, cette solution est très proche d'un VPN SSL comme on pourrait l'obtenir avec OpenVPN,
- avec pour inconvénient de fonctionner sur TCP (SSH) ce qui doit être un peu moins fluide que sur UDP.
- avec pour avantage d'être beaucoup plus simple à mettre en oeuvre (nécessite qu'un serveur et un client SSH) et très souple (sélection de chaque port à faire suivre), mais tout de même un peu "artisanale".