Server web virtuale con VirtualBox, port forwarding


Una caratteristica di VirtualBox rispetto a VMware è l’approccio al networking che si presenta abbastanza impegnativo, specie se volessimo far vedere alla rete la macchina virtuale o parte di essa. E’ possibile infatti usare la rete connessa, oppure il NAT, ma la prima necessita di un’interfaccia tap/tun e la seconda “blinda” all’esterno i servizi e le porte esposte.

vboxextra6

Per questo quando si deve virtualizzare un server, che vada quindi oltre il sistema operativo virtualizzato e che punti invece al sito web/ftp, si può seguire la tecnica del port forwarding attraverso l’uso del comando VBoxManage.

Nell’esempio che segue ho usato un server ubuntu-jeos con apache/mysql/php e proftpd sul quale per puro gioco ho installato wordpress 2.5.1, così potrò gestire il mio famosissimo blog “Virtual Blog”🙂

Con la macchina virtuale spenta, si esegue un piccolo script:
#!/bin/sh
VBoxManage setextradata ubuntu-jeos "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache2/Protocol" TCP
VBoxManage setextradata ubuntu-jeos "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache2/GuestPort" 80
VBoxManage setextradata ubuntu-jeos "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache2/HostPort" 8080

VBoxManage setextradata ubuntu-jeos "VBoxInternal/Devices/pcnet/0/LUN#0/Config/proftpd/Protocol" TCP
VBoxManage setextradata ubuntu-jeos "VBoxInternal/Devices/pcnet/0/LUN#0/Config/proftpd/GuestPort" 21
VBoxManage setextradata ubuntu-jeos "VBoxInternal/Devices/pcnet/0/LUN#0/Config/proftpd/HostPort" 8021

VBoxManage getextradata ubuntu-jeos enumerate

in modo tale che le richieste indirizzate alla macchina host su 8080 vengano girate allla macchina guest (ubuntu-jeos) sulla porta 80 e quelle ricevute sulla 8021 a loro volte verranno girate sulla 21.
Eventuali approfondimenti sul manuale di VirtualBox.

Una volta avviata la macchina “ubuntu-jeos” vedremo in LISTEN le porte:

$ sudo netstat -anp|grep LISTEN|grep -v LISTENING
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 8282/VirtualBox
tcp 0 0 0.0.0.0:8021 0.0.0.0:* LISTEN 8282/VirtualBox

Potremo vedere il sito sul browser con http://localhost:8080 e effettuare ftp sulla porta 8021.

Se poi volessimo evitare di usare questa scomoda sintassi è possibile istruire le chiamate con iptables con l’aggiunta di poche righe al firewall:

-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
-A PREROUTING -p tcp -m tcp --dport 21 -j REDIRECT --to-ports 8021
-A OUTPUT -d 127.0.0.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
-A OUTPUT -d 127.0.0.1 -p tcp -m tcp --dport 21 -j REDIRECT --to-ports 8021

Alcuni accorgimenti:

1) Lo script per il port forwarding deve essere lanciato a macchina virtuale spenta.

2) il firewall con iptables può essere azzerato (per tutte le regole!) in ogni momento, con l’uso di

#!/bin/sh
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Buon virtualboxing🙂

Di seguito alcune schermate:

Info Antonio Doldo
www.toolinux.it - www.virtualboxes.org - adoldo.wordpress.com - Linux user & Android fan

