VMware HA e nodi isolati

Vedremo in questo post il comportamento di un cluster virtualizzato in cui è stata abilitata la funzionalità HA. Da ricordare che un cluster può essere configurato unicamente tramite un vCenter Server, che resta necessario per il corretto funzionamento di funzionalità quali vMotion e DRS, ma non per l’HA: se il vCenter Server si blocca o ha un guasto, l’HA è comunque garantita per tutti i nodi del cluster. […]

Vedremo in questo post il comportamento di un cluster virtualizzato con VMware in cui è stata abilitata la funzionalità HA. Da ricordare che un cluster può essere configurato unicamente tramite un vCenter Server, che resta necessario per il corretto funzionamento di funzionalità quali vMotion e DRS, ma non per l’HA: se il vCenter Server si blocca o ha un guasto, l’HA è comunque garantita per tutti i nodi del cluster.

ha_p2p
Interrogazione dei nodi in un cluster con HA

L’architettura di funzionamento su cui è basata l’HA è di tipo p2p, ossia ogni nodo effettua a intervalli regolari un ping verso ogni altro nodo del cluster e anche verso il gateway. I ping vengono effettuati dalla scheda di management di un nodo e verso la management di ogni altro nodo (Service Console nel caso di ESX e CLI di management per ESXi). Il funzionamento dell’HA è quindi strettamente legato al networking e alle schede di rete, e qualora la scheda di rete della management di un nodo si guasti il nodo stesso diventa isolato. Studiamo questo caso:

  1. ogni nodo controlla se ogni altro nodo è raggiungibile;
  2. se in un nodo si guasta la scheda di rete di management questo diventa isolato;
  3. di default, un nodo isolato spegne tutte le sua macchine virtuali.

Il comportamento di default potrebbe essere ragionevole nel caso in cui un nodo abbia schede di rete ridondate per la management, ma è in generale altamente consigliato cambiare l’impostazione default. Proviamo a immaginare cosa succederebbe se si guastasse uno switch fisico a cui sono collegati tutti i nodi e pure il gateway? Tutti i nodi risulterebbero isolati, con la conseguenza che ogni nodo spegnerebbe tutte le sue macchine virtuali! E’ una situazione assolutamente da evitare. Pertanto è necessario modificare l’impostazione host isolation response durante la configurazione del cluster, visibile alla schermata seguente:

ha_vcenter
Modificare impostazioni default

Riepilogando, è buona norma modificare il comportamento default di un cluster HA per quanto riguarda l’isolamento del nodo, ed inoltre è buona cosa ridondare la NIC di management.

roghan

Configurare la rete

Sotto Linux, i due comandi principali che permettono di controllare e configurare i parametri di rete sono due: ifconfig e route. Altri due comandi utili, che però non verranno trattati in questo howto, sono iwconfig, per la gestione specifica delle schede di rete wireless, e il comando ip, che è una sorta di comando universale con funzionalità simile a ifconfig e route. Vediamo in dettaglio cosa permettono di fare ifconfig e route.
Il comando ifconfig serve sia per ottenere informazioni sulle configurazioni delle schede di rete, sia per configare le schede stesse. Per visualizzare le configurazioni è necessario digitandorlo da solo senza alcun parametro. […]

Sotto Linux, i due comandi principali che permettono di controllare e configurare i parametri di rete sono due: ifconfig e route. Altri due comandi utili, che però non verranno trattati in questo howto, sono iwconfig, per la gestione specifica delle schede di rete wireless, e il comando ip, che è una sorta di comando universale con funzionalità simili a ifconfig e route. Vediamo in dettaglio cosa permettono di fare ifconfig e route.

Il comando ifconfig serve sia per ottenere informazioni sulle configurazioni delle schede di rete, sia per configare le schede stesse. Per visualizzare le configurazioni è necessario digitandorlo da solo senza alcun parametro. Un esempio di output è il seguente

# ifconfig
eth0 Link encap:Ethernet HWaddr 00:1B:24:27:59:84
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Memory:da000000-da020000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:41 errors:0 dropped:0 overruns:0 frame:0
TX packets:41 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4740 (4.6 KiB) TX bytes:4740 (4.6 KiB)
wlan1 Link encap:Ethernet HWaddr 00:1B:77:22:CD:2D
inet addr:172.20.100.77 Bcast:172.20.100.255 Mask:255.255.255.0
inet6 addr: fe80::21b:77ff:fe22:cd2d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2805 errors:0 dropped:0 overruns:0 frame:0
TX packets:2720 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1993718 (1.9 MiB) TX bytes:477093 (465.9 KiB)

Come è visibile nell’esempio precedente, solitamente le interfacce mostrate da ifconfig sono le seguenti:

  • eth0, eth1, … sono le schede di rete presenti sulla macchina;
  • wlan1, … sono le interfacce wireless;
  • lo è l’interfaccia logica, denominata anche di loopback, e a cui è assegnato l’indirizzo IP 127.0.0.1. Questa interfaccia indica la macchina stessa e deve essere sempre attiva, anche se il sistema non è collegato ad alcuna rete.

Nel caso in cui si voglia usare ifconfig per la configurazione di una scheda di rete, è necessario prima disattivare la scheda che si vuole andare a modificare, e solo dopo inserire i nuovi parametri. La sintassi è la seguente:

# ifconfig <interfaccia> <indirizzo_ip> down
# ifconfig <interfaccia> <indirizzo_ip> netmask <subnet_mask> broadcast <indirizzo_broadcast>

Il comando route invece serve per gestire l’instradamento dei dati, sia per visualizzare le impostazioni correnti del sistema, sia per definirne di nuove. Senza alcun parametro, o con il parametro n (per avere in output dei valori numerici), mostra le tabelle di instradamento attuali. Ecco un esempio:

# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.20.100.0 0.0.0.0 255.255.255.0 U 2 0 0 wlan1
0.0.0.0 172.20.100.254 0.0.0.0 UG 0 0 0 wlan1

Importante, nonché utile, è l’opzione con cui si può definire un nuovo default gateway (per tutti gli indirizzi):

# route add default gw <indirizzo_ip>

Di seguito viene mostrato un semplice esempio. Supponiamo di voler configurare la scheda di rete eth0 con l’indirizzo IP 192.168.1.4, maschera di rete 255.255.255.0, e gateway 192.168.1.1. I comandi da digitare sono i seguenti:

# ifconfig eth0 down
# ifconfig eth0 192.168.1.4 netmask 255.255.255.0 broadcast 192.168.1.255
# ifconfig eth0 up
# route add default gw 192.168.1.1

Con pochi e semplici comandi è possibile configurare una qualsiasi scheda di rete. Dopo aver apportato delle modifiche è buona norma riavviare il servizio che si occupa delle rete, anche se non è sempre necessario. Ecco come fare sulle distro Red Hat-like:

# service network restart

e sulle distro Debian-like:

# /etc/init.d/networking restart

Link di approfondimento:

http://www.coresis.com/extra/linuxcorsobase/12-1.htm

http://www.firenze.linux.it/~piccardi/corso/netadmin/node12.html

roghan

Salvare le impostazioni del firewall iptables in Linux

Netfilter è un modulo del kernel Linux che permette di gestire i pacchetti in transito attraverso il sistema, e può essere dunque utilizzato sia per funzioni di NAT che come firewall attraverso il comando iptables. In questo piccolo howto si vedrà in che modo è possibile salvare una configurazione di iptables, dopo che sono state definite nuove regole.

Innanzitutto è importante ricordare che tutte le modifiche apportate con iptables sono immediate, ossia dopo che è stato inserito un certo comando, quella regola risulta subito attiva. Dunque, bisogna prestare la massima attenzione durante la configurazione del firewall, soprattutto quando si agisce su un sistema da remoto, poiché una regola errata al momento sbagliato chiude subito fuori da tutto! Buona norma prima di inserire le regole con la shell è quella di scrivere tutte le regole iptables in un file testuale, con un qualsiasi editor di testo, in modo da poter osservare e controllare il tutto prima di digitare i comandi sulla shell. E’ importante ricordare anche che lo stato del firewall rimane tale solo fino al riavvio, momento in cui le regole inserite a sistema avviato sono “azzerate” e vengono invece caricate le impostazioni salvate. Nel caso peggiore in cui si viene chiusi fuori dal firewall mentre si stanno creando le regole (e prima di averle salvate!), è necessario “solamente” riavviarlo, operazione semplice se agiamo in locale ma più complessa se siamo da remoto :-(. […]

Netfilter è un modulo del kernel Linux che permette di gestire i pacchetti in transito attraverso il sistema, e può essere dunque utilizzato sia per funzioni di NAT che come firewall attraverso il comando iptables. In questo piccolo howto si vedrà in che modo è possibile salvare una configurazione di iptables, dopo che sono state definite nuove regole.

Innanzitutto è importante ricordare che tutte le modifiche apportate con iptables sono immediate, ossia dopo che è stato inserito un certo comando, quella regola risulta subito attiva. Dunque, bisogna prestare la massima attenzione durante la configurazione del firewall, soprattutto quando si agisce su un sistema da remoto, poiché una regola errata al momento sbagliato chiude subito fuori da tutto! Buona norma prima di inserire le regole con la shell è quella di scrivere tutte le regole iptables in un file testuale, con un qualsiasi editor di testo, in modo da poter osservare e controllare il tutto prima di digitare i comandi sulla shell. E’ importante ricordare anche che lo stato del firewall rimane tale solo fino al riavvio, momento in cui le regole inserite a sistema avviato sono “azzerate” e vengono invece caricate le impostazioni salvate. Nel caso peggiore in cui si viene chiusi fuori dal firewall mentre si stanno creando le regole (e prima di averle salvate!), è necessario “solamente” riavviarlo, operazione semplice se agiamo in locale ma più complessa se siamo da remoto :-(.

I comandi che permettono di osservare e salvare la configurazione di iptables sono:

  • iptables-save, che stampa sullo standard output la configurazione corrente del firewall;
  • iptables-restore, con cui si può ripristinare una configurazione precedentemente salvata tramite iptables-save.

In particolare, come ho già accennato, al riavvio vengono caricate le impostazioni salvate in memoria, e, pertanto, è necessario specificare quale configurazione caricare all’avvio del sistema. I metodi utilizzabili sono due:

  • uno script shell che esegue in successione tutti i comandi iptables necessari (del tipo iptables -I INPUT DROP x…, iptables -I INPUT DROP y…). In questo caso le regole vengono aggiunte a caldo e il firewall viene configurato dinamicamente ad ogni avvio. Questa tecnica ha il vantaggio di permettere commenti fra le regole e poter usare variabili, cicli e impostare regole sulla base di parametri variabili. Spesso questo script lo si richiama dal file /etc/rc.d/rc.local, anche se sarebbe preferibile applicarlo appena attivate le interfacce di rete;
  • uno script inserito tra i servizi all’interno di init.d, oppure all’interno di /etc/rc.d/rc.local, come nel caso precedente. Questo script richiamerà iptables-restore in modo da ripristinare una configurazione precedentemente salvata. Nello specifico il comando da inserire è cat /etc/firewall | iptables-restore, supponendo che firewall sia un file contenente la configurazione salvata in precedenza. Questa è la soluzione usata da molte distribuzioni, dove il file di configurazione del firewall, riprendendo l’esempio, non è altro che l’output di un comando come: iptables-save > /etc/file_config. Ha il vantaggio di applicare lunghi elenchi di regole in modo molto più rapido. Ecco un esempio di file /etc/rc.d/rc.local
    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.
    touch /var/lock/subsys/local
    cat /etc/firewall | iptables-restore

Alcune risorse utili:

Linux firewalling: Introduzione a Iptables

iptables-restore

roghan

Gestione file system in Linux

In Linux prima di poter utilizzare un file system (cd/dvd, floppy, condivisione di rete windows, directory nfs, partizioni hard-disk) questo deve essere formattato e montato in una directory all’interno di quella principale ( / ). Una volta che il file system è stato montato risulta accessibile sia ai programmi e agli utenti in modo del tutto trasparente, e diventa parte integrante dell’albero delle directory sotto /. Al termine del suo utilizzo il file system può anche essere smontato, operazione essenziale ad esempio per poter poi espellere un cd/dvd. Da tenere in considerazione è il fatto che se la directory su cui viene montato il file system non è vuota, i dati in essa contenuti “spariranno” e non saranno più visibili fino a quando non verrà smontato il nuovo file system.
I comandi per montare e per smontare un dispositivo sono i seguenti:

mount -t [tipo fs] [opzioni] device directory
umount [opzioni] device
[…]

In Linux prima di poter utilizzare un file system (cd/dvd, floppy, condivisione di rete windows, directory nfs, partizioni hard-disk) questo deve essere formattato e montato in una directory all’interno di quella principale ( / ). Una volta che il file system è stato montato risulta accessibile sia ai programmi e agli utenti in modo del tutto trasparente, e diventa parte integrante dell’albero delle directory sotto /. Al termine del suo utilizzo il file system può anche essere smontato, operazione essenziale ad esempio per poter poi espellere un cd/dvd. Da tenere in considerazione è il fatto che se la directory su cui viene montato il file system non è vuota, i dati in essa contenuti “spariranno” e non saranno più visibili fino a quando non verrà smontato il nuovo file system.

FSlayout
Struttura del file system sotto Linux

I comandi per montare e per smontare un dispositivo sono i seguenti:

mount -t [tipo fs] [opzioni] device directory
umount [opzioni] device

Per montare una partizione NTFS un esempio di comando da digitare è:

mount -t ntfs-3g /dev/sda1 /media/windows

dove il tipo di file system è ntfs-3g, il dispositivo che si vuole montare è /dev/sda1 nella directory /media/windows. Inoltre, il comando mount è utile anche se usato da solo, senza alcuna opzione e parametro, e in questo caso ritornerà una lista dei dispositivi montati e i punti di mount. Ad esempio:

# mount
/dev/dm-0 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda3 on /boot type ext3 (rw)
/dev/sdb1 on /media/Archivio type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096)

In questo esempio è possibile vedere sulla sinistra una lista dei device, che sono stati montati sul punto indicato a destra (/proc, /sys, /media/Archivio, …), poi è visibile il tipo (type) di file system (ext3, ext4, …), e sull’ultima colonna infine sono visualizzabili tra parentesi le modalità di accesso al punto montato (r sta per lettura, w per scrittura, …).

Altri comandi utili per la gestione del file system sono df e du, vediamoli rispettivamente. Il comando df, che sta per “Disk Free”, serve per visualizzare la quantità di spazio libero e utilizzato di ogni device montato, e questa è la sintassi:

df [opzioni] [file]

Un esempio è il seguente:

# df -h
Filesystem Dimens. Usati Disp. Uso% Montato su
/dev/dm-0 42G 19G 21G 49% /
tmpfs 1007M 1,4M 1006M 1% /dev/shm
/dev/sda3 194M 45M 140M 25% /boot
/dev/sdb1 150G 54G 96G 37% /media/Archivio

dove è stata usata l’opzione h, molto utile, per ottenere informazioni facilmente leggibili espresse in MB, GB, … Il comando du invece, che sta per “Disk Usage”, serve per visualizzare la dimensione di un file o di una directory ed ha la sintassi seguente

du [opzioni] [file]

Esempi di comandi sono i seguenti

# du /etc -h -s
88M /etc
du / | sort -n
[...]

dove il primo comando serve per determinare la dimensione della directory /etc (senza l’opzione s sarebbero mostrate le dimensioni anche di tutte le sottodirectory di /etc) in unità di misura comprensibile (opzione h). Il secondo comando serve per elencare tutte le directory del sistema ordinate per dimensione (in genere l’esecuzione ci mette un po’ di tempo).

Infine, un altro comando molto utile è fdisk, che sta per “Fixed Disk” (disco riparato) e serve per manipolare la tabella delle partizioni ma anche per sapere semplici informazioni su tutte le partizioni presenti, non solo quelle montate. La sintassi del comando è:

fdisk [opzioni] device

Per ottenere le informazioni sulle partizioni del sistema è necessario usare l’opzione -l:

fdisk -l
Disco /dev/sda: 160.0 GB, 160041885696 byte255 testine, 63 settori/tracce, 19457 cilindri
Unità = cilindri di 16065 * 512 = 8225280 byte
Identificativo disco: 0xe4a9cdb4
Dispositivo Boot Start End Blocks Id System
/dev/sda1         1    12794 102762481 7 HPFS/NTFS
/dev/sda2        18786 19457 5397840 7 HPFS/NTFS
/dev/sda3     *  12794 12819 204800 83 Linux
/dev/sda4       12820  18785 47921895 5 Esteso
/dev/sda5       12820  18785 47921152 8e Linux LVM
Le voci nella tabella delle partizioni non sono nello stesso ordine del disco

E’ possibile vedere dall’output che sono mostrate tutte le partizioni del disco, il tipo del file system, e la partizione di boot, contrassegnata da un asterisco.

Per approfondimenti consultare i seguenti link:

struttura del file system

comandi per la gestione del file system

roghan

L’importanza dell’ora corretta in un sistema

In un sistema è importantissimo configurare correttamente l’ora. Per tanti motivi. Primo su tutti per l’utilizzo e il controllo dei file di log. Immaginate uno scenario in cui viene portato un attacco ad un server X, ad una determinata ora e giorno, ad esempio il 28 aprile 2010 alle 12.31, ma nel sistema attaccato l’ora impostata è errata e segna il 25 marzo 2009 ore 11.05. Certo questo è un caso limite, ma molto spesso l’ora e la data del sistema differiscono da quella esatta anche pochi minuti. Sono questi pochi minuti che fanno la differenza nel caso di un attacco informatico, o nel caso comunque di un evento da tenere sotto controllo tra più dispositivi di rete. In questi casi, quando l’amministratore andrà a controllare i file di log generati dal sistema potrà avere notevoli problemi a ricostruire i fatti se l’ora è errata, e nel caso di un attacco la differenza nell’ora anche di pochi minuti può causare non pochi problemi. La soluzione è tenere costantemente aggiornata l’ora del sistema. Per quanto riguarda Linux, è possibile configurare manualmente l’ora come spiegato a questo link, ossia:

1. bisogna impostare l’ora con il comando date
date –set 22:20
2. quindi configurare l’ora hardware del sistema con il comando hwclock, perché il comando date automaticamente non aggiorna anche l’ora hardware
hwclock –systohc –utc
[…]

In un sistema è importantissimo configurare correttamente l’ora. Per tanti motivi. Primo su tutti per l’utilizzo e il controllo dei file di log. Immaginate uno scenario in cui viene portato un attacco ad un server X, ad una determinata ora e giorno, ad esempio il 28 aprile 2010 alle 12.31, ma nel sistema attaccato l’ora impostata è errata e segna il 25 marzo 2009 ore 11.05. Certo questo è un caso limite, ma molto spesso l’ora e la data del sistema differiscono da quella esatta anche pochi minuti. Sono questi pochi minuti che fanno la differenza nel caso di un attacco informatico, o nel caso comunque di un evento da tenere sotto controllo tra più dispositivi di rete. In questi casi, quando l’amministratore andrà a controllare i file di log generati dal sistema potrà avere notevoli problemi a ricostruire i fatti se l’ora è errata, e nel caso di un attacco la differenza nell’ora anche di pochi minuti può causare non pochi problemi. La soluzione è tenere costantemente aggiornata l’ora del sistema. Per quanto riguarda Linux, è possibile configurare manualmente l’ora come spiegato a questo link, ossia:

  1. bisogna impostare l’ora con il comando date
    $ date --set 22:20
  2. quindi configurare l’ora hardware del sistema con il comando hwclock, perché il comando date automaticamente non aggiorna anche l’ora hardware
    $ hwclock --systohc --utc

Una soluzione alternativa a questa (e da preferire) è quella di utilizzare il protocollo NTP (Network Time Protocol), con il quale è possibile tenere aggiornata automaticamente l’ora e la data di un sistema (sia su Windows che su Linux), anziché dover impostare i dati corretti manualmente o comunque tramite script. NTP è un protocollo di tipo client/server (con una gerarchia a strati), in cui sul server è configurata l’ora esatta, e il client si collega al server per determinare l’ora e aggiornare così quella del proprio sistema. In figura è visibile l’architettura creata da NTP.

Architettura di NTP

Solitamente nelle LAN di una certa dimensione si preferisce creare un server NTP dedicato, in modo tale che tutti i vari dispositivi si sincronizzino con questo, e questo a sua volta con un server di strato 2. Per reti locali piccole invece (con 2-5 postazioni), o nel caso di utenti singoli che vogliono tenere aggiornata l’ora del proprio pc, è necessario solamente configurare i giusti file su ogni sistema affinché ogni postazione si colleghi autonomamente ad un server di strato 2.

Un importante punto di partenza per configurare NTP in ambiente Linux è questo sito, in cui ci sono anche accenni sulla sicurezza del protocollo (quando possibile si consiglia sempre l’utilizzo della versione 3 e di un server che richiede l’autenticazione). Nel sito ci sono anche riferimenti e descrizioni su come impostare un router Cisco (o altri prodotti) affinché utilizzi un server NTP. Per quanto riguarda la controparte Windows invece, il servizio che si occupa di sincronizzare l’ora è noto come W32Time (Windows Time Service), i seguenti siti contengono tutte le informazioni per configurare correttamente tutti i paramentri:

  • questo sito contiene numerosa documentazione su come sincronizzare una rete Windows con un server NTP
  • sito per la configurazione lato client su Windows XP
  • sito per l’aggiunta di server NTP su Windows XP
  • sito per la configurazione di un server NTP su Windows XP
  • sito per configurare in modo avanzato un server NTP su Windows Server 2003/2008

roghan