I client per le reti peer-to-peer (come BitTorrent) sono spesso in esecuzione sul nostro computer. Questi programmi ci consentono di condividere risorse introvabili e scaricare velocemente file di grandi dimensioni come, ad esempio, le ISO delle distribuzioni Linux o di Windows. Tutti sappiamo che, per far funzionare correttamente questi programmi, occorre aprire le porte sul router e sul firewall perché devono essere esposti ad internet ma questa esposizione potrebbe anche rappresentare un rischio per la sicurezza del nostro sistema operativo; meglio quindi confinarli in una macchina virtuale!!

Creiamo client peer-to-peer multirete macchina virtuale

Esistono decine di client per ogni singola rete peer-to-peer e ognuno di noi avrà sicuramente i suoi programmi preferiti ma visto che, anche per questo progetto, utilizzeremo la macchina virtuale minimale con Debian, la nostra scelta si riduce ai soli programmi disponibili per il pinguino. Una volta scelti i programmi potremo decidere se installarli tutti su una macchina virtuale oppure ognuno su una macchina dedicata: ci si prospetta, insomma, qualche ora da perdere con le configurazioni... Ci vorrebbe un programma, disponibile per Linux, magari già presente nei repository di Debian, che riesce a gestire più reti contemporaneamente; fortunatamente questo programma c'è!

Si chiama MLDonkey nasce senza interfaccia grafica per avere un basso carico sul sistema e supporta tutte le principale reti di file sharing (eDonkey, Kadmila, BitTorrent, DC++, ... ), insomma, sembra perfetto per questo progetto!

Creiamo client peer-to-peer multirete macchina virtuale

Installazione di MLDonkey

