Tunnel SSH inverso: come posso inviare il mio numero di porta al server?


12

Ho due macchine, client e server.

Il client (che si trova dietro un firewall aziendale) apre un tunnel SSH inverso al server, che ha un indirizzo IP accessibile pubblicamente, usando questo comando:

ssh -nNT -R0: localhost: 2222 insecure@server.example.com

In OpenSSH 5.3+, ciò che si 0verifica subito dopo il -Rmezzo "seleziona una porta disponibile" anziché chiamarne esplicitamente una. Il motivo per cui lo sto facendo è perché non voglio scegliere una porta che è già in uso. In verità, in realtà ci sono molti clienti là fuori che hanno bisogno di impostare tunnel simili.

Il problema a questo punto è che il server non sa quale client è quale. Se vogliamo riconnetterci a uno di questi client (tramite localhost), come facciamo a sapere quale porta si riferisce a quale client?

Sono consapevole che ssh riporta il numero di porta alla riga di comando quando utilizzato nel modo sopra. Tuttavia, mi piacerebbe anche usare l'autossh per mantenere vive le sessioni. autossh esegue il suo processo figlio tramite fork / exec, presumibilmente, in modo che l'output del comando ssh effettivo venga perso nell'etere.

Inoltre, non riesco a pensare a nessun altro modo per ottenere la porta remota dal client. Pertanto, mi chiedo se esiste un modo per determinare questa porta sul server.

Un'idea che ho è quella di usare in qualche modo / etc / sshrc, che è presumibilmente uno script che viene eseguito per ogni connessione. Tuttavia, non so come si ottengano qui le informazioni pertinenti (forse il PID del particolare processo sshd che gestisce tale connessione?) Mi piacerebbe alcuni suggerimenti.

Grazie!


2
Una VPN non sarebbe più appropriata? OpenVPN è semplicissimo da configurare.
Ben Lessani - Sonassi,

Sembra interessante. Non so molto sulla VPN. È qualcosa che potrebbe funzionare anche se il computer client è configurato per utilizzare DHCP?
Tom,

1
Sì, funziona con un'altra interfaccia TUN / TAP, quindi altre interfacce sono irrilevanti.
Ben Lessani - Sonassi,

@sonassi, sembra che questa cosa VPN farà il trucco. Grazie per le informazioni.
Tom,

Di seguito ho aggiunto una risposta che ti guida in modo specifico attraverso il processo VPN con OpenVPN (basato su Debian / Ubuntu)
Ben Lessani - Sonassi,

Risposte:


4

Una VPN non sarebbe più appropriata? OpenVPN è semplicissimo da configurare. Ecco una configurazione di esempio e alcuni collegamenti per guidare l'utente attraverso il processo di creazione del certificato:

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

Quindi creare un nuovo file /etc/openvpn/client_server.confe inserire quanto segue, modificando il modo SERVER_IP_ADDRESSappropriato

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

Quindi creare una chiave per utente che si connetterà e creare il file di configurazione nella directory 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'indirizzo IP DEVE essere adatto per una sottorete / 30 (consultare http://www.subnet-calculator.com/cidr.php ), poiché sono disponibili solo 2 indirizzi (server e client) per connessione. Quindi il tuo prossimo IP client disponibile sarebbe 192.168.100.6 e così via.

Quindi ora hai IP statici per utente connesso.

Quindi fornire il the user1@domain.com.p12file all'utente finale e utilizzare il seguente file di configurazione

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

Grazie per la risposta esaustiva! Ho due domande a riguardo, però. A) Specificare 255.255.255.0 per la linea ifconfig-push del client non sembra funzionare, ma funziona se specifico un secondo indirizzo IP. Perchè è questo? E B) questo approccio significa che vengono utilizzati 4 indirizzi IP per connessione?
Tom,

Su alcuni sistemi Linux, la sintassi per la linea ifconfig-push è diversa. Per esempio. ifconfig-push 192.168.100.2 192.168.100.3- Non ho idea del perché differisca sulle piattaforme. E sì, significa che vengono utilizzati 4 IP per client (spreco, ma la natura della bestia).
Ben Lessani - Sonassi,

3

Se i client hanno nomi utente diversi, è possibile utilizzare netstatper scoprire su quale porta sshdè in ascolto il processo dell'utente . Per esempio:

% 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

È possibile modificare l'intervallo di porte temporanee ( /proc/sys/net/ipv4/ip_local_port_rangeper Linux) e quindi utilizzare porte allocate staticamente al di fuori di tale intervallo.


Non è necessario modificare l'intervallo effimero per questo. Per impostazione predefinita, l'intervallo effimero termina a 61000, quindi ci sono migliaia di numeri di porta disponibili sopra. Ho usato spesso echo $[61002+RANDOM%4532]per selezionare un numero di porta in quell'intervallo.
Kasperd,

2

Voglio la stessa configurazione come te, ho aumentato il livello di registro del server SSH su DEBUG e ha mostrato nei registri quale era la porta locale del client

per esempio:

comando client: ssh -N -R0:127.0.0.1:5522 connector@example.com

registro del server:

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

lì vedi il numero di porta


0

Dovresti essere in grado di estrarre le informazioni rilevanti dall'output di:

lsof -i tcp

Esegui come root.


0

Esegui questo script sul server:

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

Potresti aver bisogno o meno dei due sudo. Rimuovi se non lo fai.

PS: questa è una versione modificata di una soluzione che ho trovato altrove qualche tempo fa. Penso che potrebbe provenire da StackOverflow, ma non riesco a trovare il riferimento originale.

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.