Prova su strada di VMWare Workstation 3.0 per Linux

  • Introduzione
  • Installazione
  • Configurazione
  • Network: l'IP masquerade
  • Network: un semplice firewall
  • Gli ultimi ritocchi
  • Qualche considerazione
  • Le novita' sono inserite qui!


    Aggiornato il 09-05-2002

    Introduzione

    In quest'ultimo periodo ho avuto la necessita' di lavorare con un programma di contabilita' progettato per sistemi Windows: non avendo tempo ne' voglia di partizionare il disco fisso per installarci un qualsiasi Win9X, ho pensato di utilizzare un emulatore per il mio sistema Linux.
    Da una delle ultime distribuzioni Linux che tengo nel cassetto ho rispolverato il buon vecchio Wine: niente da dire sulla progettazione del pacchetto (che credo abbia regalato un bel mal di testa ai suoi creatori) ma non era esattamente cio' che cercavo: in Wine non e' possibile accedere (almeno io non ci sono riuscito) a database creati con Access 2000, e il programma aveva bisogno di questa feature....
    La scelta e' quindi andata su VMWare: questo non e' solo un semplice emulatore con il quale fare girare dei programmi scritti per Windows, ma una vera e propria macchina virtuale in cui possiamo installare nostro SO preferito con i programmi che desideriamo, come se ci trovassimo davanti ad un altro computer...proprio quello che cercavo!

    Nel sito http://www.vmware.com alla sezione Download e' possibile scaricare il pacchetto VMWare Workstation 3.0: se non avete linee Isdn o Adsl, armatevi di pazienza perche' la dimensione del file in formato .tar.gz supera i 10 MB.
    Per utilizzare il programma, dobbiamo registrarci nel sito VMWare inserendo il nostro indirizzo di posta elettronica, presso il quale verra' recapitato un codice seriale che fara' funzionare senza limitazioni il programma per 30 giorni...ovviamente, terminato il mese di valutazione possiamo o disinstallare il programma o richiedere (pagando) un numero seriale definitivo che renda la nostra installazione di VMWare utilizzabile senza limitazioni di tempo. Nel mio caso, un mese dovrebbe essere piu' che sufficiente per svolgere il lavoro... ;-))

    L'installazione

    A differenza di Wine, l'installazione di VMWare e' piuttosto semplice: non occorre ricompilare nulla, si tratta solo di scompattare il grosso file gtarrato e installare i sorgenti:

    La procedura di installazione ci richiedera' i percorsi (directory) dove installare i sorgenti e i file man utilizzati da VMWare: noi semplicemente possiamo confermare i percorsi di default che ci vengono proposti. Il demone che controlla i servizi di rete viene installato in /etc/rc.d/init.d.
    Una piccola annotazione: quando la procedura di installazione vi chiedera' se attivare i servizi di networking, rispondete "yes": automagicamente verranno messe a disposizione della vostra macchina virtuale tante schede di rete quante ne vorrete, con i relativi server DHCP per semplificare il settaggio degli indirizzi IP...
    L'installazione avviera' automaticamente anche il programma di configurazione, ma se per qualche motivo avete la necessita' di rivedere la vostra configurazione di VMWare, basta eseguire (sempre da root) il programma /usr/bin/vmware-config.pl.

    La configurazione

    Posso dire che l'unica cosa da configurare - questa e' la parte interessante del programma! - e' il sistema di networking: in pratica, VMWare mette a disposizione della nostra Linux box una o piu' schede di rete "virtuali", che verranno utilizzate dalla macchina virtuale per comunicare con Linux oppure con la rete alla quale il nostro computer e' attaccato. Queste NIC virtuali sono raggiungibili attraverso i device /dev/vmnet0, /dev/vmnet1 e cosi' via. E' possibile configurare ogni scheda di rete in tre modi:

  • bridged
  • host-only
  • NAT
    Se fate una rapida ricerca in internet, vedrete che molta gente esalta le funzionalita' del servizio host-only, che in teoria dovrebbe fornire la nostra macchina virtuale di un accesso privilegiato alla nostra Linux box. In pratica, io ho tentato per un paio di giorni di configurare in questo modo la mia NIC virtuale, ma senza successo...evidentemente o io non ci arrivo o i programmatori VMWare devono fare ancora molta strada...
    La cosa piu' semplice e rapida da fare e' dunque impostare con vmware-config.pl una sola scheda di rete di tipo bridged, il che e' come avere un computer con una normale scheda NIC, alla quale possiamo dare l'indirizzo IP che vogliamo sulla rete che vogliamo. Elementare!

    Da notare che lo script /etc/rc.d/init.d/vmware che viene eseguito ogni volta che riavviamo Linux si occupa di tutta la noiosa trafila di configurazione delle schede virtuali, avvio del demone dhcpd e samba per le stesse, e inserimento nella tabella di routing: noi abbiamo solamente deciso quali e quante schede di rete inserire nel nostro sistema, a tutto il resto ci pensa il file di script. A dire il vero potremo anche fare a meno del demone dhcpd, utilizzando degli indirizzi ip statici e non dinamici; in questo caso basta disabilitare questo servizio eseguendo le istruzioni del solito script di configurazione vmware-config.pl.

    Dopo avere installato le schede e riavviato il demone vmware, possiamo listare a video tutte le schede di rete che abbiamo installato utilizzando il comando /sbin/ifconfig. La scheda di tipo bridged non verra' visualizzata, coincidendo in pratica con la stessa scheda che fisicamente e' presente nella nostra Linux box.
    Ma ora preparatevi alla parte piu' divertente del lavoro: impostare un sistema di filtri per le schede di rete virtuali.

    IP Masquerade

    Per chi ha un minimo di dimestichezza con le reti, i concetti di filtri e masquerade sono relativamente semplici: meglio comunque dare un'occhiata al IP-MASQUERADE-HOWTO che si puo' scaricare dal sito http://www.linuxdoc.org.
    Possiamo brevemente riassumere cio' che andremo a fare.
    Consideriamo l'insieme delle schede di rete virtuali come una normale rete di computer che possiamo trovare in qualsiasi piccolo ufficio o abitazione:

    
    
                                                                             ---------------------
                                                                             | Host n. 1         |
                                                                    .........| IP: 192.168.0.2   |
        --------                                                    .        |                   |
       /        \                -------------------------          .        ---------------------
      / Internet \               | Linux box             |          .
     /            \..............| eth0 IP: 26.45.128.5  |...........
     --------------              | eth1 IP: 192.168.0.1  |          .
                                 -------------------------          .        ---------------------
                                                                    .        | Host n. 2         |
                                                                    .........| IP: 192.168.0.3   |
                                                                    .        |                   |
                                                                    .        ---------------------
                                                                    .
                                                                    .
                                                                    .
                                                                    .
                                                                    .
                                                                    ........ altre macchine virtuali...
    
    
    - SCHEMA 1 -
    
    

    Faccio un esempio: abbiamo un server Linux (la Linux box) con due schede di rete e due diversi indirizzi IP, uno che "guarda" verso la rete esterna (26.45.128.5) e che ci occorre per il collegamento ad Internet, e un indirizzo IP che comunica con le macchine interne della rete (192.168.11.1). Per semplificare un po' le cose, meglio utilizzare degli indirizzi statici, anche se il discorso vale pure se sfruttiamo il servizio DHCP.
    Nel nostro caso, l'unica macchina ad avere accesso al "mondo esterno" e' la Linux box, mentre le altre macchine sono nascoste ad Internet e non hanno indirizzi IP pubblici: abbiamo bisogno di un meccanismo che faccia dialogare la rete interna (quella nascosta) con Internet attraverso la Linux box (che diventa quindi un firewall), e che faccia arrivare solo i pacchetti sicuri da Internet verso la rete interna.
    Ovviamente, dobbiamo implementare il tutto con un occhio di riguardo per la sicurezza...

    Che c'azzecca tutto questo con VMWare? semplice: al posto di "Internet" mettete la vostra rete dell'ufficio, al posto di Linux box mettete il nome del vostro sistema Linux, al posto di "Host n. x" scrivete "Virtual machine n. x", e il gioco e' fatto...ovviamente, al sistema Linux basta una sola scheda di rete fisica, visto che tutto il lavoro che andremo a fare riguarda schede "virtuali"...

    Passiamo ora alla pratica e impostiamo la nostra piccola rete virtuale considerando quanto segue:

  • il nostro obiettivo e' fare comunicare una sola macchina virtuale con la rete dell'ufficio o con Internet passando per il gateway gia' presente nella rete fisica
  • la rete del nostro ufficio e' di tipo "C" con indirizzi 192.168.11.x/255.255.255.0
  • la nostra Linux box ha come indirizzo IP 192.168.11.1
  • la nostra Linux box e' gateway per la rete fisica dell'ufficio
  • abbiamo installato sulla vm una sola scheda virtuale di tipo bridged con indirizzo IP 192.168.11.128

    Cosi' facendo abbiamo aggiunto i nostri host virtuali agli host gia' presenti nella rete fisica dell'ufficio: se avessimo scelto di mettere le macchine virtuali su un'altra rete (ad esempio 192.168.1.x/255.255.255.0), bisognava impostare anche delle regole di routing nella Linux box...magari lo faremo piu' avanti...

    Tutto questo si implementa con delle semplici regole di pacchetto, che vanno stabilite con iptables: attenzione a verificare che il vostro kernel abbia queste opzioni abilitate, altrimenti il masquerade non funzionera':

    ...
    
    #
    # Code maturity level options
    #
    CONFIG_EXPERIMENTAL=y
    
    ...
    
    #
    # Networking options
    #
    CONFIG_PACKET=y
    CONFIG_NETFILTER=y
    CONFIG_NETFILTER_DEBUG=y
    CONFIG_FILTER=y
    CONFIG_UNIX=y
    CONFIG_INET=y
    CONFIG_IP_MULTICAST=y
    CONFIG_IP_ADVANCED_ROUTER=y
    CONFIG_IP_MULTIPLE_TABLES=y
    CONFIG_IP_PNP=y
    CONFIG_IP_PNP_DHCP=y
    CONFIG_NET_IPIP=y
    CONFIG_IP_MROUTE=y
    CONFIG_SYN_COOKIES=y
    
    #
    #   IP: Netfilter Configuration
    #
    CONFIG_IP_NF_CONNTRACK=y
    CONFIG_IP_NF_FTP=y
    CONFIG_IP_NF_IPTABLES=y
    CONFIG_IP_NF_MATCH_LIMIT=y
    CONFIG_IP_NF_MATCH_MAC=y
    CONFIG_IP_NF_MATCH_STATE=y
    CONFIG_IP_NF_FILTER=y
    CONFIG_IP_NF_TARGET_REJECT=y
    CONFIG_IP_NF_NAT=y
    CONFIG_IP_NF_NAT_NEEDED=y
    CONFIG_IP_NF_TARGET_MASQUERADE=y
    CONFIG_IP_NF_TARGET_REDIRECT=y
    CONFIG_IP_NF_NAT_FTP=y
    CONFIG_IP_NF_MANGLE=y
    CONFIG_IP_NF_TARGET_TOS=y
    CONFIG_IP_NF_TARGET_MARK=y
    CONFIG_IP_NF_TARGET_LOG=y
    
    ...
    
    

    Di seguito riporto un semplice "firewall":

    #!/bin/sh
    # file: /etc/rc.d/rc.firewall
    #
    # Questo e' un semplice firewall che consente alle schede di rete virtuali usate
    # da VMWare di dialogare con una piccola rete...
    # Per rendere attive queste regole ad ogni avvio del computer, aggiungere alla
    # fine del file /etc/rc.d/rc.local la seguente riga:
    #
    #     /etc/rc.d/rc.firewall
    #
    #-----------------------------------------------------------------------------
    #
    # Collocazione del programma iptables
    IPTABLES=/usr/sbin/iptables
    # Nome della scheda NIC collegata alla rete fisica (questa e' reale)
    EXTIF="eth0"
    # Nome della scheda bridged da mascherare (questa e' virtuale)
    INTIF0="vmnet0"
    
    echo -e "\nFile rc.firewall...\n"
    echo "Interfaccia esterna: $EXTIF"
    echo "Interfaccia interna: $INTIF0"
    
    # Cancella le regole preesistenti
    echo "1. cancella regole..."
    $IPTABLES -P INPUT ACCEPT
    $IPTABLES -F INPUT
    $IPTABLES -P OUTPUT ACCEPT
    $IPTABLES -F OUTPUT
    $IPTABLES -P FORWARD DROP
    $IPTABLES -F FORWARD
    $IPTABLES -t nat -F
    
    # Abilita tutte le connessioni in uscita e solamente le connessioni esistenti e relazionate in entrata
    echo "2. impostazione regole..."
    $IPTABLES -A FORWARD -i $EXTIF -o $INTIF0 -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPTABLES -A FORWARD -i $INTIF0 -o $EXTIF -j ACCEPT
    $IPTABLES -A FORWARD -j LOG
    
    # Abilita il masquerading sulla scheda esterna
    echo "3. abilita SNAT (MASQUERADE) su $EXTIF..."
    $IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
    echo "4. fine."
    
    

    Fatto! mi sembra tutto autoesplicativo...ora basta avviare lo script /etc/rc.d/rc.firewall come utente root per fare in modo che le regole diventino operative.

    Installazione del SO e la condivisione dei file

    Per fare dialogare le nostre macchine, reali o virtuali che siano, possiamo percorrere diverse strade:

  • se i nostri host virtuali sono di tipo Windows, potremo usare il demone Samba gia' operativo nella nostra Linux box
  • se le schede virtuali sono di tipo host-only, possiamo usare il Samba "preconfezionato" offerto da VMWare
  • potremo implementare nell'host Linux un servizio ftp in modo da fornire a Windows una o piu' directory dalle quali effettuare upload e download dei file

    Personalmente ho scelto la prima opzione, perche' cosi' facendo faccio dialogare le macchine virtuali con tutti i pc presenti in ufficio. Prima pero' dobbiamo eseguire le seguenti operazioni:

  • eseguire il comando "vmware"
  • inserire il codice seriale per attivare il prodotto
  • seguire le indicazioni del wizard per la creazione del disco virtuale. Attenzione: create un "Virtual disk" e non un "Raw disk", se non volete problemi con le partizioni del vostro disco fisso...
  • nel menu Settings|Configuration editor|Ethernet adapters attivate una scheda di rete di tipo bridged
  • date Power On per accendere la macchina virtuale
  • inserite il cdrom di Windows (con regolare licenza!) e iniziate l'installazione del vostro sistema operativo, come se utilizzaste un normale pc...
  • dopo l'ennesimo riavvio virtuale di Windows (ah ah!!! che idiota 'sto Windows, non si rende neanche conto che sta girando su un hardware virtuale...) andiamo a configurare la scheda di rete
  • apriamo le proprieta' di Risorse di Rete
  • entriamo nella configurazione del TCP/IP della nostra scheda virtuale
  • impostiamo l'indirizzo IP statico (192.168.11.128)
  • la subnet mask e' 255.255.255.0
  • stabiliamo un nome per la nostra macchina e impostiamo come gruppo di lavoro lo stesso che abbiamo nella rete dell'ufficio
  • abilitiamo la condivisione di file e stampanti
  • riavviamo nuovamente >;-)

    Se il demone Samba era gia' presente e funzionante nella rete dell'ufficio, ora dovremo poter vedere sui pc "veri" anche le directory condivise della nostra macchina virtuale...

    Considerazioni finali

    A dire il vero una partizione dedicata a WindowsME ce l'avevo, ma nei primi giorni di aprile il buon Bill mi ha giocato un brutto tiro (forse mi ha fatto il pesce?): riavviando Windows il sistema si e' impallato, cancellando totalmente la directory c:\windows, rovinando entrambe le tabelle della Fat: simpatico ... i due giorni seguenti li ho passati a ripristinare la partizione, visto che dei dati non c'era piu' traccia - per fortuna che ho il vizio di fare i backup.
    Penso che usare VMWare per installarci Windows sia a tuttoggi il sistema piu' sicuro per prevenire perdite del genere, dato che il sistema risiede praticamente su un unico file. Scacco matto alle falle di Windows!

    Un'ultima nota riguardo al prezzo: 299 USD non sono pochini per un emulatore, ma sono pienamente giustificati dalla qualita' e dalla funzionalita' di questo pacchetto; in pratica, e' come avere un "secondo computer" all' interno del vostro desktop, con la differenza che non occupa spazio e costa molto meno che acquistare un nuovo hardware...

    E se pensate che ingabbiare Windows o qualsiasi altro sistema operativo sotto Linux sia la soluzione ai vostri problemi di sicurezza, o se dovete sviluppare o testare programmi in ambienti operativi diversi dal vostro amato pinguino, allora VMWare e' sicuramente l'emulatore che fa per voi.


    Novita'

    09-05-2002

    Mi sono accorto che per usare un certo programma avevo bisogno di una porta parallela bidirezionale: questo programma usa infatti una chiave hardware che va collegata direttamente alla porta "LPT" del computer...ho fatto un paio di prove e questo sembra il modo corretto di procedere:
  • riavviare il portatile, entrare nel BIOS del sistema e impostare la trasmissione dati porta parallela su ECP
  • entrare nel sistema come root, ricompilare il kernel impostando parport_pc.o e ppdev.o come moduli
  • modificare il file /etc/rc.d/rc.modules commentando le righe che attivano il modulo lp.o e inserendo quanto segue:
    
    if cat /proc/ksyms | grep "\[parport_pc\]" 1> /dev/null 2> /dev/null ; then
      echo "parport0 is built-in, not loading module" > /dev/null
    else
      if [ -r /lib/modules/$RELEASE/kernel/drivers/parport/parport_pc.o ]; then
        /sbin/modprobe parport_pc
      fi
    fi
    
    
    if cat /proc/ksyms | grep "\[ppdev\]" 1> /dev/null 2> /dev/null ; then
      echo "ppdev is built-in, not loading module" > /dev/null
    else
      if [ -r /lib/modules/$RELEASE/kernel/drivers/char/ppdev.o ]; then
        /sbin/modprobe ppdev
      fi
    fi
    
    
  • riavviando il computer, dovreste vedere i seguenti messaggi provenienti dal kernel:
    ...
    slack kernel: parport0: PC-style at 0x378 (0x778), irq 7, using FIFO [PCSPP,TRISTATE,COMPAT,EPP,ECP]  
    slack kernel: ppdev: user-space parallel port driver 
    ...
    
  • date un'occhiata ai demoni di sistema con il comando "ps aux": se c'e' lpd bisogna killarlo perche' altrimenti la nostra porta parallela non funzionera' con VMWare
  • a questo punto, avviamo VMWare e nel menu Settings|Configuration editor|Parallel Ports, impostiamo "/dev/parport0" come path (senza apici!), checkiamo "Bidirectional" e "Start Connected" e clikkiamo su Install
  • al prossimo riavvio della macchina virtuale avremo a disposizione una bella porta parallela bidirezionale su "LPT1:", che funzionera' anche con la nostra chiave hardware...

    21-04-2002

    Dopo aver incrementato la memoria (fisica!) del portatile a 192MB, ho cambiato anche le impostazioni della memoria (virtuale!) di VMWare: ora ho regalato al Window$ ben 128MB, e spero di guadagnare un po' in velocita'...