11.8 Configurazione delle Interfacce di Rete

Contributo di Marc Fonvieille.

Al giorno d'oggi non riusciamo a pensare ad un computer senza pensare ad una connessione di rete. Aggiungere e configurare una scheda di rete è un compito comune per ogni amministratore di FreeBSD.

11.8.1 Individuazione del Driver Corretto

Prima di cominciare, dovresti conoscere il modello della scheda di rete che possiedi, il chip che usa, e se si tratta di una scheda PCI o ISA. FreeBSD supporta un'ampia varietà sia di schede PCI che ISA. Verifica l'Hardware Compatibility List della tua release per vedere se la scheda è supportata.

Una volta sicuro che la tua scheda sia supportata, hai bisogno di determinare il driver appropriato per la scheda. I file /usr/src/conf/NOTES e /usr/src/sys/arch/conf/NOTES ti forniranno un elenco di driver per le interfacce di rete con alcune informazioni su chipset/schede supportate. Se hai dubbi su quale sia il driver corretto, leggi la pagina man del driver. La pagina man fornirà ulteriori informazioni sull'hardware supportato ed anche sui possibili problemi che potrebbero capitare.

Se sei in possesso di una scheda comune, la maggior parte delle volte non dovrai cercare molto per trovare un driver. I driver per le schede di reti comuni sono presenti nel kernel GENERIC, quindi la tua scheda dovrebbe presentarsi durante l'avvio, in questo modo:

dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
dc0: Ethernet address: 00:a0:cc:da:da:da
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
dc1: Ethernet address: 00:a0:cc:da:da:db
miibus1: <MII bus> on dc1
ukphy1: <Generic IEEE 802.3u media interface> on miibus1
ukphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto

In questo esempio, vediamo che nel sistema sono presenti due schede che usano il driver dc(4).

Se il driver per la tua NIC non è presente in GENERIC, dovrai caricare i driver appropriati per usare la tua NIC. Questo dovrà essere fatto in uno di questi due modi:

11.8.1.1 Usare driver NDIS Windows®

Sfortunatamente, ci sono ancora molti venditori di hardware che non forniscono specifiche dei loro driver alla comunità open source perchè ritengono che tale informazione sia un segreto commerciale. Conseguentemente, gli sviluppatori di FreeBSD e di altri sistemi operativi hanno due scelte: sviluppare i driver con un lungo ed arduo processo di reverse engineering o usare i driver binari disponibili per le piattaforme Microsoft® Windows. La maggior parte degli sviluppatori, inclusi quelli coinvolti in FreeBSD, ha preso la seconda strada.

Grazie al contributo di Bill Paul (wpaul), a partire da FreeBSD 5.3-RELEASE c'è supporto “nativo” per Network Driver Interface Specification (NDIS). Il NDISulator di FreeBSD (anche noto come Progetto Evil) prende un driver binario per Windows e sostanzialmente crea un inganno fingendo di eseguirlo in Windows. Poichè il driver ndis(4) sta usando un binario Windows, è usabile solo su sistemi i386™ e amd64.

Nota: Il driver ndis(4) è designato per supportare principalmente device PCI, CardBus e PCMCIA, i device USB non sono ancora supportati.

Per usare il NDISulator, hai bisogno sostanzialmente di tre cose:

  1. Sorgenti del kernel

  2. binari dei driver di Windows XP (estensione .SYS)

  3. file di configurazione dei driver per Windows XP (estensione .INF)

Localizza i file per la tua carta specifica. Generalmente, posso essere trovati nel CD incluso o sui siti web dei venditori. Nei seguenti esempi, useremo W32DRIVER.SYS e W32DRIVER.INF.

Nota: Non puoi usare un driver Windows/i386 con FreeBSD/amd64, devi trovare un driver Windows/amd64 per farlo funzionare correttamente.

Il prossimo passo è compilare il binario del driver in un modulo caricabile dal kernel. Per fare questo, come root, usa ndisgen(8):

# ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS

L'utility ndisgen(8) è interattiva e chiederà altre informazioni di cui necessita; produrrà un modulo del kernel nella presente directory che può essere caricato in questo modo:

# kldload ./W32DRIVER.ko