Installiamo la parte server di MLDonkey (non vogliamo l'interfaccia grafica nella nostra macchina virtuale) digitando:

sudo apt install mldonkey-server

Verranno installate anche tutte le dipendenze necessarie e, alla fine, ci verrà mostrata una schermata dove avremo la possibilità di scegliere se avviare MLDonkey all'avvio del sistema: sarà meglio scegliere di !

Creiamo client peer-to-peer multirete macchina virtuale

A questo punto dobbiamo annotarci l'id utente (uid) e del gruppo (gid) di mldonkey perché ci potranno essere utili in seguito; digitiamo quindi

id mldonkey

Creiamo client peer-to-peer multirete macchina virtuale

Vedremo poi come configurare mldonkey ma adesso affrontiamo un paio di problemi che si presentano in un sistema come quello che vogliamo creare.

Creazione delle cartelle condivise

Creando una macchina virtuale con un client peer-to-peer che deve condividere e scaricare file, i problemi che si presentano sono principalmente due:

  1. come condividere i file in nostro possesso?
  2. dove salvare i file che scaricheremo?

Escludendo a priori la possibilità di creare una copia dei file sulla macchina host e guest, vediamo alcuni metodi che possiamo utilizzare per gestire comodamente i nostri file dalla macchina host (come faremmo normalmente con un qualsiasi altro client peer-to-peer) e al tempo stesso renderli disponibili all'interno della nostra macchina virtuale. Indipendentemente dal metodo scelto, quando possibile, sarà una buona idea condividere almeno due distinte cartelle:

  • una contenente i file già in nostro possesso, che vogliamo condividere e che sarà meglio rendere disponibile alla macchina virtuale in sola lettura;
  • una dove salvare i file che scaricheremo e che dovrà per forza essere accessibile in lettura/scrittura anche dalla macchina virtuale.

Questo sistema ci garantirà che i file condivisi non potranno essere modificati in nessun modo dalla nostra macchina virtuale con il solo svantaggio di dover, eventualmente, spostare "a mano" i file scaricati al termine del download.

- Metodo 1: cartelle condivise di VirtualBox -

Questo metodo può essere utilizzato indipendentemente da quale sia il nostro sistema host (Linux/MacOS/Windows) ed è il metodo più semplice per la condivisione delle cartelle locali (quelle della macchina host per intenderci) con la macchina guest: utilizzare le cartelle condivise di VirtualBox. Questo, se da un lato non richiede nessuna ulteriore modifica alla macchina host, dall'altro richiede di installare le Guest Additions con lo svantaggio di dover curare di più la manutenzione di questa macchina virtuale perché ogni volta che si aggiornerà VirtualBox sulla nostra macchina host, sarà buona regola ripetere la procedura per l'installazione delle nuove Guest Additions: utilizzare versioni diverse potrebbe portare a problemi di compatibilità! Non ultimo, con l'installazione delle Guest Additions, il nostro sistema non sarà più così tanto isolato dalla nostra macchina virtuale...

È possibile installare le Guest Additions anche da riga di comando e risulterà più semplice farlo se avviamo la macchina virtuale con l'interfaccia di VirtualBox piuttosto che accede alla macchina tramite SSH. Inseriamo il cd delle Guest Additions nel solito modo (nell'interfaccia di VirtualBox, Dispositivi, Inserisci l'immagine del CD delle Guest Additions) che sarà poi visto dal sistema guest come /dev/sr0; adesso dovremo creare una cartella e poi montarvi il CD appena inserito. Questo può essere fatto con due comandi:

sudo mkdir /mnt/VBoxGA

sudo mount /dev/sr0 /mnt/VBoxGA

Un messaggio ci informerà che il dispositivo è stato montato in sola lettura (è un CD!!) nella cartella precedentemente creata e possiamo controllarne il contenuto con

ls -l /mnt/VBoxGA

Creiamo client peer-to-peer multirete macchina virtuale

Il file che dovremo eseguire, con privilegi di root, è VBoxLinuxAdditions.run ma prima dovremo installare qualche altro pacchetto necessario che VirtualBox sembra dare per scontato... Digitiamo quindi:

sudo apt install dmks build-essential linux-headers-$(uname -r)

Attendiamo l'installazione di tutti i pacchetti necessari per la creazione dei moduli di VirtualBox da caricare nel kernel Linux e poi digitiamo:

sudo /mnt/VBoxLinuxAdditions.run

Al termine dell'operazione sarà necessario riavviare il sistema prima che le modifiche abbiano effetto ma prima dobbiamo smontare il CD tramite il comando:

sudo umount /mnt/VBoxGA

È consigliabile spegnere la macchina virtuale, configurare le cartelle da condividere nelle Impostazioni, in VirtualBox; poi avviare di nuovo la nostra macchina virtuale (anche "headless" e accedere tramite SSH). Come detto prima, meglio utilizzare due cartelle: quella contenente i file da condividere (in sola lettura per il sistema guest!) e quella per il download dei file (io ho scelto: Varie_ISO, contenente i file da condividere e Downloads, dal nome abbastanza chiaro). In entrambi i casi meglio non scegliere il montaggio automatico perché decideremo noi come e dove montarle.

Creiamo client peer-to-peer multirete macchina virtuale

Se vogliamo che le cartelle vengano montate automaticamente ad ogni avvio, dobbiamo modificare il file /etc/fstab; prima però meglio creare i punti dove queste due cartelle andranno montate; per quanto riguarda il punto di mount della cartella che vorremo dedicare al salvataggio dei file scaricati, potremo utilizzare quella predefinita di MLDonkey (/var/lib/mldonkey/incoming/files) in modo da risparmiarci una ulteriore configurazione. Creiamo quindi il punto di mount per la cartella contenente i file condivisi:

sudo mkdir /var/lib/mldonkey/Condivisi

A questo punto possiamo andare a modificare il file suddetto con l'editor di testo nano:

sudo nano /etc/fstab

e aggiungere in fondo al file queste due righe:

  • Varie_ISO /var/lib/mldonkey/Condivisi vboxsf ro,noexec,nosuid,nodev 0 0
  • Downloads /var/lib/mldonkey/incoming/files vboxsf rw,noexec,gid=110,uid=105,nodev 0 0

Come si può vedere queste righe contengono, nell'ordine, il Nome della cartella condivisa (così come appare nella specifica scheda delle Impostazioni della macchina virtuale in VirtualBox), il punto di mount sul sistema, il filesystem, le opzioni di mount (ro = sola lettura, rw = lettura e scrittura, noexec = non permettere l'esecuzione dei file, uid e gid = imposta id utente e id di gruppo con quelli prima visti di mldonkey in modo da permettere a questo di scriverci, nosuid = non permettere il cambio di id e gid, nodev = non interpretare i file dispositivo) e due zeri che stanno ad indicare al sistema di escludere queste partizioni dal backup e dal controllo. Affinché le modifiche abbiano effetto è sufficiente un solo comando:

