Strumenti Utente

Strumenti Sito


collegarsi_a_gnet

Come collegarsi alla rete GNet [Howto]

Per accedere a GNet sono necessari due passi fondamentali:

  1. Collegarsi ad un computer già parte di GNet tramite un collegamento fisico o una VPN;
  2. Installare un demone che gestisca il routing ospf;

Collegarsi ad un router

Se avete la possibilità di collegarvi fisicamente ad un computer già dentro GNet, questa è senza dubbio la soluzione migliore. Nella maggior parte dei casi non sarà così.

Creare la VPN

Il primo passo è installare tinc, il demone VPN. Sulle distribuzioni debian-base dovrebbe bastare apt-get install tinc. Supporremo da ora in poi di voler collegare server1.example.com a server2.example.it.

Il secondo passo è generare le chiavi e scegliere il nome per l'interfaccia che noi chiameremo gnet su entrambi i server. Eseguiamo questi comandi:

server1# mkdir -p /etc/tinc/gnet/hosts
server2# mkdir -p /etc/tinc/gnet/hosts

Creiamo su entrambi i server il file di configurazione /etc/tinc/gnet/tinc.conf. Questo è il file di configurazione su server1:

# /etc/tinc/gnet/tinc.conf on server1
Name = server1
Device = /dev/net/tun
Mode = switch
AddressFamily = ipv4
ConnectTo = server2

E questo quello su server2:

# /etc/tinc/gnet/tinc.conf on server2
Name = server2
Mode = switch
AddressFamily = ipv4
Device = /dev/net/tun
ConnectTo = server1

A questo punto su entrambi i server generiamo le chiavi con il comando tincd -n gnet -K. Ci troveremo delle chiavi in file di nome rispettivamente server1 e server2 sui due server. Aggiungiamo in testa a questi file due righe (questo è il file d'esempio per server1, ma quello per server2 sarà analogo):

# /etc/tinc/gnet/hosts/server1 on server1
Address = server1.example.com
Port = 567

-----BEGIN RSA PUBLIC KEY-----
# Qua in mezzo ci sarà la vostra chiave RSA
-----END RSA PUBLIC KEY-----

La porta scelta è completamente arbitraria a patto che sia tcp che udp possano passare attraverso il firewall.

Scambiamo ora le chavi fra i server, ovvero copiamo il file /etc/tinc/gnet/hosts/server2 da server2 a server1 e viceversa, in modo che i server si conoscano a vicenda.

A questo punto abbiamo due scelte:

  1. Optare per una rete con un certo blocco di indirizzi, in cui ci siano anche i router;
  2. Creare una rete pointopoint che colleghi direttamente due i due router (server1 e server2). Questa è la scelta migliore nel caso in cui si stia solamente cercando di creare un ponte fra due reti indipendenti;

Scegliete la soluzione adatta a voi e andate al paragrafo giusto.. :)

Creare una subnet

Creiamo dunque il file /etc/tinc/gnet/tinc-up che contenga le seguenti righe

#!/bin/sh
# L'indirizzo del nostro server
IP=abc.def.ght.xyz
ifconfig $INTERFACE up $IP netmask 255.255.255.0 mtu 1470

che assegni gli ip corretti alle due interfacce e rendiamolo eseguibile con chmod a+x /etc/tinc/gnet/tinc-up. In questo script è possibile inserire qualsiasi cosa serva a rendere effettivamente operativa la rete. Nel nostro caso daremo l'indirizzo 6.30.100.1 a server1 e 6.30.100.2 a server2 (ma è solo un esempio, l'unica cosa importante è verificare che quegli indirizzi siano effettivamente liberi ed appropriarsene segnandolo su questo wiki). Impostare il MTU a 1470 dovrebbe servire ad evitare alcuni problemi che abbiamo sperimentato (pacchetti che vengono scartati perché troppo grossi).

Questo è un esempio di una subnet a 24 bit, ma non c'è nulla che vi vieti di fare altre scelte.

Creare un collegamento pointopoint

