Come determinare la porta allocata sul server per un tunnel inverso openssh associato in modo dinamico?


16

Quando si creano tunnel inversi su versioni recenti di OpenSSH, è possibile assegnare una porta remota pari a 0 per associare qualsiasi porta disponibile:

-R [indirizzo_indirizzamento:] porta: host: hostport

...

Se l'argomento port è "0", la porta di ascolto verrà allocata dinamicamente sul server e segnalata al client in fase di esecuzione.

Pagina man del client openssh ssh

La mia domanda è come posso (in modo automatizzato) determinare questa allocazione delle porte sul server. Sembra piuttosto inutile che venga segnalato all'host che esegue il client ssh, ma non alla destinazione, che vorrà effettuare connessioni a questa porta per accedere ai servizi sul client.

Sono in esecuzione due opzioni simili a cui riesco a pensare

# netstat -ntlp

sul server e cercare le porte sospette associate a 127.0.0.1 da sshd o guardando l'output di

# lsof -p $PPID | grep TCP | grep LISTEN

Ma nessuno di questi è piacevole dal punto di vista dell'automazione e non c'è modo di ricollegare le porte dinamiche alla porta del servizio di origine se viene creato più di un tunnel di questo tipo.

C'è qualcosa che mi manca per ottenere effettivamente un elenco di tunnel attivi (sia numeri di porta locali che remoti) sul lato server sshd, come un equivalente della variabile d'ambiente SSH_CONNECTION, ma per tunnel attivi?

Per alcuni contesti, sto cercando di creare potenzialmente molti tunnel inversi simultanei su un host, eseguendo il tunneling sullo stesso numero di porta su molti host diversi. Avere lo stack TCP gestire automaticamente il pool di porte sembra il modo più efficace per farlo.


Quando si utilizza la sintassi "-R 0: xxxx: y", ssh emetterà "Porta allocata 49488 per l'inoltro remoto a xxxx: y su stderr.
BlakBat

Sì, il problema è come ottenere tali informazioni sul lato server - dove sarebbe molto più utile ...
codedstructure

Risposte:


1

Se si imposta 'LogLevel' nel file di configurazione sshd_config su DEBUG1 (o qualsiasi livello DEBUG), allora sshd registrerà i numeri di porta in /var/log/auth.log.

Ricorda che l'uso di un LogLevel di DEBUG o superiore potrebbe rappresentare un rischio per la privacy, poiché molto è registrato.

(da /var/log/auth.log, rimosse alcune righe per mostrare le informazioni pertinenti)

Jun 24 06:18:24 radon sshd[9334]: Connection from 192.168.13.10 port 39193
Jun 24 06:18:24 radon sshd[9334]: Accepted publickey for lornix from 192.168.13.10 port 39193 ssh2
Jun 24 06:18:24 radon sshd[9334]: pam_unix(sshd:session): session opened for user lornix by (uid=0)
Jun 24 06:18:24 radon sshd[9334]: User child is on pid 9339
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on 0.0.0.0 port 0.
Jun 24 06:18:24 radon sshd[9339]: debug1: Allocated listen port 39813
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 0: new [port listener]
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on :: port 39813.
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 1: new [port listener]
Jun 24 06:18:27 radon sshd[9339]: Received disconnect from 192.168.13.10: 11: disconnected by user

Se lo segui, puoi vedere dove potresti analizzare le informazioni sulla connessione e quindi la porta inoltrata (39813 in questo caso)

Ho usato questa riga di comando tra due dei miei computer, ho impostato l'accesso con ssh-key, quindi nessuna richiesta di password o ritardi

-xenon- lornix:~> ssh -R "*:0:radon:22" -N -T radon
Allocated port 39813 for remote forward to radon:22

-N specifica che non viene fornito alcun comando e -T interrompe l'allocazione di un tty per questa connessione.

Un altro modo per diffondere le informazioni sulla connessione alla porta sarebbe analizzarlo dal lato client e inviare un'e-mail, un jabber, un messaggio di testo, segnali di fumo o un piccione per trasportare il numero di porta a chiunque ne abbia bisogno.


0

È possibile reindirizzare lo stderr sshin un programma che apre una connessione a un server sulla macchina target e riporta il suo nome macchina / indirizzo IP / numero seriale / qualunque cosa insieme al numero di porta. Un po 'così:

% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/`uname -n` /" | netcat radon 3743
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.