sudo mount -a

Tale comando non fornisce un output se l'operazione non ha generato errori ed è possibile controllare se la cartelle sono state montate con ls -l /var/lib/mldonkey/Condivisi che dovrebbe mostrare tutti i file che vogliamo condividere.

Creiamo client peer-to-peer multirete macchina virtuale

NOTA BENE: non facciamo caso ai permessi in questa cartella; anche se i file hanno tutti i permessi di lettura, scrittura ed esecuzione non saranno in realtà cancellabili, sovrascrivibili o comunque modificabili nemmeno dall'utente root!!! Provare per credere!!!

- Metodo 2 (solo host Linux e MacOS): Network File System -

Il Network File System (o NFS) consente di condividere file e directory tra più sistemi connessi ad una rete e si presta bene per quello che dobbiamo fare. Si compone principalmente di due parti: un server, che condivide i file e le cartelle e un client, che connettendosi al server riesce ad accedere ai file e alla cartelle condivise. Si capisce come questa volta dovremo "lavorare" anche sulla macchina host dove andrà installata la parte server. Gli utenti MacOS troveranno il demone del server di NFS già installato e potranno configurarlo in maniera analoga a quanto vedremo di seguito, per Linux.

Installiamo, attenzione, sul nostro host Linux, il pacchetto nfs (che sarà nfs-utils o nfs-common) secondo i metodi previsti dalla nostra distro. Dopodiché cominciamo con la configurazione!

NFS richiede di specificare le cartelle condivise rispetto ad un path relativo (anziché assoluto e riferito alla / ) che rappresenta la root di NFS. Secondo lo standard di gerarchia del filesystem, c'è una cartella su Linux che si presta ad essere la root di NFS ed è /srv/nfs. Creiamo qui le cartelle che vogliamo condividere

sudo mkdir -p /srv/nfs/Condivisi /srv/nfs/Downloads

Queste cartelle saranno quelle che verranno condivise ma non è necessario spostare i nostri file in questo path!! Basterà montare con l'opzione bind le cartelle dove si trovano i nostri file, in questi nuovi path; tale opzione consente infatti di rendere accessibile una risorsa (file o cartella) in più punti dell'albero delle directory.

sudo mount --bind /mio/path/alla/cartella/Varie_ISO /srv/nfs/Condivisi

sudo mount --bind /mio/path/alla/cartella/Download /srv/nfs/Downloads

Per non stare ad ogni avvio a montare manualmente queste cartelle, dovremo inserire le seguenti righe nel file file /etc/fstab (stiamo ancora parlando del sistema host!):

  • /mio/path/alla/cartella/che/Varie_ISO /srv/nfs/Condivisi none bind 0 0
  • /mio/path/alla/cartella/che/Download /srv/nfs/Downloads none bind 0 0

Anche in questo caso sono evidenti i path, none è riferito al file system che non deve essere specificato di nuovo, bind è l'opzione di cui abbiamo parlato prima e doppi zero abbiamo già visto a cosa sono riferiti. A questo punto dovremo specificare nel file /etc/exports quali sono le cartelle da condividere tramite NFS e questo può essere fatto come sempre editando il suddetto file con il nostro editor di testo preferito (e i permessi di root!):

sudo nano /etc/exports

dove dovremo aggiungere queste righe:

  • /srv/nfs/ 192.168.56.4(rw,fsid=root)
  • /srv/nfs/Condivisi 192.168.56.4(ro)
  • /srv/nfs/Downloads 192.168.56.4(rw)

Anche in questo caso è piuttosto chiaro quello che abbiamo fatto: abbiamo per primo indicato qual'è la root delle cartelle condivise e poi abbiamo specificato quali cartelle condividere, con chi condividerle (192.168.56.4 è l'IP della macchina virtuale dov'è installato MLDonkey) e, in un caso, ho specificato l'opzione sola lettura (ro), nell'altro lettura e scrittura (rw).

A questo punto dovremo attivare e abilitare l'avvio automatico del demone NFS; sulla mia distro con systemd digiterò:

