web-dev-qa-db-fra.com

Comment créer un proxy de chaussettes avec ssh?

Je veux utiliser mon ordinateur comme proxy chaussettes. Avez-vous juste à faire ssh -D port_number hostname? Dois-je mettre mon nom d'utilisateur Linux comme le hostname?

5
Raffaele D'Arco

tL; DR - Demandez le texte audacieux ci-dessous.


Remarque: j'utilise $ Préfixe pour les chaînes Vous devez remplacer les valeurs souhaitées. Cette syntaxe est non signifiait être entièrement compatible avec des variables dans n'importe quelle coquille.

L'utilisation de ssh -D est vraiment comme ça:

ssh -D $port_number $hostname

ou alors

ssh -D $port_number $username@$hostname

$hostname identifie une machine; Il peut s'agir d'une adresse IP, d'une adresse résolvable via DNS ou via /etc/hosts fichier ou via ssh_config Fichier, etc. La première commande utilisera votre nom d'utilisateur actuel (local), à moins que votre ssh_config Fichier indique le contraire (par défaut, il ne le fait pas). Vous devez fournir des informations d'identification (comme $username et mot de passe lorsqu'il est demandé) valide au $hostname machine.

Cela ouvrira le $port_number TCP Port sur votre local ordinateur et établissez un serveur de chaussettes dessus. Remarque Vous ne pouvez pas être autorisé à ouvrir certains ports comme utilisateur régulier, en particulier inférieur à 1024, utilisez un nombre plus élevé alors.

En général, la situation sans chaussettes proxy fournies par ssh est comme ceci:

A -> D

A est un client (E.G. Web Browser), D est un serveur (E.G. Web Server). Mais avec proxy, c'est comme suit:

A -> B -> C -> D

où:

  • A représente un seul client qui utilise B:$port_number comme adresse de chaussettes; Il peut y avoir beaucoup de clients.
  • B est la machine où ssh -D $port_number C fonctionne et où le TCP $port_number écoute les connexions entrantes de n'importe quel A.
  • C est le $hostnameB se connecte à; La communication qui va normalement à D de A atteint maintenant D de C.
  • D est un serveur, il voit la communication de C et n'est peut-être pas conscient que A et B sont impliqués; Il peut y avoir beaucoup de serveurs.

Certaines de ces lettres peuvent faire référence à la même machine dans certains cas d'utilisation particuliers. Évidemment, tout cas où A = C ne donne aucun avantage direct sur simple A -> D Connexion, mais il y a d'autres cas utiles.

Disons que vous exécutez la commande ssh indiquée ci-dessus et que vous dites votre local navigateur à utiliser des chaussettes à localhost:$port_number. C'est le cas où A = B. Le trafic de votre navigateur sera envoyé et que vous visiterez des sites (D) verra la communication provenant du $hostname (C) comme si votre navigateur est exécuté là-bas.

Si vous souhaitez que les autres ordinateurs se connectent à votre port ouvert (A _ B, ils utiliseront $your_IP:$port_number comme adresse Socks Server) Vous devez:

  • configurez votre pare-feu pour permettre aux connexions entrantes TCP Port $port_number;
  • utilisation -g option avec ssh -D;

ou alors

  • tunnel chaque client par ex. via leur propre connexion ssh, de sorte que leurs connexions apparaissent local (comme si A = B) à votre déjà exécuté ssh -D ... Ainsi, le pare-feu n'interfère pas ni -g est nécessaire; Cela peut être fait par ssh -L $some_port:localhost:$port_number $your_IP invoqué à leur côté ou ssh -R $some_port:localhost:$port_number $their_IP invoqué à vos côtés; Les clients utiliseront localhost:$some_port comme adresse Socks Server dans leurs navigateurs.

Il n'y a pas de raison $hostname ne peut pas être B 's localhost; ça peut. Dans ce cas B = C. C'est inutile lorsque vous utilisez ce proxy de chaussettes avec votre navigateur local (A = B = C) mais si vous autorisez les connexions de l'extérieur, il est parfaitement logique. Je suppose que c'est ce que vous voulez faire. La commande peut être:

ssh -g -f -N -D $port_number localhost

Vous voudrez peut-être établir authentification basée sur une clé Donc, cette connexion ssh _ Connexion de localhost à localhost ne demande pas votre mot de passe. La remarque ci-dessus concernant les stands de pare-feu. Quiconque capable d'utiliser $your_IP:$port_number Comme Socks Server Adresse sera vu par les serveurs qu'ils visitent comme s'ils sont sur votre ordinateur.


Fragments pertinents de man 1 ssh :

-D [bind_address:]port
[.____] Spécifie un transfert de port "dynamique" de niveau "dynamique" local. Cela fonctionne en allouant une prise à écouter port du côté local, éventuellement liée à la spécifiée bind_address. Chaque fois qu'une connexion est faite sur ce port, la connexion est transférée sur le canal sécurisé et le protocole d'application est ensuite utilisé pour déterminer où se connecter à partir de la machine distante. Actuellement, les protocoles SOCKS4 et SOCKS5 sont pris en charge et ssh agira comme un serveur de chaussettes. Seule la racine peut transmettre des ports privilégiés. [...]

-f
Demande ssh pour aller en arrière-plan juste avant l'exécution de la commande. [...]

-g
[.____] Permet aux hôtes distants de se connecter aux ports transférés locaux.

-N
Ne pas exécuter une commande distante. Ceci est utile pour simplement transférer des ports. [...]

9
Kamil Maciorowski