giovedì 25 ottobre 2012

Configurare Ubuntu come router

In questa guida viene utilizzato il terminale. Se non sai come si usa consulta la guida Utilizzare il terminale ed una buona dose di pazienza!

Nella configurazione di alcuni server si è reso necessario configurare Ubuntu in modo che funzioni come un router LAN e permetta l'accesso ad internet. In questa guida descriverò come configurare la scheda di rete utilizzando Ubuntu in modo che funga da router ad IP dinamico (DHCP).
La procedura non è complicata ma abbastanza lunga, avremo bisogno solo di qualche piccolo accorgimento, un po' di pazienza e, ovviamente, di due schede di rete.

Hardware e software necessario

Anzitutto saranno necessari:

  • (ovviamente) un PC con Ubuntu Server (o desktop) installato;
  • due schede di rete con presa Ethernet (eventualmente una PCI);
  • uno switch con tanti ingressi quanti i PC da collegare alla rete;
  • un modem con accesso ad internet.

Una cosa fondamentale è che almeno una scheda di rete (che sarà poi quella che utilizzeremo per gestire la rete interna) abbia il supporto dal driver per il MULTICAST, per verificarlo usa il comando ifconfig e verifica che nell'output sia presente qualcosa di simile:

eth1      Link encap:Ethernet IndirizzoHW 00:23:8b:d8:xx:xx
          UP BROADCAST 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
          collisioni:0 txqueuelen:1000
          Byte RX:0 (0.0 B) Byte TX:0 (0.0 B)

se la parte in grassetto non contiene la parola MULTICAST sarà necessario installare manualmente i driver per il supporto al muticasting per la tua scheda di rete. La procedura per fare questo passaggio dipende dal chipset utilizzato sulla tua scheda e, solitamente, è fornita dai produttori della stessa.

Il software necessario sarà uno qualsiasi che offra il servizio di server DHCP. In questa guida verrà utilizzato isc-dhcp-server disponibile nei repository universe di Ubuntu.
Per installarlo sarà sufficiente dare da terminale:

$sudo apt-get install isc-dhcp-server

N.B. Utilizzando un altro software la procedura sarà leggermente diversa da quella descritta di seguito.

Impostazione della scheda per la rete interna

Identifichiamo le schede di rete, lanciando da terminale:

$ifconfig

Supponiamo che le due schede di rete si chiamino eth0 ed eth1; vogliamo impostare la scheda eth0 per la connessione alla rete esterna (accesso al web), mentre la eth1 per la rete interna.

Per prima cosa occupiamoci del file /etc/network/interfaces.
Creiamo una copia di backup delle configurazioni originali dando:

$sudo cp /etc/network/interfaces /etc/network/interfaces_back

ed apriamolo (ad esempio da terminale con sudo nano /etc/network/interfaces) per aggiungere (o modificare se già presenti) le impostazioni della scheda eth1:

auto eth1
iface eth1 inet static
   address 192.168.4.1
   netmask 255.255.255.0
   broadcast 192.168.4.254

Sostituisci l'indirizzo 192.168.4.1 con quello che desideri assegnare alla rete interna, facendo attenzione ad inserire anche un broadcast coerente.

Modifichiamo ora il file /etc/hosts aggiungendo alla fine la riga:

192.168.4.0/24

Questo passo non sempre è necessario, ma in alcuni casi (non mi è ben chiaro il motivo) la rete interna non sarà funzionante senza inserire tale riga.

Configurazione del servizio DHCP

Per l'impostazione del servizio DCHP si utilizzerà il software isc-dhcp-server, installato all'inizio della procedura.

Anzitutto, come buona norma, creiamo una copia di backup del file di configurazione /etc/dhcp/dhcpd.conf (ad esempio dando sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.back). Dopo averlo fatto apriamo il file con un editor di testo (ad esempio con sudo nano /etc/dhcp/dhcpd.conf) e cancelliamo tutto il contenuto.

Inseriamo ora i seguenti parametri:

