Server web virtuale con VirtualBox, port forwarding

29 04 2008

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:


Azioni

Informazione

15 risposte

29 04 2008
LuNa

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.

29 04 2008
LuNa

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

30 04 2008
Antonio Doldo

@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

30 04 2008
Antonio Doldo

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

30 04 2008
LuNa

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’ :D

1 05 2008
spippolazione

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/

3 05 2008
Antonio Doldo

@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

3 05 2008
Antonio Doldo

@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

3 05 2008
RSS Week #1: gli articoli interessanti della settimana - Matteo Moro

[...] Antonio Doldo: “Server web virtuale con VirtualBox, port forwarding“ [...]

18 10 2008
ienabellamy

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

18 10 2008
Antonio Doldo

@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

19 10 2008
ienabellamy

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 !

20 10 2008
Antonio Doldo

@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

20 10 2008
ienabellamy

Esauriente come sempre, grazie ;-)

21 10 2008
Antonio Doldo

@ienabellamy
anche “esaurito” come sempre :D

Lascia un commento