Ceci est parfaitement réalisable avec juste la configuration ssh, sans avoir à utiliser des alias séparés pour le lan et le wan ou créer des ports supplémentaires vers l'avant. (Mais vous avez naturellement besoin d'un moyen pour détecter si vous êtes dans votre réseau local ou non)
Dans ~/.ssh/config
, vous voudrez ajouter quelque chose comme ceci:
Match host raspi exec "am_i_outside_of_my_lan"
HostName 12.345.67.89
Port 1234
Au lieu de, am_i_outside_of_my_lan
vous voudrez placer une commande qui détermine si vous êtes à l'intérieur de votre réseau domestique ou non, et retourne avec 0 code de sortie si vous êtes en dehors, et autre chose sinon.
La host
condition est probablement explicite, mais la exec
condition mérite une explication: elle ne correspond que lorsque la commande donnée revient avec le code de sortie 0, c'est-à-dire. pas d'erreur.
En d'autres termes, ce que cela fait, c'est que la host raspi
partie restreint cette règle lorsque vous essayez de vous connecter à l'hôte raspi, et la exec "am_i_outside_my_lan"
limite davantage pour qu'elle ne s'applique que lorsque vous vous connectez à l'extérieur de votre réseau domestique. Donc, à l'intérieur de votre réseau domestique, il ssh user@raspi
fait exactement ce qu'il ferait normalement, mais en dehors de celui-ci, la règle correspond et il fait à la place l'équivalent de ssh -p 1234 user@12.345.67.89
.
Quant à quoi utiliser à la place am_i_outside_of_my_lan
, cela dépend entièrement de votre configuration. Je suggère de placer les commandes dans un script séparé au lieu d'essayer de l'écrire en ligne, car la citation semble être un peu difficile à bien faire.
Personnellement, j'ai utilisé le script Python suivant pour détecter si je suis à l'intérieur de mon propre réseau: (puisque mon nom de domaine se résout en une adresse IP locale à l'intérieur de mon propre réseau)
#! /usr/bin/env python
import socket, sys
sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))
Si vous n'avez pas une configuration similaire, vous devrez peut-être faire autre chose. (Par exemple, vous pouvez regarder le nom du réseau sans fil auquel vous êtes connecté, ou même interroger un service what-is-my-ip pour obtenir l'ip externe du réseau auquel vous êtes connecté)