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:

Informazioni 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 says:

    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 says:

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

  3. @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. @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 says:

    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. 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. @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. @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 says:

    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. @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 says:

    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. @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 says:

    Esauriente come sempre, grazie 😉

  15. @ienabellamy
    anche “esaurito” come sempre 😀

  16. Julian says:

    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. @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. 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