Skip to content
KitploitKITPLOIT
OutilsBlog
Log in
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
sshtunnel — Tunnels SSH vers un serveur distant. | Kitploit
Outils/GitHubGitHub/pahaz/sshtunnel
Utilitaires GénérauxSécurité RéseauUtilitaires et Frameworks
GitHubpahaz/sshtunnel

sshtunnel

Tunnels SSH vers un serveur distant.

Voir le dépôt
1.3k20214il y a 1 anVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

|CircleCI| |AppVeyor| |readthedocs| |coveralls| |version|

|pyversions| |license|

Auteur : Pahaz_

Repo : https://github.com/pahaz/sshtunnel/

Inspiré par https://github.com/jmagnusson/bgtunnel, qui ne fonctionne pas sous Windows.

Voir aussi : https://github.com/paramiko/paramiko/blob/master/demos/forward.py

Prérequis

  • paramiko_

Installation

sshtunnel_ est sur PyPI, exécutez simplement :

::

pip install sshtunnel

ou ::

easy_install sshtunnel

ou ::

conda install -c conda-forge sshtunnel

pour l'installer dans votre environnement.

Pour installer depuis les sources, clonez le repo <https://github.com/pahaz/sshtunnel>_ et exécutez ::

python setup.py install

Tests du paquet

Pour exécuter les tests, vous devez d'abord avoir tox <https://testrun.org/tox/latest/>_ et exécuter ::

python setup.py test

Scénarios d'utilisation

L'un des scénarios typiques où sshtunnel est utile est illustré dans la figure ci-dessous. L'utilisateur peut avoir besoin de se connecter à un port d'un serveur distant (par exemple 8080) où seul le port SSH (généralement le port 22) est accessible. ::

----------------------------------------------------------------------

                            |
-------------+              |    +----------+
    LOCAL    |              |    |  REMOTE  | :22 SSH
    CLIENT   | <== SSH ========> |  SERVER  | :8080 web service
-------------+              |    +----------+
                            |
                         FIREWALL (only port 22 is open)

----------------------------------------------------------------------

Fig1 : Comment se connecter à un service bloqué par un pare-feu via un tunnel SSH.

Si le serveur SSH le permet, il est également possible d'atteindre un serveur privé (du point de vue du SERVEUR DISTANT) non directement visible de l'extérieur (du point de vue du CLIENT LOCAL). ::

----------------------------------------------------------------------

                            |
-------------+              |    +----------+               +---------
    LOCAL    |              |    |  REMOTE  |               | PRIVATE
    CLIENT   | <== SSH ========> |  SERVER  | <== local ==> | SERVER
-------------+              |    +----------+               +---------
                            |
                         FIREWALL (only port 443 is open)

----------------------------------------------------------------------

Fig2 : Comment se connecter au SERVEUR PRIVÉ via un tunnel SSH.

Exemples d'utilisation

L'API permet soit d'initialiser le tunnel et de le démarrer, soit d'utiliser un contexte with, qui se chargera de démarrer et d'arrêter le tunnel :

Exemple 1

Le code correspondant à la Fig1 ci-dessus suit, étant donné que l'adresse du serveur distant est pahaz.urfuclub.ru, l'authentification par mot de passe et un port de liaison local attribué aléatoirement.

.. code-block:: python

from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    'alfa.8iq.dev',
    ssh_username="pahaz",
    ssh_password="secret",
    remote_bind_address=('127.0.0.1', 8080)
)

server.start()

print(server.local_bind_port)  # show assigned local port
# work with `SECRET SERVICE` through `server.local_bind_port`.

server.stop()

Exemple 2

Exemple de transfert de port vers un serveur privé non directement accessible, en supposant une authentification par clé privée protégée par mot de passe, que le service SSH du serveur distant écoute sur le port 443 et que ce port est ouvert dans le pare-feu (Fig2) :

.. code-block:: python

import paramiko
import sshtunnel

with sshtunnel.open_tunnel(
    (REMOTE_SERVER_IP, 443),
    ssh_username="",
    ssh_pkey="/var/ssh/rsa_key",
    ssh_private_key_password="secret",
    remote_bind_address=(PRIVATE_SERVER_IP, 22),
    local_bind_address=('0.0.0.0', 10022)
) as tunnel:
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('127.0.0.1', 10022)
    # do some operations with client session
    client.close()

print('FINISH!')

Exemple 3

Exemple de transfert de port pour le port local MySQL de Vagrant :

.. code-block:: python

from sshtunnel import open_tunnel
from time import sleep

with open_tunnel(
    ('localhost', 2222),
    ssh_username="vagrant",
    ssh_password="vagrant",
    remote_bind_address=('127.0.0.1', 3306)
) as server:

    print(server.local_bind_port)
    while True:
        # press Ctrl-C for stopping
        sleep(1)

print('FINISH!')

Ou simplement en utilisant la CLI :

.. code-block:: console

(bash)$ python -m sshtunnel -U vagrant -P vagrant -L :3306 -R 127.0.0.1:3306 -p 2222 localhost

Exemple 4

Ouverture d'une session SSH en sautant par-dessus deux tunnels. Le transport SSH et les tunnels seront démonisés, ce qui ne les fera pas attendre l'arrêt des connexions à la fermeture.

.. code-block:: python

import sshtunnel
from paramiko import SSHClient


with sshtunnel.open_tunnel(
    ssh_address_or_host=('GW1_ip', 20022),
    remote_bind_address=('GW2_ip', 22),
) as tunnel1:
    print('Connection to tunnel1 (GW1_ip:GW1_port) OK...')
    with sshtunnel.open_tunnel(
        ssh_address_or_host=('localhost', tunnel1.local_bind_port),
        remote_bind_address=('target_ip', 22),
        ssh_username='GW2_user',
        ssh_password='GW2_pwd',
    ) as tunnel2:
        print('Connection to tunnel2 (GW2_ip:GW2_port) OK...')
        with SSHClient() as ssh:
            ssh.connect('localhost',
                port=tunnel2.local_bind_port,
                username='target_user',
                password='target_pwd',
            )
            ssh.exec_command(...)

Utilisation en ligne de commande

::

$ sshtunnel --help
usage: sshtunnel [-h] [-U SSH_USERNAME] [-p SSH_PORT] [-P SSH_PASSWORD] -R
                 IP:PORT [IP:PORT ...] [-L [IP:PORT ...]] [-k SSH_HOST_KEY]
                 [-K KEY_FILE] [-S KEY_PASSWORD] [-t] [-v] [-V] [-x IP:PORT]
                 [-c SSH_CONFIG_FILE] [-z] [-n] [-d [FOLDER ...]]
                 ssh_address

Pure python ssh tunnel utils
Version 0.4.0

positional arguments:
  ssh_address           SSH server IP address (GW for SSH tunnels)
                        set with "-- ssh_address" if immediately after -R or -L
Télécharger l’outil