Premessa: ma non si faceva prima...?

Uso firewall ZyXEL da tanti anni, ormai li conosco bene e hanno sempre fatto tutto quello che gli ho chiesto.

Per il nostro ufficio invece, sono un nostalgico forse, la funzione di firewall e router di rete la fa un server linux. Mi piace scoprire le cose e capire come funzionano. È inoltre una piattaforma molto versatile, estendibile... mi serve un'altra interfaccia di rete, gli aggiungo una scheda da pochi euro...

In questi giorni semi-festivi (scrivo attorno a ferragosto) ho provato a configurare una VPN fra un firewall ZyXEL e il nostro server linux, che ha una distribuzione Linux Fedora Core 15. Onestamente ci avevo già provato tempo addietro, ma dal momento che non mi serviva necessariamente ed era una configurazione "o la va o la spacca", avevo lasciato perdere.

Prima di incappare in parametri sbagliati, ho cercato un po' in internet se qualcuno l'avesse già fatto, ma non ho trovato un gran ché. Solo qualcuno che diceva che se la connessione era iniziata da linux verso ZyXEL, funzionava, ma non il viceversa... Ho quindi provato step by step, e ho deciso di scrivere questo articolo nel caso in cui altri ne avessero bisogno.

Predisporre l'ambiente

Per quanto riguarda il firewall ZyXEL, aggiornate il firmware più che potete! Questa è una regola generale, anche per quanto riguarda l'apparato che vi connette ad internet, se di proprietà o se il provider lo consente. Il test che ho effettuato l'ho fatto col firmware 3.30(AQQ.2) che non è il più recente, ma non potendo riavviare il firewall non ho potuto fare altrimenti.

Stessa cosa per il server Linux... e anche in questo caso predico bene e razzolo male, perché ho una Fedora Core 15 vecchia di due anni, kernel 2.6.43.8-1.fc15.x86_64, e gli ipsec-tools-0.8.0-1.fc15.x86_64. Ah ecco, se non li avete installati, installate gli ipsec-tools!

Create sullo ZyXEL tutti gli oggetti che vi servono, cioè subnet della LAN remota ed IP pubblico del server remoto.

Non dimenticatevi di configurare il firewall!

Configurazione del firewall

Configurate entrambi i firewall per accettare reciprocamente i dati dal firewall/server remoto.

Ricordatevi che AH ed ESP sono due protocolli (rispettivamente numero 51 e 50), e come tali devono essere consentiti dalle regole di firewall. Nella mia configurazione ho usato ESP, ma per evitare che chi legge questo articolo legga solo alcuni pezzi, usi l'AH e non funzioni niente, contemplerò anche la configurazione per l'AH (daltronde sto scrivendo questi articoli per evitare i rompicapi ad altri!).

Sullo ZyWALL quindi, se è abilitata la regola WAN to ZyWALL "Default_Allow_WAN_To_ZyWALL", non dovrete far niente, se no quello che dovrete consentire saranno almeno:

  • UDP 500: IKE (per la connessione diretta fra i due firewall)
  • UDP 4500: NATT (per il NAT Traversal)
  • ESP: protocollo n.50
  • AH: protocollo n.51

Sul server Linux, se usate IPTables, dovrete abilitare le stesse cose. I tratti salienti nella tabella filter del mio file di configurazione di iptables sono quindi i seguenti.

/etc/sysconfig/iptables

*filter

-A INPUT -m state --state NEW -p esp -j ACCEPT
-A INPUT -m state --state NEW -p ah -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 500 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 4500 -j ACCEPT

Una volta che tutto funzioni, ricordatevi di togliere il protocollo che non usate (se AH o ESP), eventualmente dire, sia sullo ZyWALL che sul server Linux da quale interfaccia accettare le connessioni, e da quale indirizzo IP.

Phase1

Facciamo conoscere questi due firewall!

La Phase 1 nello ZyWALL è il VPN Gateway.

Creiamone un nuovo, clicchiamo subito Show Advanced Settings e procediamo un campo alla volta.

  • My Address -> Interface -> e selezioniamo l'interfaccia da usare
  • Peer Gateway Address -> Static Address -> Primary -> e impostiamo l'ip pubblico della WAN remota, cioè l'IP con cui si presenterà il server Linux allo ZyWALL
  • Pre-Shared Key: impostiamo una chiave alfanumerica. Magari onde evitare complicazioni evitate caratteri strani, partite con delle lettere, poi se funziona tutto rendetela più complessa.
  • Local ID Type: IP
  • Content: mettete l'IP pubblico della WAN del router, cioè l'IP col quale uscirà lo ZyWALL. In realtà non importa usare gli IP giusti, ma per evitare confusioni future consiglio di mettere qualcosa che possa aiutare anche in un futuro, quando sul server Linux saranno terminate tante VPN, a capire di cosa si tratta.
  • Peer ID Type: Any
    Così non dobbiamo preoccuparci molto di come si presenterà l'altro firewall
  • SA Life Time: 86400 Seconds
  • Negotiation Mode: Aggressive
  • Proposal: 3DES, SHA1
  • Key Group: DH2
  • Tutto quello che non ho detto è disabilitato, a parte la spunta "Enable" che spero abbiate attivato come prima cosa!