Se state solamente cercando di collegare due router la soluzione di creare una subnet è un enorme spreco di IP. Non che in effetti questo ci disturbi in alcun modo, dato che ne abbiamo 2^32 e siamo in meno di 10, ma è più una questione di principio.

Useremo per il collegamente pointopoint una sottorete a 31 bit, ovvero con due soli IP. Conviene (o almeno, io faccio così) dedicare una sottorete a 24 bit a tutti i collegamenti pointopoint. Ad esempio, supponiamo di aver dedicato la sottorete 6.20.104.0/24 a questo scopo (che fra l'altro è il mio caso), e supponiamo di aver già impegnato gli indirizzi 6.20.104.0 e 6.20.104.1 per collegare il nostro router con un altro. Usiamo dunque 6.20.104.2 per server1 e 6.20.104.3 per server2.

Creiamo il file /etc/tinc/tinc-up (questo è quello su server1):

#!/bin/sh
# Configuriamo l'interfaccia
ip link set dev $INTERFACE up mtu 1470
# Assegnamo l'ip a server1. La versione per server2 sarà simmetrica
ip address add 6.20.104.2 peer 6.20.104.3/32 dev $INTERFACE

Benvenuti in GNet

E a questo punto… benvenuti in GNet! Impostando il router a cui vi siete connessi come default gateway per la rete 6.0.0.0/8 e impostando il DNS a 6.20.10.1 o 6.22.22.22 avrete a disposizione tutta la rete Gnet.

Ma se volete, oltre che accedere, anche contribuire ad espanderla dovrete passare al routing dinamico:

Routing dinamico

Ora che siete connessi alla rete è arrivato il momento di presentarvi e di rendervi disponibili per condividere la vostra parte di GNet con gli altri!

Installare bird

Cominciamo con l'installare bird (queste istruzioni sono sempre per distribuzioni debian-based perché lì le cose sono più semplici):

apt-get install bird

Per chi non avesse il pacchetto basta scaricare i sorgenti da qui e compilarlo con

./configure --prefix=/usr
make 
sudo make install

Creiamo (o sostituiamo) il file di configurazione /etc/bird.conf con il seguente:

# /etc/bird.conf

# Protocollo che gestisce le sottoreti 'indotte'
# dalle interfacce di rete
protocol direct {
  interface "*";
}

# Questo protocollo esporta le route calcolate
# da bird nella tabella di instradamento del 
# kernel
protocol kernel {
  persist;
  export all;
}

# Questo protocollo serve a controllare se le
# interfacce vanno giù o su
protocol device {
  scan time 10;
}

# Questo è il nodo centrale del nostro file, 
# attiviamo ospf sulla nostra interfaccia gnet
protocol ospf GNetOspf {

  # L'area 0.0.0.0 deve sempre esistere e tutte le
  # eventuali altre aree devono essere sue figlie
  area 0.0.0.0 {
    interface "gnet" {
      # Potremmo scegliere anche pointopoint se il collegamento
      # fosse pointopoint (potrebbe essere più intelligente in
      # un futuro); se si sceglie pointopoint, bird e` sufficientemente
      # intelligente da capire automaticamente chi è il peer.
      type broadcast;
    };
  };
    
}

Sostituito il file possiamo avviare bird usando

/etc/init.d/bird start

o l'equivalente per il vostro sistema operativo (più in generale /usr/sbin/bird dovrebbe bastare).

Colleghiamoci quindi alla shell di bird con il comando birdc (da utente root) e di chiamo il comando

bird> show ospf neighbors

Questo dovrebbe dare un output simile al seguente (preso da linus.robol.it):

bird> show ospf neighbors 
GNetOspf:
Router ID   	Pri	     State     	DTime	Interface  Router IP   
6.22.22.22	  1	    full/dr   	00:37	woodstock  6.22.102.1     
6.20.101.2	  1	    full/dr   	00:34	daphne     6.20.101.2 

E se vedete che siete collegati effettivamente al vostro peer tutto dovrebbe funzionare. Potete osservare la topologia della rete con il comando show ospf topology.

Potete verificare che il vostro router sia effettivamente apparso nel grafo delle connessione su http://giocasa.homelinux.net/~giovanni/gnet.svg o, se riuscite a navigare in GNet, http://woodstock.gio.gnet/~giovanni/gnet.svg.

Metriche di routing

Quando una rete di router diventa complessa, usare come metrica il semplice numero di hop (ossia di passagi da un router all'altro) nella decisione del percorso migliore diventa piuttosto inefficiente: spesso due link veloci sono molto migliori di un link piu` lento. OSPF permette di determinare per ogni link un costo, ossia un peso, che verra` considerato nel calcolo dal percorso piu` veloce.

Bird di default utilizza 10 come costo di un'interfaccia. Per modificare questo valore, bisogna modificare la configurazione in questo modo:

    interface "gnet" {
      type broadcast;
      cost 50;
    };

In questo modo, il passaggio da questo router causera` un costo 50 (invece di 10) ad ogni rotta che esce dall'interfaccia gnet.

Poiche', ovviamente, i costi di interfaccia hanno significato solamente relativo ai costi del resto della rete, propongo, in linea di principio, di lasciare a 10 i collegamenti molto veloci (ossia Ethernet o roba del genere), di mettere a 20-30 i collegamenti attraverso Internet (ma comunque tra reti veloci) e a 50-100 i collegamenti che passano su ADSL. Questi numeri verranno modificati quando ci renderemo conto in che modo sono migliorabili.

Routing e firewall

Infine, è necessario attivare il forwarding dei pacchetti IPv4 (altrimenti la rete non funziona: e colpa vostra e rischiate il pubblico linciaggio) e potrebbe essere una buona idea configurare opportunamente un firewall, in modo che l'accesso ai propri computer sia opportunamente controllato. Va da sè il fatto che se il firewall è troppo restrittivo ed impedisce il routing di pacchetti all'interno della rete, ci si ricollega al caso precedente per quanto riguarda il rischio di linciaggio.

Su quasi tutti i nodi stiamo usando shorewall che permette di gestire il firewall in maniera abbastanza sensata. In realtà la cosa che conta è permettere il passaggio dei pacchetti con il comando

echo "1" > /proc/sys/net/ipv4/ip_forward

e rendere poi permanente questa modifica inserendo il valore

net.ipv4.ip_forward = 1

nel file /etc/sysctl.conf. Quest'ultimo passaggio può essere evitato da chi usa shorewall e che configura il routing fra le zone in maniera automatica (e anche un po' più sofisticata).

Potete vedere una configurazione di shorewall di esempio qui.

Filtraggio delle rotte

Per errori di configurazione (o anche per malizia, anche se speriamo di no), potrebbe accadere che su GNet vengono annunciate rotte errate, che non appartengono alla rete stessa. Per evitare che questo possa disturbare le tabelle di routing, è opportuno che le rotte vengano filtrate durante l'importazione, e quelle non appartenenti a GNet scartate.

Per fare questo, bisogna definire nella parte globale del file di configurazione un filtro in questo modo:

filter gnet_filter {
  if net ~ 6.0.0.0/8 then accept;
  else reject;
}

E poi utilizzarlo in fase di importazione e di esportazione nelle varie stanze associate ai protocolli che vengono utilizzate, con i comandi:

protocol ospf GNetOspf {

  # Configurazione del protocollo come già indicato
  
  import filter gnet_filter;
  export filter gnet_filter;
}

Utilizzando filtri più avanzati è possibile avere un controllo molto fine sul comportamento del proprio router.

Divisione in aree

Man mano che una rete OSPF cresce, può risultare conveniente dividerla in aree indipendenti, ciascuna delle quali non deve sapere cosa succede nelle altre. Ogni area deve essere collegata all'area 0 (detta backbone), che invece conosce tutta la topologia della rete. Questo permette di rendere il lavoro dei router un po' più alleggerito.

FIXME

collegarsi_a_gnet.txt · Ultima modifica: 2014/02/25 15:45 (modifica esterna)