default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.4.254;
option routers 192.168.4.254;
option domain-name-servers 192.168.1.1;
option domain-name "mydomain.org";

subnet 192.168.4.0 netmask 255.255.255.0 {
   range 192.168.4.2 192.168.4.100;
}

per permettervi modifiche a tali parametri nel modo corretto ne analizzo brevemente il significato:

  • default-lease-time è il tempo standard per cui un indirizzo IP viene riservato ad uno stesso utente (tramite MAC address) [vedi Wikipedia.it - DHCP];
  • max-lease-time è il tempo massimo per cui un utente può richiedere che gli venga riservato l'indirizzo IP;
  • broadcast-address è l'indirizzo di broadcast e deve coincidere con quello riportato in /etc/network/interfaces in precedenza;
  • domain-name-servers è l'indirizzo DNS;
  • domain-name è un l'alias che si vuole assegnare al server che ospita il servizio DHCP.

Aggiungiamo ora il route per l'indirizzo 255.255.255.255 utilizzando il comando

$sudo route add -host 255.255.255.255 dev eth1

se questo comando dovesse ritornare l'errore "255.255.255.255: Unknown host" sarà necessario aggiungere la seguente riga al file /etc/hosts:

255.255.255.255 all-ones

ed infine dare da terminale:

$sudo route add -host all-ones dev eth1

IP forwarding e masquerading

Ultimo ed essenziale passaggio è quello di condividere la connessione dal nostro server Ubuntu con gli utenti locali tramite il forwarding di iptables. Per farlo bisogna creare un file, che chiamerò con molta fantasia ip_forward, che contenga due semplicissimi comandi.

Per farlo posizioniamoci (se non lo siamo già) nell'home (usando cd ~) e diamo il comando:

$touch ip_forward

apriamo ora il file (ad esempio con nano ip_forward) ed inseriamo le seguenti linee:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

salviamo, chiudiamo il file e rendiamolo eseguibile con il comando

$chmod +x ip_forward

infine copiamolo in /etc/init.d e facciamo in modo che venga eseguito all'avvio del sistema utilizzando i seguenti comandi:

$
$sudo cp ip_forward /etc/init.d/ip_forward
sudo update-rc.d ip_forward defaults

abilitiamo ora il forwarding accedendo al file /etc/sysctl.conf e modificando la linea

net.ipv4.ip_forward=0 con net.ipv4.ip_forward=1

a questo punto sarà sufficiente riavviare il sistema per rendere le ultime modifiche effettive e, alla sua accensione, tutto dovrebbe essere funzionante.
Se è così il mio consiglio è quello di stapparti la "bottiglia di birra della vittoria" e goderti la connessione!

Fonti
ISC DHCP Documentation & FAQ - Configurazione DHCP
Wiki Ubuntu-it.org - Creazione di un Gateway LAN
Note
• Se ti interessa creare un router con assegnazione ad IP fisso utilizzando Ubuntu server segui la guida Wiki Ubuntu-it.org;
• I passi elencati da questa guida sono testati e funzionanti su Ubuntu server 12.04 LTS a 64bit, ma dovrebbero essere i medesimi anche per le versioni precedenti/successive del sistema operativo.