NAT Traversal l'ho lasciato disabilitato anche se effettivamente il mio ZyWALL è nattato, ma dal momento che è nella DMZ del router, funziona bene anche con la porta 500, senza NATT...

Sul server Linux, Phase 1 è il file di configurazione di racoon.

/etc/racoon/racoon.conf

path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";
path script "/etc/racoon/scripts";

listen
{
        isakmp l'ip pubblico del server linux [500];
        isakmp_natt l'ip pubblico del server linux [4500];
}

sainfo anonymous
{
        pfs_group 2;
        lifetime time 1 hour ;
        encryption_algorithm 3des, blowfish 448, rijndael, des, aes ;
        authentication_algorithm hmac_md5, hmac_sha1 ;
        compression_algorithm deflate ;
}

include "/etc/racoon/l'ip pubblico dello ZyWALL.conf";

/etc/racoon/psk.txt

ip pubblico dello ZyWALL    la chiave PSK inventata

/etc/sysconfig/network-scripts/ifcfg-ipsec0

TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
SRCGW=ip privato che ha il server linux nella subnet che si vuole collegare, per esempio: 192.168.0.254
DSTGW=ip privato che ha lo ZyWALL nella subnet che si vuol collegare, per esempio: 192.168.1.254
DSTNET=subnet privata dello ZyWALL, es: 192.168.1.0/24
SRCNET=subnet privata del server Linux, es: 192.168.0.0/24
DST=ip pubblico dello ZyWALL

Phase2

La Phase 2 nello ZyWALL è la VPN Connection.

Anche qui creiamone una nuova, e visualizziamo subito gli Advanced Settings.

  • General Settings: vedete voi come impostarli, non c'è nulla di determinante ai fini della connessione.
  • Application Scenario: Site-to-site
  • VPN Gateway: selezionate quello appena creato
  • Local Policy: selezionate la LAN dello ZyWALL che deve essere collegata in VPN (nell'esempio: 192.168.1.0/24)
  • Remoty Policy: selezionate la LAN del server Linux (nell'esempio: 192.168.0.0/24)
  • Policy Enforcement: selezionate la casella
  • SA Life Time: 3600 Seconds
  • Active Protocol: ESP
  • Encapsulation: Tunnel
  • Proposal: 3DES, SHA1
  • Perfect Forward Secrecy (PFS): DH2
  • Zone: IPSec_VPN
  • Tutto il resto (tranne la spunta Enable!!) è disabilitato e configurabile a piacere quando andrà tutto!


La Phase 2 nel server Linux è rappresentata dal setkey.sh, parte delle utility di ipsec-tools, e dal file di configurazione specifico relativo allo ZyWALL.

/etc/racoon/setkey.sh

#!/sbin/setkey -f
flush;
spdflush;

# ZyWALL-> Linux
spdadd subnet privata ZyWALL   subnet privata Linux any -P in ipsec esp/tunnel/ip pubblico ZyWALL-ip pubblico Linux/require;
# Linux -> ZyWALL
spdadd subnet privata Linux   subnet privata ZyWALL any -P out ipsec esp/tunnel/ip pubblico Linux-ip pubblico ZyWALL/require;

/etc/racoon/ip pubblico dello ZyWALL.conf

remote ip pubblico dello ZyWALL
{
        exchange_mode aggressive, main;
        my_identifier address "ip pubblico del server Linux";
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group 2;
        }
}

Testing

Mentre per lo ZyWALL le configurazioni sono già attive, per il server linux dobbiamo dargli qualche comando:

  • Riavviamo il firewall:

service iptables restart

  • Carichiamo la configurazione di racoon

racoonctl rc

(oppure riavviamo proprio il servizio)

service racoon restart

  • Carichiamo le policy

/etc/racoon/setkey.sh

  • Tiriamo su l'interfaccia di rete

ifup ipsec0

  • Via al test!

Proviamo a pingare l'ip dello ZyWALL da stare sul server linux e vediamo se dopo 2-3 secondi la connessione è su... dovrebbe!

Debugging

Se siete arrivati a questa sezione, mi dispiace. Qualcosa non ha funzionato.

I log della ZyXEL sono fatti bene, andate a vedere cosa non funziona.

Sul server Linux potete controllare cosa succede a livello di protocolli con il tcpdump

tcpdump -n -i interfaccia del server Linux host ip pubblico dello ZyWALL

I log di racoon sono nel /var/log/messages .

Verificate intanto che ci sia comunicazione fra i due firewall e che il provider, per esempio, non blocchi qualche protocollo.

In bocca al lupo!