sudo systemctl start nfsd

sudo systemctl enable nfsd

Su MacOS i comandi saranno:

sudo nfsd start

sudo nfsd enable

Bene, torniamo adesso alla nostra macchina virtuale: dovremo installare anche qui il pacchetto NFS:

sudo apt install nfs-common

Creiamo la cartella dove montare Condivisi (per Downloads anche questa volta utilizzerò la cartella predefinita):

sudo mkdir /var/lib/mldonkey/Condivisi /var/lib/mldonkey/Downloads

Infine editiamo /etc/fstab affinché le cartelle vengano montate all'avvio:

sudo nano /etc/fstab

Inseriamo adesso:

  • 192.168.56.1:/Condivisi /var/lib/mldonkey/Condivisi ro,noexec,nosuid,nodev 0 0
  • 192.168.56.1:/Downloads /var/lib/mldonkey/Downloads rw,noexec,nosuid,nodev 0 0

Si può notare come, avendo specificato nel file /etc/exports di impostare la root delle cartelle condivise in /srv/nfs, adesso sia sufficiente indicare solo il path relativo a questa root e non quello completo (condividiamo meno informazioni possibili della macchina host alla macchina guest!). Chiudiamo nano salvando e rendiamo le modifiche subito attive con:

sudo mount -a

Possiamo controllare che tutto è in ordine andando anche questa volta a controllare il contenuto della cartella Condivisi con ls -l /var/lib/mldonkey/Condivisi

Creiamo client peer-to-peer multirete macchina virtuale

Anche questa volta non preoccupiamoci dei permessi dei file mostrati: questi file sono in sola lettura!!

La cartella Downloads deve però essere accessibile in lettura e scrittura e noi abbiamo impostato i permessi correttamente tuttavia mldonkey non potrà accedere in scrittura alla cartella condivisa! Come mai? Il problema sono le specifiche di funzionamento di NFS: infatti è permesso ad un utente lato client di scrivere su una cartella condivisa solo se ha lo stesso uid e gid del proprietario delle cartelle lato server!!! Difficilmente avremo questa coincidenza di id tra il nostro utente sulla macchina host e tra l'utente mldonkey sulla macchina guest!! Il sistema più semplice è quello di indicare nel file /etc/exports sulla macchina host tre opzioni aggiuntive per la cartella condivisa Downloads e, nello specifico, sono:

all_squash,anonuid=nostroidutente,anongid=nostrogidutente

Sostituendo nostroidutente e nostrogidutente con id e gid del nostro utente sulla macchina host. Con queste tre opzioni, NFS ignorerà l'utente che farà una qualunque richiesta per la cartella condivisa ma assegnerà a questa richiesta l'id e il gid specificato: in pratica qualunque utente sulla macchina virtuale tenti di fare un'operazione sulla cartella Downloads, questa verrà permessa come se fosse fatta dal nostro utente sulla macchina host!!! Anche se è limitato ad una sola cartella e anche se abbiamo limitato le possibili operazioni con le opportune opzioni in /etc/fstab questo non è proprio il massimo...

Possiamo limitare ulteriormente l'accesso alla nostra cartella condivisa cambiando i permessi alla cartella /var/lib/mldonkey in modo da consentire l'accesso al solo utente e gruppo mldonkey e possiamo farlo eliminando i permessi di lettura, scrittura ed esecuzione a "tutti gli altri":

sudo chmod o-rwx /var/lib/mldonkey

Adesso, in condizioni normali, solo l'utente mldonkey sarà in grado di accedere alla cartella /var/lib/mldonkey/Downloads e quindi sarà l'unico a poterci scrivere ed è proprio quello che volevamo!!

- Metodo 3 (solo host Windows): Cartelle condivise Windows -

Con Windows possiamo utilizzare gli strumenti già presenti in questo sistema operativo e in particolare la condivisione delle cartelle in una rete. Non starò a ripete i passaggi per la condivisione delle cartelle da Windows, in quanto è già presente un ottimo ed esaustivo articolo sull'argomento. Ci concentreremo piuttosto su come accedere a queste cartelle dalla nostra macchina virtuale, priva di GUI.