14 commenti:

  1. ciao veramente interessante.....ma poi esiste una web interface per accedere allenfo della linea o ai dati sugli host?(tipo utenti connessi o i rispettivi ip)

    RispondiElimina
    Risposte
    1. Ciao Raimondo,
      per visualizzare la lista degli host connessi ad una rete puoi utilizzare l'utility nmap:

      sudo apt-get install nmap
      nmap -v -sP 192.168.4.0/24

      L'output sarà qualcosa di questo tipo:

      Starting Nmap 6.00 ( http://nmap.org ) at 2013-03-26 16:00 CET
      Initiating Ping Scan at 16:00
      Scanning 256 hosts [2 ports/host]
      Completed Ping Scan at 16:00, 3.01s elapsed (256 total hosts)
      Initiating Parallel DNS resolution of 256 hosts. at 16:00
      Completed Parallel DNS resolution of 256 hosts. at 16:00, 0.00s elapsed
      Nmap scan report for 192.168.4.0 [host down]
      Nmap scan report for C****s (192.168.4.1)
      Host is up (0.0011s latency).
      Nmap scan report for F****C (192.168.4.2)
      Host is up (0.00044s latency).
      Nmap scan report for 192.168.4.3 [host down]
      [...]

      Per quanto riguarda la web interface, non le ho mai usate, ma se guardi qui trovi qualche programma che fa al caso tuo:
      http://en.wikipedia.org/wiki/Nmap#Graphical_interfaces

      Elimina
    2. EDIT: se vuoi visualizzare solo i client attivi puoi utilizzare il comando

      nmap -sP 192.168.4.0/24

      Elimina
  2. grazie mille per la rapida risposta :).....io più che altro per web interface intendevo propio simile a quella di un router per tenere sott'occhio tutti i parametri della rete oppure andare a configurare varie cose nn da linea di comando....
    cmq seguendo la tua guida sono riuscito a trasformare un pc che uso come muletto in un router, però ho due problemi:
    1) il tutto è un po troppo lento(forse dipende da qualche parametro da configurare?...cmq sul muletto ho transmission e penso che sia questo il problema e come potrei fare?);
    2) gli ip li devo assegnare staticamente.

    Sicuramente avrò altre domande :)...cmq ti ringrazio

    RispondiElimina
    Risposte
    1. Per quanto riguarda la lentezza dipende cosa intendi: lungo tempo di attesa prima di connetterti o limitata velocità di download/upload?
      nel primo caso il problema è legato al firewall (ufw se attivo oppure iptables), nel secondo caso sostanzialmente dovrebbe dipendere dalla velocità della tua scheda/hub/... di rete.
      Se hai seguito la procedura alla lettera dovrebbe essere tutto abbastanza performante perchè il passaggio da una rete all'altra è (quasi) trasparente.
      Il passaggio fondamentale è quello finale nel paragrafetto "IP forwarding e masquerading".

      Per quanto riguarda l'assegnazione statica incollami qui il contenuto del tuoi file /etc/dhcp/dhcpd.conf, /etc/hosts e /etc/network/interfaces

      Domanda stupida: hai riavviato dopo aver impostato l'IP forwarding e masquerading?

      Elimina
    2. etc/dhcp/dhcpd.conf

      default-lease-time 600;
      max-lease-time 7200;
      option subnet-mask 255.255.255.0;
      option broadcast-address 192.168.4.254;
      option routers 192.168.4.254;
      option domain-name-servers 8.8.8.8;
      option domain-name "mydomain.org";

      subnet 192.168.4.0 netmask 255.255.255.0 {
      range 192.168.4.2 192.168.4.100;
      }

      /etc/hosts

      127.0.0.1 localhost
      127.0.1.1 rai-MS-7680

      192.168.4.0/24
      255.255.255.255 all-ones

      # The following lines are desirable for IPv6 capable hosts
      ::1 ip6-localhost ip6-loopback
      fe00::0 ip6-localnet
      ff00::0 ip6-mcastprefix
      ff02::1 ip6-allnodes
      ff02::2 ip6-allrouters

      /etc/network/interfaces (ho usato eth0 e eth1 in modo inverso)

      auto lo
      iface lo inet loopback

      auto eth0
      iface eth0 inet static
      address 192.168.4.1
      netmask 255.255.255.0
      broadcast 192.168.4.254

      Elimina
    3. cmq il problema penso di averso identificato ed è transmission(anche se la mia linea è a 4 megabit quanto attacco transmission i ping arrivano a 641ms e la velocità sui 800kbit)

      Sto usando questo pc come muletto e nas e visto che lo tengo sempre accesso dopo aver letto la tua bellissima guida ho pensato di usarlo anche come router e liberarmi del mio, così da risparmiare un po' di corrente ed eliminare altri inutili fili...però se transmission va a ledere la banda e mi rende impossibile navigare sui pc(ho provato anche a limitare la banda a 10 kbit ma nn cambia niente l'unica cosa che posso fare è quella di stoppare tutti i torrent)

      Elimina
    4. cmq si ho riavvitato tutto più e più volte :)

      Elimina
    5. Beh aspetta, il problema dei p2p (e anche di torrent) non è tanto la velocità di download/upload, quanto l'elevato numero di connessioni simultanee (si arriva all'ordine delle migliaia) che farebbero rallentare qualsiasi router (anche quelli che fanno solo da router!).
      Per quanto riguarda il dhcp la configurazione mi sembra corretta; che client cerchi di collegare? Windows?

      Elimina
  3. la mia è una rete mista: linux, win e mac osx....
    per qunato riguarda le connessioni del client torrent nn si può fare niente?
    ma un pc nn dovrebbe essere molto più performante di un router semplice?(ho un i3 con 2gb di ram però sto usando la versione descktop di ubuntu)

    RispondiElimina
    Risposte
    1. Diciamo che l'ideale sarebbe mettere Ubuntu server a 64 bit per le potenzialità di calcolo, per quanto riguarda la velocità della rete, non è purtroppo solo correlata alle prestazioni del PC a livello di processore e ram, ma viene influenzata molto di più dalle prestazioni della scheda di rete e dal tipo di connessione che viene effettuata... Purtroppo con tanti client connessi la rete si intasa sia a livello di trasmissione pacchetti che a livello si gestione delle connessioni da parte della scheda...Se ci sono troppe connessioni, l'hardware è costretto a porle in attesa che si liberi la risorsa e analogamente se ci sono troppi pacchetti che cercano si viaggiare sulla rete devi aspettare che arrivi quello richiesto! Un po come un ingorgo in autostrada!

      Elimina
  4. passare ad ubuntu server è in cantiere...sto facendo vari test prima di passare alla versione server poichè era la prima volta che lo facevo e avevo già un pc con ubuntu sopra
    quindi dici che è la scheda di rete? cambiarla gioverebbe?

    e per il problema degli ip statici...quale potrebbe essere il problema?

    un'altra cosa, transmission va cmq lento...bisogna cambiare qualche regola del firewall?

    RispondiElimina
    Risposte
    1. Se la scheda di rete è una gigabit non gioverebbe nemmeno cambiarla, a meno che metti la fibra ottica in casa per la rete locale (cosa poco economica). Purtroppo attraverso il cavo lan può passare solo un pacchetto alla volta e siccome ogni cliente che si connette richiede pacchetti si forma una sorta di imbuto (un po' come succede nel BUS della scheda madre). Probabilmente il fatto che sia molto rallentato è anche dovuto al fatto che le porte del firewall non sono aperte, tieni conto che usando Ubuntu come router viene meno il meccanismo dell'UPnP (che apre e chiude le porte in modo "intelligente" e in automatico) quindi tutte le porte devono essere aperte manualmente.

      Il mio consiglio è quello di controllare lo stato di ufw (sudo ufw status) e se è attivo prova a disattivarlo (sudo ufw disable). Se la cosa migliora allora il problema è il firewall che filtra i pacchetti e cercherò di darti una soluzione che possa permetterti di far funzionare il router senza disattivare il firewall!

      Elimina
    2. tornando alla web interface che chiedevi, io mi trovo abbastanza bene con webmin (trovi il deb per Ubuntu sul sito http://www.webmin.com/download.html ) che permette di gestire in tutto e per tutto il tuo server da interfaccia web, bisogna imparare ad usarla (per farlo puoi usare la wiki ufficiale http://doxfer.webmin.com/Webmin ).
      All'inizio può sembrare un po' ostica, ma se capisci come funziona diventa abbastanza intuitiva!
      Sinceramente non so se esiste una pagina che mostri e permetta di gestire direttamente la rete perchè lo scopo principale non è quello, comunque prova a darci un occhiata!

      Elimina