Tunnel SSH inversé: comment envoyer mon numéro de port au serveur?


12

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 insecure@server.example.com

Dans OpenSSH 5.3+, le fait de 0se produire juste après le -Rmoyen 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!


2
Un VPN ne serait-il pas plus approprié? OpenVPN est super simple à configurer.
Ben Lessani - Sonassi

Ça semble intéressant. Je ne connais pas grand-chose au VPN. Est-ce quelque chose qui pourrait fonctionner même si la machine cliente est configurée pour utiliser DHCP?
Tom

1
Oui, il s'exécute sur une autre interface TUN / TAP, donc les autres interfaces sont sans importance.
Ben Lessani - Sonassi

@sonassi, il semble que ce truc VPN fera l'affaire. Merci pour l'info.
Tom

J'ai ajouté une réponse ci-dessous vous guidant spécifiquement à travers le processus VPN avec OpenVPN (basé sur Debian / Ubuntu)
Ben Lessani - Sonassi

Réponses:


4

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:

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

Ensuite , créez un nouveau fichier /etc/openvpn/client_server.confet de mettre ce qui suit dans, en changeant le , SERVER_IP_ADDRESSselon le cas

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

Créez ensuite une clé par utilisateur qui va se connecter et créez le fichier de configuration dans le répertoire ccd

./build-key-pkcs12 user1@domain.com
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/user1@domain.com

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 user1@domain.com.p12fichier à l'utilisateur final et utilisez le fichier de configuration suivant

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 user1@domain.com.p12
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

Merci pour la réponse complète! J'ai cependant deux questions à ce sujet. A) La spécification de 255.255.255.0 pour la ligne ifconfig-push du client ne semble pas fonctionner, mais cela fonctionne si je spécifie une deuxième adresse IP. Pourquoi est-ce? Et B) cette approche signifie-t-elle que 4 adresses IP sont utilisées par connexion?
Tom

Sur certains systèmes Linux, la syntaxe de la ligne ifconfig-push est différente. Par exemple. 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).
Ben Lessani - Sonassi

3

Si les clients ont chacun des noms d'utilisateur différents, vous pouvez utiliser netstatpour savoir sur quel port le sshdprocessus de cet utilisateur écoute. Par exemple:

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@

3

Vous pouvez modifier la plage de ports éphémères ( /proc/sys/net/ipv4/ip_local_port_rangepour Linux), puis utiliser des ports alloués statiquement en dehors de cette plage.


Pas besoin de changer la gamme éphémère pour ça. Par défaut, la plage éphémère se termine à 61000, il y a donc des milliers de numéros de port disponibles au-dessus de cela. J'ai souvent utilisé echo $[61002+RANDOM%4532]pour choisir un numéro de port dans cette plage.
kasperd du

2

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 connector@example.com

journal du serveur:

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

là vous voyez le numéro de port


0

Vous devriez pouvoir extraire les informations pertinentes de la sortie de:

lsof -i tcp

Exécuter en tant que root.


0

Exécutez ce script sur le serveur:

sudo lsof -i -n | grep "sshd" | grep "(LISTEN)" | awk '{print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.