Proxmox firewall e router con un solo ip pubblico

Ecco come ho impostato il server proxmox per avere un firewall e il routing tramite un unico ip pubblico.

Dal pannello di controllo web abilitare eth0 con l’ip pubblico senza bridge e vmbr0 con un ip locale:

...
auto eth0
iface eth0 inet static
         address 91.11.22.33
         netmask 255.255.255.0
         broadcast 91.11.22.255
         gateway 91.11.22.254

auto vmbr0
iface vmbr0 inet static
        address 10.254.254.254
        netmask 255.0.0.0
        broadcast 10.255.255.255
        bridge_ports none
        bridge_stp off
        bridge_fd 0

...
...

Ora install shorewall

sudo aptitude install shorewall

Creo il file /etc/shorewall/zones e ci scrivo:

#ZONE   TYPE            OPTIONS         IN                      OUT
#                                       OPTIONS                 OPTIONS
fw      firewall
net     ipv4
dmz     ipv4

Creo il file /etc/shorewall/interfaces e ci scrivo:

#ZONE   INTERFACE       BROADCAST       OPTIONS
net     eth0            detect          blacklist,nosmurfs
dmz     venet0          detect          routeback
dmz     vmbr0           detect          routeback,bridge

Creo il file /etc/shorewall/policy e ci scrivo:

#SOURCE DEST    POLICY          LOG     LIMIT:          CONNLIMIT:
#                               LEVEL   BURST           MASK

# From Firewall Policy
fw      fw      ACCEPT
fw      net     ACCEPT
fw      dmz     ACCEPT

# From DMZ Policy

dmz     dmz     ACCEPT
dmz     net     ACCEPT
dmz     fw      DROP            info

# From Net Policy
net     fw      DROP            info
net     dmz     DROP            info

# THE FOLLOWING POLICY MUST BE LAST
#
all     all     REJECT          info

Creo il file /etc/shorewall/rules e ci scrivo:

#ACTION          SOURCE     DEST       PROTO   DEST        SOURCE     ORIGINAL    RATE

# Permit access to SSH
SSH/ACCEPT       net        fw         -       -            -          -        
  6/min:5

# Permit access to Proxmox Manager and Console
ACCEPT           net        fw         tcp     443,5900:5999

# PING Rules
Ping/ACCEPT      all        all

# LAST LINE -- DO NOT REMOVE

Alla fine la cartella /etc/shorewall dovrebbe contenere i seguenti file:

drwxr-xr-x  2 root root 4096 Apr 14 15:15 .
drwxr-xr-x 77 root root 4096 Apr 14 13:15 ..
-rw-r--r--  1 root root  453 Nov  8  2007 Makefile
-rw-r--r--  1 root root  214 Apr 14 15:03 interfaces
-rw-r--r--  1 root root  494 Apr 14 15:10 policy
-rw-r--r--  1 root root  517 Apr 14 15:15 rules
-rw-r--r--  1 root root 4004 Apr 14 13:18 shorewall.conf
-rw-r--r--  1 root root  183 Apr 14 13:19 zones

Controllo ora il funzionamento di shorewall:

shorewall try /etc/shorewall 60

in questo minuto di prova posso provare se risponde il pannello di controllo web di proxmox e se riesco a loggarmi in ssh al server.

Se tutto funziona posso abilitare proxmox all’avvio automatico: modifico il file /etc/default/shorewall e cambio:

startup=0

in

startup=1

Posso ora avviare shorewall manualmente col comando

shorewall start

oppure riavviarlo al bisogno con

shorewall restart

Per permettere alle macchine virtuali di uscire in internet creo il file /etc/shorewall/masq e sccrivo:

#INTERFACE      SOURCE          ADDRESS         PROTO   PORT(S) IPSEC   MARK
eth0            10.0.0.0/8

# LAST LINE -- DO NOT REMOVE

per dirottare il traffico web (porta 80) su una macchina virtuale inserisco nel file /etc/shorewall/rules questa regola:

DNAT                    net     dmz:10.0.1.101          tcp     80

Posso anche cambiare porta di destinazione nella macchina virtuale con la regola:

DNAT                    net     dmz:10.0.1.103:8180     tcp     80

Le macchine virtuali potranno avere degli indirizzi privati del tipo 10.xxx.yyy.zzz (es 10.0.1.101) ed essere gestiti semplicemente con un’interfaccia venet.

Shorewall ha alcune opzioni comode e interessanti:

safe-restart

salva la configurazione attuale, quindi applica quella nuova e chiede conferma per mantenere le nuove regole; se la conferma non è data entro 60 secondi sono riapplicate le regole precedenti;

try configuration-directory [timeout]

riavvia shorewall utilizzando la configurazione presente nella directory specificata e se sono rilevati errori o se il timeout è raggiunto, le regole precedenti sono riapplicate;

show check

esegue la validazione sintattica della configurazione;

logwatch

simile a tail -f $LOGFILE;

ipcalc [<address> <mask> | <address/vlsm>]

dato un indirizzo di rete, mostra i corrispondenti indirizzi di network, broadcast e netmask.

(per questo post ho preso pesantemente spunto dal seguente: http://www.myatus.co.uk/2009/08/31/guide-firewall-and-router-with-proxmox/)