====== VNC Inverso (reverse VNC) ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//04/05/2012//** \\ \\
**Ovvero come fare assistenza remota ad un nostro amico dietro un firewall. ** \\ \\
Quando dobbiamo connetterci ad un server (per poterlo utilizzare in qualche modo) normalmente siamo noi a iniziare la connessione su una specifica porta e in seguito usufruire dei servizi offerti. Per esempio se dobbiamo collegarci alla macchina di un nostro amico per fornirgli assistenza è necessario che la macchina del nostro amico sia in ascolto su una specifica porta e che il firewall o router del nostro amico ci consenta di "vedere" la sua macchina dalla rete. Ovvero che abbia attivato l'inoltro di quella porta sulla macchina del nostro amico. \\
\\
Non sempre pero' è possibile istruire il firewall/router del nostro amico a lascirci "passare" per questo quindi si usano le **connessioni inverse** dove a contattarci è il nostro amico e quelli in ascolto su una specifica porta siamo invece noi. Dopo che la connessione è avvenuta per esempio nel caso in cui volessimo usare (come in questo caso) un servizio VNC possiamo noi usufruire del servizio sulla macchina del nostro amico . \\
Adesso vedremo cosa devono fare entrambe le parti sia con Gnu/Linux che con windows.
===== In pratica =====
Useremo il software libero [[http://www.tightvnc.com/|TightVNC]] sia per Windows che per Linux in questo caso in versione 1.3 e l'eseguibile
linux **x11vnc** disponibile per tutte le distribuzioni.
===== Chi fornisce l'assistenza remota =====
Chi fornisce l'assistenza remota deve fare in modo di conoscere il proprio indirizzo internet pubblico (che fornira' all'amico da aiutare) e configurare il proprio router/firewall per accettare connessioni sulla porta **5500** (o quella che scegliamo) sul proprio indirizzo privato. \\
**Gnu/Linux**
vncviewer -listen
**Windows**
vncviewer.exe /listen
\\ \\
=== Parametri di compressione del flusso ===
Su reti lente sarebbe opportuno specificare la compressione del flusso in modo da risparmiare banda. I parametri necessari sono i seguenti da aggiungere ai comandi sopradescritti **-quality 4 -compresslevel 9 ** in questo modo :
vncviewer -listen -quality 4 -compresslevel 9
Se a ''/listen'' facciamo seguire il numero di una porta il demone si mette in ascolto su quella porta specifica. \\
**N.B.** il demone linux sembra rifiutarsi di restare in ascolto su una porta specifica scelta da noi diversa dalla 5500.
===== Chi ha bisogno dell'assistenza =====
**Gnu/Linux**
x11vnc -connect :5500
**Windows** \\
Su windows bisogna prima lanciare il demone senza parametri e poi istruirlo alla connessione con un altro comando.
WinVNC.exe
WinVNC.exe -connect ::5500
per interromepere la condivisione del desktop:
WinVNC.exe -kill
===== Quando la persona che riceve aiuto è dietro un firewall che blocca anche le connessioni uscenti =====
Puo' capitare di dovere aiutare una persona che si trova in un ufficio pubblico, universita' o altro posto dove il firewall lascia passare solo le connessioni uscenti verso il solo web (per consentire ,ai client della rete, la sola la navigazione ). \\
In questi casi l'unica cosa da fare è di mettere in ascolto il demone sulla **porta 80** (tipica del traffico web) e fare iniziare le connessioni su questa porta. \\
==== Problemi con il demone Linux di TightVNC ====
Come gia' detto, nelle prove condotte, non sono riuscito a mettere in ascolto il demone linux sulla porta 80 pertanto ho dovuto fare una piccola modifica al codice sorgente di quest'ultimo e ricompilarlo in modo tale da restare di default in ascolto sulla porta 80. \\
=== Prepariamo per la ricompilazione ===
Per ricompilare TightVNC ci serve installare i pacchetti di sviluppo tradizionali come make, gcc e **Imake** , **libz-dev** , **lib-jpeg** (leggere il file REDME incluso per maggiori dettagli). \\ \\
Il file da modificare è **listen.c** contenuto nella directory vncviewer di TightVNC 1.3 . \\ \\
Quindi individuare la funzione:
listenForIncomingConnections(int *argc, char **argv, int listenArgIndex)
e cercare al suo interno la riga:
listenSocket = ListenAtTcpPort(listenPort);
e sostituirla con
listenSocket = ListenAtTcpPort(80);
\\ \\
E' opportuno(estetico) inoltre modificare il messaggio sullo stderr
fprintf(stderr,"%s -listen: Listening on port %d\n", programName, listenPort)
con
fprintf(stderr,"%s -listen: Listening on port 80\n", programName);
\\ \\
Si sarebbe potuto modificare solo la variabile ''listenPort'' ma va bene ugualmente.
**Ricompiliamo tutto **
% xmkmf
% make World
L'eseguibile **vncviewer** che ci interessa si trovera' nella cartella vncviewer.