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.
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:
- vboxextra6




























Digg/adoldo
Del.icio.us/antoniodoldo
GMail/antonio.doldo
Technorati/adoldo
MyBlogLog/adoldo
Blog/adoldo









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.
PS: per queste cose, VirtualBox mi sembra ancora piuttosto giocattolosa, o sbaglio ?
@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
@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
saluti,
A.
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’
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/
@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
@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
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
@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
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 !
@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
Esauriente come sempre, grazie
@ienabellamy
anche “esaurito” come sempre
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
@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" TCPVBoxManage 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