In aggiunta al modulo del kernel generato, devi caricare i moduli ndis.ko e if_ndis.ko. Questo dovrebbe avvenire automaticamente quando uno carica un modulo che dipende da ndis(4). Se vuoi caricarli manualmente, usa il seguente comando:

# kldload ndis
# kldload if_ndis

Il primo comando carica il wrapper del driver miniport NDIS, il secondo carica l'interfaccia di rete in questione.

Ora controlla dmesg(8) per vedere se c'era qualche errore durante il caricamento. Se tutto è andato bene, dovresti ottenere dell'output che somiglia a questo:

ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
ndis0: NDIS API version: 5.0
ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps

D'ora in poi, puoi trattare il device ndis0 come ogni altra scheda di rete (ad esempio dc0).

Puoi configurare il sistema perché carichi il modulo NDIS al momento del boot nello stesso modo di ogni altro modulo. Per prima cosa, copia il modulo generato W32DRIVER.ko, nella directory /boot/modules. Quindi, aggiungi le seguenti linee a /boot/loader.conf:

W32DRIVER_load="YES"

11.8.2 Configurazione della Scheda di Rete

Una volta che il driver giusto per la scheda di rete è stato caricato, la scheda ha bisogno di essere configurata. Come molte altre cose, la scheda di rete potrebbe essere già stata configurata al momento dell'installazione tramite sysinstall.

Per mostrare la configurazione delle interfacce di rete sul tuo sistema, immetti il seguente comando:

% ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:a0:cc:da:da:da
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
        ether 00:a0:cc:da:da:db
        media: Ethernet 10baseT/UTP
        status: no carrier
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500

Nota: Vecchie versioni di FreeBSD potrebbero richiedere l'opzione -a dopo ifconfig(8), per maggiori dettagli sulla sintassi corretta di ifconfig(8), fai riferimento alla pagina man. Nota anche che le voci relative all'IPv6 (inet6 ecc.) sono state omesse in questo esempio.

In questo esempio, vengono mostrati i seguenti dispositivi:

FreeBSD usa il nome del driver seguito dall'ordine nel quale la scheda è stata rilevata all'avvio del kernel per dare un nome alla scheda di rete. Ad esempio sis2 sarebbe la terza scheda di rete nel sistema che usa il driver sis(4).

In questo esempio, il dispositivo dc0 è attivo. Gli indicatori chiave sono:

  1. UP significa che la scheda è pronta e configurata.

  2. La scheda ha un indirizzo Internet (inet) (in questo caso 192.168.1.3).

  3. Ha una maschera di sotto-rete valida (netmask; 0xffffff00 è lo stesso di 255.255.255.0).

  4. Ha un indirizzo di broadcast valido (in questo caso, 192.168.1.255).

  5. L'indirizzo MAC della scheda (ether) è 00:a0:cc:da:da:da.

  6. La selezione del mezzo fisico è in modalità auto selezione (media: Ethernet autoselect (100baseTX <full-duplex>)). Vediamo che dc1 è stata configurata con un mezzo fisico 10baseT/UTP. Per ulteriori informazioni sui tipi di mezzi disponibili per un driver, fai riferimento alla sua pagina man.

  7. Lo stato del collegamento (status) è active, ovvero è stata rilevata la portante. Per dc1, vediamo status: no carrier. Questo è normale quando un cavo Ethernet non è stato inserito nella scheda.

Se l'output di ifconfig(8) avesse mostrato qualcosa di simile a:

dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
                ether 00:a0:cc:da:da:da

ciò avrebbe indicato che la scheda non era stata ben configurata.

Per configurare la tua scheda, avrai bisogno dei privilegi di root. La configurazione della scheda di rete può essere effettuata da riga di comando con ifconfig(8), ma avresti bisogno di farlo ad ogni riavvio del sistema. Il file /etc/rc.conf è il posto giusto dove scrivere la configurazione della scheda di rete.

Apri /etc/rc.conf con il tuo editor preferito. Avrai bisogno di aggiungere una riga per ogni scheda di rete presente nel sistema, ad esempio nel nostro caso, abbiamo aggiunto queste linee:

ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"

Dovrai sostituire dc0, dc1, e così via, con i dispositivi corretti per la tua scheda, e gli indirizzi con quelli appropriati. Dovresti leggere le pagine man del driver e di ifconfig(8) per maggiori dettagli sulle opzioni permesse ed anche la pagina man di rc.conf(5) per maggiori informazioni sulla sintassi di /etc/rc.conf.

Se hai configurato la rete durante l'installazione, alcune linee relative alle schede di rete potrebbero essere già presenti. Controlla due volte /etc/rc.conf prima di aggiungere ogni linea.

Avrai anche bisogno di modificare il file /etc/hosts per aggiungere i nomi e gli IP delle varie macchine della LAN, se non sono già lì. Per maggiori informazioni, fai riferimento a hosts(5) ed a /usr/share/examples/etc/hosts.

11.8.3 Verifica e Risoluzione dei Problemi

Una volta che hai effettuato i cambiamenti necessari a /etc/rc.conf, dovresti riavviare la macchina. Ciò farà sì che i cambiamenti alle interfacce vengano applicati, e verificherà che il sistema si riavvii senza nessun errore di configurazione.

Una volta che il sistema è stato riavviato, dovresti testare le interfacce di rete.

11.8.3.1 Test della Scheda Ethernet

Per verificare che una scheda Ethernet sia configurata correttamente, si devono provare due cose. Prima, effettuare un ping verso l'interfaccia stessa, e poi un ping verso un'altra macchina sulla LAN.

Prima proviamo l'interfaccia:

% ping -c5 192.168.1.3
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms

--- 192.168.1.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms

Ora dobbiamo effettuare un ping verso un'altra macchina della LAN:

% ping -c5 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms

Puoi usare il nome della macchina invece di 192.168.1.2 se hai sistemato il file /etc/hosts.

11.8.3.2 Risoluzione dei Problemi

Risolvere i problemi delle varie configurazioni hardware e software è sempre una faticaccia, ma è una fatica che può essere diminuita controllando da subito le cose semplici. Avete collegato il cavo di rete? Avete configurato i servizi di rete? Avete configurato il firewall correttamente? La scheda di rete che state usando è supportata da FreeBSD? Controllate sempre le note sul vostro hardware prima di inviare un bug report. Aggiornate la vostra versione di FreeBSD all'ultima versione STABLE disponibile. Controllate gli archivi delle mailing list, o magari cercate su Internet.

Se la scheda funziona, ma le prestazioni sono scadenti, potrebbe esservi utile la lettura della pagina man tuning(7). Potreste anche verificare la vostra configurazione della rete, poichè una configurazione scorretta può essere la causa di connessioni lente.

Alcuni utenti riscontrano dei “device timeouts”, il che è normale per alcune schede. Se questi continuano, o se sono fastidiosi, potreste voler ricontrollare che non ci siano conflitti con altri dispositivi. Controllate due volte la connessione di rete. Forse dovreste procurarvi un'altra scheda.

Alcune volte, gli utenti notano alcuni errori “watchdog timeout”. La prima cosa da fare è controllare il cavo di rete. Alcune schede di rete richiedono uno slot PCI che supporti il Bus Mastering. Su alcune vecchie schede madri, ciò è permesso solo per uno slot PCI (tipicamente lo slot 0). Controllate la documentazione della scheda di rete e della scheda madre per determinare se possa essere quello il problema.

Messaggi “No route to host” vengono generati se il sistema non è in grado di effettuare il routing di un pacchetto verso una certa destinazione. Ciò può accadere se non è specificata una route di default, o se il cavo è scollegato. Controllate l'output di netstat -rn ed assicuratevi che ci sia una route valida per l'host che state cercando di raggiungere. Se non c'è, leggete il Capitolo 29.

I messaggi d'errore “ping: sendto: Permission denied” sono spessi causati da un firewall mal configurato. Se ipfw è abilitato nel kernel ma non ci sono regole definite, allora la politica di default è di negare tutto il traffico, comprese le richieste di ping! Leggete il Capitolo 28 per maggiori informazioni.

Talvolta le prestazioni della scheda di rete sono scadenti, o sotto la media. In questi casi è preferibile cambiare la selezione del media da autoselect ad una selezione corretta. Anche se questo sistema funziona con la maggior parte dell'hardware, potrebbe non risolvere il problema per tutti. Ancora una volta, controllate tutte le impostazioni di rete, e leggete la pagina man tuning(7) .

Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Per domande su FreeBSD, leggi la documentazione prima di contattare <questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a <doc@FreeBSD.org>.