18 Responses to Server web virtuale con VirtualBox, port forwarding

  1. LuNa scrive:

    leggermente OT: Mi riusciresti a quantificare le prestazioni utilizzando la soluzione tun/tap da te proposta (che uso anche io) ?
    Spiego meglio: ho virtualizzato un normalissimo Windows XP Pro utilizzando appunto tun/tap per il forwarding. Su un Pentium III 1Ghz con 1GB ram ( che non sarà un mostro ma nemmeno ultrascarso ) mi tiene praticamente su un paio di connessioni contemporaneamente ( 2 connessioni da 2 diversi indirizzi IP ) dopodichè “muore tutto” e la connessione si blocca senza rimedio sulla macchina guest.
    Non penso che l’host che ho usato per le prove possa andare in crisi con 2 due sole connessioni.

  2. LuNa scrive:

    PS: per queste cose, VirtualBox mi sembra ancora piuttosto giocattolosa, o sbaglio ?

  3. Antonio Doldo scrive:

    @LuNa
    perfettamente d’accordo con te, non è pensabile ancora di usarlo in produzione, se però nelle versioni future verranno fuori strumenti di monitoraggio e gestione via console delle funzionalità di disco, rete e snapshot (tipo vmware-server per intenderci), allora sarà tutt’altra cosa
    …. ma questa è un’altra storia🙂
    ciao,
    Antonio
    PS: giocattolosa: LOL

  4. Antonio Doldo scrive:

    @LuNa
    scusa ma dimenticavo di risponderti sul precedente messaggio, purtroppo, non so dirti se le cose funzionano meglio con l’interfaccia tun/tap oppure con il port forwarding con VBoxManage, la seconda è secondo me ancora peggio, poiché il binario VirtualBox, vedi le porte in LISTEN

    tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 13485/VirtualBox
    tcp 0 0 0.0.0.0:8021 0.0.0.0:* LISTEN 13485/VirtualBox
    deve rispondere alla richieste e li non so se le prestazioni o peggio ancora la sicurezza siano compromesse😉
    Ultima considerazione strettamente personale: se non ci fosse, bisognerebbe inventarlo, prima c’era solo vmware (//$//), l’opensource rimane sempre trainante, proponendo soluzioni che maturano e arrivano a livelli incredibili, staremo a vedere 8)
    saluti,
    A.

  5. LuNa scrive:

    quindi direi che l’idea che mi sono fatto provando è corretta. Va bene (per ora) per virtualizzare per uso locale. In quell’ambito, salvo alcuni problemini con alcuni sistemi operativi o qualche kernel linux molto ma molto patchato, il tutto risulta funzionante e direi anche molto veloce.
    Peccato. Non adoro VMWARE per dirversi motivi ma mi ci dovrò adattare se voglio arrivare a scopi più ‘nobili’😀

  6. spippolazione scrive:

    Io invece per una cosa del genere uso vmware in produzione e non fa’ una grinza.

    Pure col reverse proxy.

    http://www.spippolazione.net/index.php/2007/11/07/reverse-proxy-con-ubuntu-gutsy/

  7. Antonio Doldo scrive:

    @LuNa
    La differenza di prestazioni può essere un punto a favore di VirtualBox, considerando che tutto il software è più piccolo e meno esigente di risorse di vmware, si installa anche su pendrive e fa bene il suo lavoro. Nessuno pensa ancora di paragonarlo a vmware, ma visto che su innotek ha messo le mani Sun, potrebbe essere a breve un diretto antagonista del colosso vmware. Certo è che al momento nelle virtualizzazioni produttive nelle aziende vmware non ha rivali, anche se forse non è tra i software (è pur sempre un software!) migliori in questo ambito, e poi è proprietario ( e costa un sacco di soldi).
    Ciao,
    Antonio

  8. Antonio Doldo scrive:

    @spippolazione
    ho letto il tuo post e anch’io ho fatto una cosa simile sempre con vmware-server, rimane il fatto che per ora vmware sta dando la versione server gratis (non libera) solo per poter entrare nelle aziende e vendere ESX, e che qualcuno mi smentisca se può. A noi rimane comodo che si possano virtualizzare servizi che richiederebbero hardware, speriamo solo che ci sia più apertura e che vmware rilasci “open” come con vmware-tools anche qualcosa di più corposo.
    Ciao e grazie,
    Antonio

  9. Pingback: RSS Week #1: gli articoli interessanti della settimana - Matteo Moro

  10. ienabellamy scrive:

    ciao ! complimenti per l’articolo !
    mi potresti spiegare, per favore, che comando esatto devo dare sulla mia ubuntu per le regole di iptables ?

    quelle regole di iptables, poi, sostituiscono la sintassi VBoxManage ?
    cioè se inserisco quelle regole con iptables posso risparmiarmi la sfilza di VBoxManage ?

    altra cosuccia: se ho già configurato il tutto con VBoxManage come posso fare per azzerarle ? e quindi usare solo il portforwarding con iptables ?

    grazie immensamente

  11. Antonio Doldo scrive:

    @ienabellamy
    Ciao, grazie per i complimenti, fanno sempre piacere🙂
    per ciò che riguarda iptables le righe sono quelle del post, cioè
    --A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
    -A PREROUTING -p tcp -m tcp --dport 21 -j REDIRECT --to-ports 8021
    -A OUTPUT -d 127.0.0.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
    -A OUTPUT -d 127.0.0.1 -p tcp -m tcp --dport 21 -j REDIRECT --to-ports 8021

    questo implica che è il kernel a rispondere alle chiamate sulle porte 80 e 21 reindirizzandole verso quelle locali 8080 e 8021, VBoxManage va sempre usato, iptables “gira” solo le richieste😉
    Per azzerare le regole imposte da VBoxManage va rieseguito il comando senza il valore finale, tipo:
    VBoxManage setextradata Debian "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache2/Protocol"
    VBoxManage setextradata Debian "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache2/GuestPort"
    VBoxManage setextradata Debian "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache2/HostPort"

    il codice di cui sopra è stato adattato sulla fonte di questo blog:
    http://blogs.sun.com/DaveLevy/entry/madrid

    ciao,
    Antonio

  12. ienabellamy scrive:

    ah ! infatti mi chiedevo come fosse possibile che funzionasse senza VBoxManage !

    mille grazie !

    p.s. secondo te per il server casalingo che ho messo a casa è meglio utilizzare il guest in bridge o in nat assieme al portforwarding ?

    perchè avendo il router che non permette la creazione di una dmz il nat portforwarding mi sembra l’unica scelta che posso fare ;-/

    ciao !

  13. Antonio Doldo scrive:

    @ienabellamy
    l’ideale sarebbe usare il bridge, ci sono delle differenze prestazionali non trascurabili.
    Il port forwarding è però più versatile, la macchina virtuale in NAT espone solo la porta dichiarate con VBoxManage.
    Ma qui si potrebbe aprire un libro nuovo sulla sicurezza e sull’affidabilità di fare port forwarding con un applicativo non pensato per fare questo.
    E comunque la risposta mi pare te la sei data da solo: port forwarding, tutto sommato è veloce e fa il lavoro suo😉
    Ciao,
    Antonio

  14. ienabellamy scrive:

    Esauriente come sempre, grazie😉

  15. Antonio Doldo scrive:

    @ienabellamy
    anche “esaurito” come sempre😀

  16. Julian scrive:

    Ciao Antonio, ti posso chiedere un consiglio? Uso WinXp pro virtualizzato su Mac OSX (ho un mac mini) con router. Dovrei aprire su win xp le porte da 1026 a 1031 ma anche se ho effettuato il port forwarding sul router, in win xp le porte restano chiuse…cosa posso fare? Pensi che si possa risolvere?
    Grazie in anticipo

  17. Antonio Doldo scrive:

    @Julian
    come dicevo in un commento appena sopra, puoi usare VBoxManage specificando la porta:
    VBoxManage setextradata "windows xp" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/service1/Protocol" TCP
    VBoxManage setextradata "windows xp" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/service1/GuestPort" 1026
    VBoxManage setextradata "windows xp" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/service1/HostPort" 10026

    il codice sopra ad esempio apre la porta 1026 sul guest che però risulta 10026 sull’host.
    considera che il nome service1 è arbitrario e il tutto viene scritto nel file XML della macchina virtuale😉
    Se hai dubbi fammi sapere, anche se non rispondo immediatamente, sorry.
    Ciao, Antonio

  18. Luca Mencarelli scrive:

    Salve ho un problema dovrei virtualizzare un server ubuntu con la connessione bridge ma niente non riesco a farlo come devo fare il mio sistema base è windows 7 quello virtuale Ubuntu 11.10 e la versione di virtualbox è la 4.1.16, mi potrebbe aiutare?? Grazie 1000.

Lascia un commento

Effettua il login con uno di questi metodi per inviare il tuo commento:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: