XenServer 6.2 + Kimsufi + 1 Public IP

Nelle ultime settimane è nata la necessità di avere un ambiente in cui poter testare e/o implementare una serie di “cose” che mi venivano in mente.

Cose abbastanza semplici, ma che necessitavano di alcune macchine virtuali raggiungibili da internet. Così ho pensato di comprare alcune VPS per istallarci sopra Debian e sopperire così alle mie necessità.
Cercando su internet ho però visto che su kimsufi.com è possibile prendere in affitto un server dedicato con un Core™ i5-3570S, 16GB di RAM ed 1TB di spazio disco a 19,99 euro/mese. Facendomi due calcoli ho deciso di comprarlo.

In un paio di minuti ho avuto l’accesso alla macchina, in breve tempo ho installato XenServer 6.2 e… AMARA SORPRESA!!!
Ho scoperto (mea culpa, bastava informarsi meglio) che non è possibile aggiungere IP al server in questione. Questo rendeva impossibile creare macchine virtuali che potessero uscire su internet (e quindi essere a loro volta raggiungibili).
Ho pensato subito che bastasse configurare in modo corretto le regole di iptables, in modo da permettere alle VM di uscire e, eventualmente, renderle raggiungibili dall’esterno.

Ammetto di non essere un guru delle regole di firewall.. sò di cosa si tratta, ma sono ancora lontano dal padroneggiarle con disinvoltura assoluta. Quindi ho cercato su internet una possibile soluzione che potesse essere compatibile con la situazione nella quale mi trovavo. Dopo una breve ricerca ho trovato questo sito web che spiega in modo più che chiaro come ovviare al problema di avere un solo IP pubblico.

Riporto, nel caso in cui il sito web di origine dovesse perdersi, il testo originale:

After installing Xenserver 5.5 or 5.6 you will need to define additional IPs that your VMs will use. Usually your provider will give you a range that you can use. But what do you do when you do not want to pay additional $$$ just for a couple of routable ips?
In my case I only have one public IP that is set on interface xenbr0 interface (bridged from eth0). In order to make my VMs to access the Internet I had to add an alias interface, something like :
ifconfig xenbr0:0 10.0.0.1 netmask 255.255.255.0 up
I will consider 10.0.0.0/24 my private LAN from where the VMs will get IPs. Additionally I route all traffic from 10.0.0.0/24 to xenbr0 using :
ip addr add 10.0.0.0/24 dev xenbr0
Now if you add an VM and set an IP from the 10.0.0.0/24 range you should be able to ping the 10.0.0.1 address. In order to reach the internet I also had to :

iptables -t nat  -A POSTROUTING -s 10.0.0.0/255.255.255.0 -j MASQUERADE
iptables -I RH-Firewall-1-INPUT -s 10.0.0.0/24 -j ACCEPT
service iptables save

Last thing is to modify /etc/sysctl.conf and enable ip_forward among other settings. This is how my config looks like:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.xenbr0.send_redirects = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
kernel.sysrq = 1
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
vm.dirty_ratio = 5
kernel.printk = 4 4 1 4

Quì i comandi che ho dato sulla console del mio xen server (dopo aver controllato il file /etc/sysctl.conf):

ifconfig xenbr1:0 10.0.0.1 netmask 255.255.255.0 up
ip addr add 10.0.0.0/24 dev xenbr1
iptables -t nat  -A POSTROUTING -s 10.0.0.0/255.255.255.0 -j MASQUERADE
iptables -I RH-Firewall-1-INPUT -s 10.0.0.0/24 -j ACCEPT

service iptables save

Una volta fatto ciò le VM potranno comunicare con l’esterno!
Non resta che far comunicare l’esterno con le VM adesso!
Per fare questo ho aggiunto le seguenti regole:

Con questa regola accedo dall'esterno in ssh sulla porta XXXX alla VM (web server ad esempio).
-A PREROUTING -p tcp --dport XXXX -j DNAT --to-destination 10.0.0.YY:22
Con questa regola mando il traffico della porta 80 alla VM YY (web server).
-A PREROUTING -i xenbr1 -p tcp -s ! 10.0.0.0/24 --dport 80 -j DNAT --to-destination 10.0.0.YY:80

In questo modo posso avere più VM, con un solo IP pubblico, che ospitano diversi servizi.
Ovvio, questa soluzione ha dei limiti, ma è ottima per avere un ambiente di test e non doversi svenare!