Ovvio, quindi taciuto. Virtualizzazione con libvirt e KVM.

Ora se avete voglia provate a cercare una pagina che descriva, passo passo, con linguaggio tecnico capibile da un amministratore Linux che però non hai mai usato KVM, come fare a creare un firewall Linux in un sistema guest virtualizzato con libvirt e KVM.

Le informazioni sono tutte là fuori, da qualche parte, su questo non c’è dubbio. Io però non ho trovato un posto in cui fossero raccolte tutte e solo quelle necessarie a creare un firewall in un guest. Per esempio, è abbastanza intuitivo che per creare un firewall virtualizzato la scheda di rete virtuale dovrà essere posta in bridging con quella fisica e non sottoposta a NAT. Non pretendo che questo mi venga spiegato, se non lo capisco da me, ho sbagliato lavoro oppure devo prima studiare e poi mettermi a fare. Quello che però vorrei che mi fosse scritto a chiare lettere, è che il bridge, con la scheda di rete virbr0 (abbreviazione di “VIRtual BRidge 0”), non si può fare. E di nuovo, non è che non ci sia scritto, solo che è scritto in una noticina al fondo di una pagina all’interno del capitolo del networking sulla guida ufficiale RedHat che parla di libvirt. Il che è quasi come se non fosse scritto.

Ma dico io, una cosa con cui non si può fare un bridge, vai a chiamarla “Virtual Bridge 0”? E poi vai a nascondere in una nota a fondo pagina il fatto che si chiama Bridge, ma non è quello che la maggior parte degli amministratori Linux intende per Bridge? Potevano chiamarlo Bridge in riferimento al famoso gioco di carte e sarebbero stati più chiari! E tanto per ridere, si chiama bridge, ma serve a fare il NAT, cioè la configurazione diametralmente opposta ad un bridge!

Comunque sia, capito quello (e non ci è voluto esattamente poco), i giochi si fanno più semplici. Basta creare un bridge con le normali configurazioni di Linux (quel bridge che tutti i sysadmin conoscono), metterci dentro una sola scheda di rete fisica, ed assegnare quel bridge come scheda di rete al sistema guest, invece di virbr0. Ovviamente se il firewall, come probabile, dovrà gestire più schede di rete, si creano tanti bridge quante sono le schede di rete e si assegnano tutti al firewall guest. Ah sì, ma un bridge non dovrebbe servire a mettere in comunicazione due reti fisicamente separate e quindi non dovrebbe contenere due schede di rete invece di una sola? Certo, infatti è così: una delle due schede di rete nel bridge ce la mettete voi (quella fisica), l’altra ce la mette KVM (quella virtuale). Capito ora? Non dovete mettere in bridge la scheda di rete fisica con virbr0, ma dovete creare un bridge lasciando l’altro endpoint vuoto, mettendogli quindi una sola scheda di rete. Esempio di configurazione in /etc/network/interfaces, per sistemi host Debian e derivati:

iface br-eth0 inet static
  bridge_ports eth0
  address 192.168.1.254
  broadcast 192.168.1.255
  netmask 255.255.255.0
  gateway 192.168.1.1
  bridge_stp off
  bridge_waitport 0
  bridge_fd 0

Ovviamente l’indirizzo 192.168.1.254 è quello che si assegna alla scheda di rete per il sistema host. Il sistema guest (il firewall) assegnerà un indirizzo IP diverso, magari anche in una sottorete diversa. I due indirizzi alla fine coesisteranno (multihoming) sulla stessa scheda di rete fisica.

Bene, fin qui sembra abbastanza chiaro. Mancano dei pezzi però. Esempio: come assegno gli indirizzi IP all’interno del firewall? Come voglio (ovvero statici o dhcp, funzionano entrambi).

E alla fine, come faccio il firewall? Anche qui, come mi piace di più. Posso usare regole di iptables inserite a mano, oppure qualcosa come Shorewall o ancora una distro apposita.

Lo so, questo non è un how-to e non sopperisce alla mancanza di un how-to vero e proprio. Forse un giorno avrò il tempo di scrivere un vero how-to, ma per ora… accontentatevi!