J'ai deux machines, Client et Serveur.
Le client (qui se trouve derrière un pare-feu d'entreprise) ouvre un tunnel SSH inversé vers le serveur, qui a une adresse IP accessible au public, à l'aide de cette commande:
ssh -nNT -R0: localhost: 2222 [email protected]
Dans OpenSSH 5.3+, le fait de 0
se produire juste après le -R
moyen signifie "choisir un port disponible" plutôt que d'en appeler explicitement un. La raison pour laquelle je fais cela est parce que je ne veux pas choisir un port déjà utilisé. En vérité, il existe en fait de nombreux clients qui doivent configurer des tunnels similaires.
Le problème à ce stade est que le serveur ne sait pas quel client est lequel. Si nous voulons nous reconnecter à l'un de ces clients (via localhost), alors comment savoir quel port fait référence à quel client?
Je suis conscient que ssh signale le numéro de port à la ligne de commande lorsqu'il est utilisé de la manière ci-dessus. Cependant, j'aimerais également utiliser autossh pour maintenir les sessions en vie. autossh exécute son processus enfant via fork / exec, probablement, de sorte que la sortie de la commande ssh réelle est perdue dans l'éther.
De plus, je ne vois pas d'autre moyen d'obtenir le port distant du client. Ainsi, je me demande s'il existe un moyen de déterminer ce port sur le serveur.
Une idée que j'ai est d'utiliser en quelque sorte / etc / sshrc, qui est censé être un script qui s'exécute pour chaque connexion. Cependant, je ne sais pas comment obtenir les informations pertinentes ici (peut-être le PID du processus sshd particulier gérant cette connexion?) J'adorerais quelques pointeurs.
Merci!
la source
Réponses:
Un VPN ne serait-il pas plus approprié? OpenVPN est super simple à configurer. Voici un exemple de configuration et quelques liens pour vous guider dans le processus de création de certificat:
Ensuite , créez un nouveau fichier
/etc/openvpn/client_server.conf
et de mettre ce qui suit dans, en changeant le ,SERVER_IP_ADDRESS
selon le casCréez ensuite une clé par utilisateur qui va se connecter et créez le fichier de configuration dans le répertoire ccd
L'adresse IP DOIT être adaptée à un sous-réseau / 30 (voir http://www.subnet-calculator.com/cidr.php ), car il n'y a que 2 adresses disponibles (serveur et client) par connexion. Votre prochaine adresse IP client disponible serait donc 192.168.100.6 et ainsi de suite.
Vous disposez alors désormais d'adresses IP statiques par utilisateur se connectant.
Fournissez ensuite le
the [email protected]
fichier à l'utilisateur final et utilisez le fichier de configuration suivantla source
ifconfig-push 192.168.100.2 192.168.100.3
- Je ne sais pas pourquoi cela diffère sur les plateformes. Et oui, cela signifie que 4 adresses IP sont utilisées par client (gaspillage, mais la nature de la bête).Si les clients ont chacun des noms d'utilisateur différents, vous pouvez utiliser
netstat
pour savoir sur quel port lesshd
processus de cet utilisateur écoute. Par exemple:la source
Vous pouvez modifier la plage de ports éphémères (
/proc/sys/net/ipv4/ip_local_port_range
pour Linux), puis utiliser des ports alloués statiquement en dehors de cette plage.la source
echo $[61002+RANDOM%4532]
pour choisir un numéro de port dans cette plage.Je veux la même configuration que vous, j'ai augmenté le niveau de journalisation du serveur SSH à DEBUG, et cela a montré dans les journaux quel était le port local du client
par exemple:
commande client:
ssh -N -R0:127.0.0.1:5522 [email protected]
journal du serveur:
là vous voyez le numéro de port
la source
Vous devriez pouvoir extraire les informations pertinentes de la sortie de:
Exécuter en tant que root.
la source
Exécutez ce script sur le serveur:
Vous pouvez ou non avoir besoin des deux sudo. Retirez si vous ne le faites pas.
PS - Il s'agit d'une version modifiée d'une solution que j'ai trouvée ailleurs il y a quelque temps. Je pense que cela peut provenir de StackOverflow, mais je ne trouve pas la référence d'origine.
la source