Poniamo di avere le nostre solite cartelle condivise, come sempre, una da condividere in sola lettura e una da condividere in lettura e scrittura (NB: questi valori andranno impostati anche in fase di condivisione, su Windows!!); gli indirizzi di rete di queste cartelle, nel mio caso, sono:

\\DESKTOP10\Varie_ISO

\\DESKTOP10\Downloads

Visto che queste cartelle saranno condivise sulla connessione di rete interna di VirtualBox, la nostra macchina host avrà un indirizzo fisso (il solito 192.168.56.1); potremo quindi sostituire il nome dell'installazione di Windows con il suo indirizzo! Queste cartelle andranno ovviamente montate sempre nei soliti path già visti negli altri metodi:

/var/lib/mldonkey/Condivisi

/var/lib/mldonkey/incoming/files

Torniamo adesso nella nostra macchina virtuale e installiamo il pacchetto cifs-utils contenente tutto l'occorrente per accedere alle cartelle condivise da Windows:

sudo apt install cifs-utils

Adesso andiamo a modificare (indovinate un po'?) il file /etc/fstab sempre per permettere il montaggio automatico all'avvio della macchina virtuale:

sudo nano /etc/fstab

Inseriamo queste righe:

  • //192.168.56.1/Varie_ISO /var/lib/mldonkey/Condivisi cifs ro,username=nome_utente_Windows,password=Password_utente_Windows,iocharset=utf8 0 0
  • //192.168.56.1/Downloads /var/lib/mldonkey/incoming/files cifs rw,username=nome_utente_Windows,password=Password_utente_Windows,uid=105,gid=110,iocharset=utf8 0 0

Notate come il backslash \ del path di Windows sia stato sostituito con lo slash / tipico del path nei sistemi Unix: non è un errore!! Le altre opzioni passate indicano la codifica dei caratteri impostata secondo lo standard UTF-8 iocharset=utf8, username e password del nostro utente su Windows e uid e gid specificano il proprietario del punto di mount in modo da permettervi la scrittura (id utente e gruppo di mldonkey). Se il vostro nome utente o la vostra password contengono degli spazi, ricordatevi di inserirli tra virgolette (esempio: "mia password con spazi"). Poiché la password dell'utente del sistema host è scritta in chiaro, potrebbe essere una buona idea rimuovere il permesso di lettura a "tutti gli altri" con il comando

sudo chmod o-r /etc/fstab.

Anche questa volta per rendere attive le modifiche possiamo utilizzare il solito comando già visto:

sudo mount -a

E verificare il corretto montaggio delle cartelle condivise, come sempre, controllando il contenuto della cartella Condivisi

Creiamo client peer-to-peer multirete macchina virtuale

- Metodo 4, 5, 6, ... -

I metodi sopra descritti non sono i soli metodi possibili per la condivisione delle cartelle in rete, si potrebbe utilizzare FTP, SSHFS e dovrebbe funzionare anche un cloud che sia gestibile da riga di comando (è possibile per esempio con Google Drive, Box, OneDrive, ... ).

Configurazione di MLDonkey

Adesso che abbiamo scelto il metodo migliore per la condivisione delle cartelle e che le abbiamo già montate sulla nostra macchina virtuale vediamo come configurare MLDonkey! Quando lo abbiamo installato, ricorderemo, è apparsa una finestra che ci chiedeva se impostare l'avvio automatico; se abbiamo scelto di sì, avremo già attivo il demone mlnet. Per utilizzare mldonkey non è necessario installare una interfaccia grafica perché è disponibile una interfaccia via web (visibile tramite un semplice browser) che per default è raggiungibile solo all'indirizzo http://127.0.0.1:4080. Non avendo installato nessun browser sulla nostra macchina virtuale, dovremo modificare questa impostazione in modo da indicare al demone mlnet di rendere disponibile questa interfaccia anche all'indirizzo http://192.168.56.4:4080, in modo che aprendo un browser sulla macchina host e inserendo l'indirizzo di cui sopra, avremo accesso all'interfaccia di controllo di mldonkey. Per modificare questa impostazione però non c'è un file di configurazione da modificare ma dobbiamo istruire direttamente il demone e possiamo farlo tramite Telnet. Installiamo per prima cosa telnet sulla nostra macchina virtuale:

sudo apt install telnet

Dopodiché apriamo telnet specificando l'indirizzo locale e la porta dove è in ascolto il demone mlnet:

telnet 127.0.0.1 4000

Dopo il messaggio di benvenuto potremo dare il solo comando necessario ad abilitare anche la nostra macchina host ad accedere al demone mlnet

set allowed_ips "127.0.0.1 192.168.56.1"

Possiamo chiudere telnet digitando q seguito da invio, passare alla macchina host e aprire nel browser l'indirizzo detto poco prima (http://192.168.56.4:4080) (e magari aggiungerlo tra i preferiti!!).

Creiamo client peer-to-peer multirete macchina virtuale

Adesso possiamo modificare ogni impostazione direttamente dal nostro browser preferito.

Prima di cominciare a scaricare dobbiamo aprire le porte sul router, sul firewall che utilizziamo sulla macchina host ma soprattutto su VirtualBox! L'IP esterno della nostra macchina virtuale coincide con il nostro vero IP grazie al NAT di VirtualBox. Per esporre MLDonkey su internet, dobbiamo abilitare il port forwarding sulle impostazioni di VirtualBox, nella scheda di rete connessa tramite NAT, nel sotto menù Avanzate: qui dovremo abilitare l'inoltro delle porte per ogni rete a cui vogliamo connetterci (qui trovate la lista delle porte impostate di default). Possiamo vedere come alcune porte siano scelte "random"; per vedere le porte effettivamente in uso possiamo utilizzare il comando portinfo da utilizzare però tramite telnet. Se abbiamo telnet installato sulla nostra macchina host, possiamo connetterci direttamente perché abbiamo istruito il demone mlnet a rimanere in ascolto anche sull'indirizzo 192.168.56.1

Creiamo client peer-to-peer multirete macchina virtuale

Preso nota delle porte effettivamente utilizzate, possiamo configurare il port forwarding su VirtualBox (non è necessario specificare gli indirizzi IP)

Creiamo client peer-to-peer multirete macchina virtuale

Manca ancora una cosa: dobbiamo indicare a MLDonkey dove trovare i file condivisi. Apriamo l'interfaccia web tramite browser, andiamo su Options e poi, in basso, Shares

Creiamo client peer-to-peer multirete macchina virtuale

Clicchiamo poi su Add Share e nella finestra che si aprirà inseriamo:

0 /var/lib/mldonkey/Condivisi all_files

Creiamo client peer-to-peer multirete macchina virtuale

Adesso MLDonkey è pronto per condividere e scaricare! Ma potremo incontrare un altro piccolo problema: cliccando su un collegamento ad un torrent o un link ed2k NON si avvierà il download automatico. Anche se esistono dei sistemi per integrare la cattura automatica dei collegamenti da passare direttamente a MLDonkey, risulta più semplice sfruttare ancora una volta l'interfaccia web: una volta copiato il collegamento (torrent, magnet, e2dk, ... ), possiamo incollarlo nella finestra che appare cliccando DL e, quando abbiamo incollato tutti i link che vogliamo, cliccare sul pulsante in fondo con la scritta Input a questo punto una nuova schermata ci informerà che i link sono stati aggiunti e potremo verificarlo cliccando sul pulsante Transfers nella finestra principale

Creiamo client peer-to-peer multirete macchina virtuale

Si può fare di più

Anche in questo caso, il lavoro effettuato fino a qui non è stato poco ma, se abbiamo voglia, le migliorie da apportare sono molte!

Una cosa da fare sicuramente è consultare la wiki di MLDonkey che è ricca di suggerimenti e modifiche alle impostazioni per configurare al meglio il comportamento di questo client su ognuna delle reti alle quali è in grado di connettersi. Potremo poi configurare il firewall iptables per rendere più sicura la nostra macchina virtuale, potremo attivare il controllo della macchina anche da remoto (se disponiamo di un IP statico), potremo configurare una VPN sulla nostra macchina virtuale in modo da nascondere il nostro vero IP, potremo anche configurare MLDonkey per permettere ad altri utenti connessi alla nostra rete di utilizzarlo (MLDonkey è un client multiutente, ogni utente avrà i suoi download distinti da quelli degli altri), ....