[GNU/Linux] Script per modificare MAC address

Ho scritto uno script bash che permette in Linux di manipolare l’indirizzo MAC di una scheda di rete, la cui operazione in gergo viene detta spoofing. Lo script può essere usato su tutte le principali distribuzioni e permette di cambiare l’indirizzo MAC con uno generato casualmente oppure con uno indicato dall’utente. Le istruzioni per eseguire lo script sono le seguenti:

Usage: macs.sh [OPTIONS]
Spoof your wired or wireless network adapter with a new MAC address.
Options:
-r <interface>: spoof an interface with a random MAC address
-s <interface> <address>: spoof an interface with a new MAC address
-o <interface>: restore an interface with the original MAC address
-v <interface>: show the MAC address and the vendor of an interface
-p <vendor>: show the MAC prefix of a vendor
-a: show the MAC address of every network interface
-h: show this help

—————————————————————-
Examples:
sh macs.sh -r eth0
sh macs.sh -s wlan1 001122334455
sh macs.sh -s eth3 00:1C:39:FB:6C:88
sh macs.sh -o eth0
sh macs.sh -p IBM
sh macs.sh -p Microsoft

Tra le funzionalità vi è anche quella di visualizzare il vendor della scheda di rete, e tutti i prefissi MAC proprietari di uno specifico vendor.

Si tratta di uno script bash, dunque deve essere lanciato con l’interprete sh e con i privilegi di root. Vediamo alcuni esempi:

# sh macs.sh -r eth1 modifica l’indirizzo dell’interfaccia eth1 con uno random
# sh macs.sh -s eth1 00:0C:29:FB:6C:4B modifica l’indirizzo di eth1 con 00:0C:29:FB:6C:4B
# sh macs.sh -o eth3 ripristina l’indirizzo MAC reale di eth3
# sh macs.sh -v eth2 visualizza l’indirizzo MAC e vendor di eth2
# sh macs.sh -a visualizza gli indirizzi MAC e vendor di tutte
# sh macs.sh -p Microsoft visualizza i prefissi MAC proprietari Microsoft

Lo script è rilasciato con licenza GNU GPL v3, ed è scaricabile a questi link:

Matteo

[Reti] Come risolvere i problemi di connessione, il DNS – parte 2

Se la connessione ad Internet o la navigazione sul web non funzionano i motivi potrebbero essere molti, ed uno di questi potrebbe essere legato al server DNS utilizzato. Ad esempio non vengono più caricate le pagine web ma la connessione sembra stabilita? Come risolviamo il problema? Spesso quando la rete non va si pensa a tutto meno che a verificare il funzionamento del server DNS. Questo post rappresenta la seconda parte di un altro POST in cui spiegavo come risolvere i problemi in una rete locale senza l’uso del DNS. In questo articolo invece ci spostiamo ai problemi di connessione anche verso la grande Rete.

no-internet-today

Prima di affrontare la problematica ricordiamo che il DNS, acronimo di Domain Name System, è un protocollo di comunicazione che traduce i nomi delle macchine in indirizzi IP, ed è quindi fondamentale per la navigazione sul web. Infatti, durante la navigazione su Internet vengono solitamente digitati sul browser i nomi dei siti che vogliamo visitare, i quali vengono poi tradotti dal protocollo DNS in indirizzi IP. Ciò avviene in modo del tutto automatico e trasparente per l’utente, difatti è il sistema operativo stesso che si occupa di interrogare uno dei server DNS impostati e di ottenere come risposta l’indirizzo IP del sito da visitare. Per conoscere i server DNS configurati è sufficiente digitare da terminale: ipconfig /all in ambiente Windows, e ifconfig in Linux.

Vediamo adesso gli step da fare.

  1. ping verso Internet. L’operazione “classica” è di effettuare un ping verso un sito Internet. Importante è effettuare due prove con il comando ping, una utilizzando come destinazione il nome completo di un sito Internet (FQDN), l’altra utilizzando l’indirizzo IP diretto del sito. Nel caso in cui entrambi i ping non ricevano risposta, il problema è da ricercarsi nella connessione stessa e non c’entra niente il DNS. I problemi potrebbero essere dovuti al proprio fornitore di connettività, al router mal configurato, ai driver/moduli della scheda di rete, al sistema operativo, … Nel caso in cui invece il ping con il nome completo di un sito non funzioni, mentre viene restituita la risposta utilizzando l’indirizzo IP, il problema è da ricercarsi nel DNS (passare al punto successivo). Ecco un esempio esplicativo, in cui il server DNS configurato è errato oppure non è funzionante.

    ping_senza_dns

    Esempio con DNS errato o non impostato

  2. verifica del server DNS. Verificato che la connessione a Internet non risponde (e il ping di un sito utilizzando il nome completo), nonostante il comando ping abbia ricevuto almeno una risposta, controlliamo le impostazioni del DNS. Apriamo un terminale, digitiamo il comando nslookup e osserviamo l’output. Se viene segnalato un errore allora abbiamo trovato il problema: l’indirizzo IP del server DNS è errato oppure non funziona il server stesso! Attenzione, perché nel caso in cui non venga restituito errore ma solo “server unknown” il server DNS impostato è corretto, ma non è semplicemente abilitato il reverse lookup, una funzionalità dei server che può essere abilitata o meno. Qualora ci sia un errore nel server DNS impostato, è opportuno verificare manualmente la configurazione del sistema e provare a cambiare i server DNS utilizzati, ad esempio con quelli di OpenDNS: 208.67.222.222 e 208.67.220.220. Se viene invece visualizzato un output simile al seguente allora il DNS funziona perfettamente e ancora non abbiamo trovato il problema:

    nslookup

    Server DNS impostato correttamente

  3. Risoluzione FQDN locale. Dunque, facciamo il punto della situazione: il ping verso Internet funziona, i server DNS sono correttamente impostati e rispondono al comando nslookup. Nel caso in cui il server DNS utilizzato si trovi nella rete interna a cui siamo collegati, effettuiamo un local FQDN, ossia interroghiamo il server DNS chiedendo di risolvere il nome completo di una macchina locale. Se la richiesta ha esito negativo, ossia viene generato un errore, il problema è del server DNS. Contattare l’amministratore del server DNS (ad esempio in una rete aziendale) oppure cambiarlo nel caso in cui sia un indirizzo pubblico. Vediamo un esempio:
    local_fqdn

    Risoluzione FQDN locale con nslookup

    Nell’esempio è stata effettuata una richiesta al server DNS utilizzando il nome completo di un host, ed è stata ricevuta correttamente la risposta. Ricordo che il nome completo di un host, FQDN, è il nome intero che identifica la risorsa in rete, ad esempio hostname.dominio.it.

  4. Risoluzione hostname locale (se il server DNS è nella rete interna). Provare a risolvere un hostname senza suffisso (ad esempio pc1 è l’hostname di pc1.esempio.it), sempre utilizzando il comando nslookup. Nel caso in cui venga restituito un errore il problema non è del server DNS ma della componente client del proprio sistema operativo. Ecco un esempio, in cui nslookuprestituisce correttamente la risposta:

    query_local_hostname

    Risoluzione hostname locale con nslookup

  5. Risoluzione FQDN esterno. Proviamo a risolvere sempre tramite il comando nslookup un nome completo, FQDN, della rete esterna (ad esempio un sito Internet). Se viene restituito un errore il problema è nel server DNS utilizzato, quindi provare a cambiarlo o contattare l’amministratore del server/ISP. Se invece la risoluzione del nome restituisce esito positivo, ma comunque la navigazione non funziona, il problema è della macchina client.

Nei punti 4 e 5, se il test ha esito negativo, il problema è il servizio DNS del sistema che non funziona correttamente. Per risolvere il problema in Windows ci sono 3 step:

  1. aprire il terminale dei comandi e digitare ipconfig /flushdns;
  2. digitare net stop dnscache;
  3. digitare infine net start dnscache.

Il comando ipconfig /displaydns visualizza la cache del client DNS.

Nel caso di Linux invece la soluzione è più semplice perché basta riavviare il servizio nscd.

Matteo

[Reti] L’indirizzo IP e la Rete

Ho deciso di scrivere un post che cercherà di spiegare cos’è un indirizzo IP e quale visibilità ha un computer su Internet, dopo che molte volte mi sono state rivolte domande a riguardo. Buona lettura ;-).

Ogni dispositivo collegato ad Internet (computer, palmare, cellulare, …), e più in generale a qualsiasi rete, è dotato di un proprio indirizzo che lo identifica in modo univoco. Possiamo pensare ai cellulari: ogni cellulare ha un proprio numero univoco, e quindi diverso da tutti gli altri (anche se in realtà il numero viene assegnato alla scheda sim, ma questo è un altro argomento), e questo numero ha una struttura fissa composta da 10 numeri. E’ naturale pensare che non possano esistere due cellulari diversi con lo stesso numero X, altrimenti se entrambi fossero accesi e qualcuno volesse chiamare proprio il numero X cosa succederebbe? La rete telefonica non saprebbe a quale dei due cellulari inoltrare la telefonata! Quello che succede per i cellulari può essere paragonato ai computer e a Internet. Ogni computer, al momento che si collega ad una qualunque rete (sia su Internet che all’interno di una LAN), deve possedere un proprio indirizzo IP, assegnato dal suo Internet Service Provider – ISP (Alice, Tele2, Tiscali, …) ed avente la forma X.X.X.X, dove ogni X può essere un qualsiasi numero da 0 a 255 (con alcune eccezioni). Esempi di indirizzi IP sono 192.168.3.45, oppure 155.123.111.1, ma anche 2.3.4.5 è un indirizzo valido.

indirizzo_ip

Per conoscere il proprio indirizzo è possibile utilizzare un comando specifico da terminale. In caso di windows è necessario aprire il prompt dei comandi e digitare:

ipconfig

e tra i dati visualizzati si potrà vedere proprio l’indirizzo IP (ovviamente attenzione a controllare la scheda giusta se si hanno più schede di rete all’interno del computer). Ecco un esempio (l’indirizzo IP è 192.168.1.2):

ipconfig

ipconfig su Windows

Da notare che aggiungendo l’opzione /all al comando verranno visualizzate tutte le informazioni relative alla rete (server DNS, gateway, …).

Nel caso di Linux invece il comando da digitare all’interno della shell è:

# ifconfig

(per maggiori dettagli vedere l’articolo rete in Linux).

A questo punto, provate a controllare l’IP visibile da Internet attraverso uno dei tanti siti che si trovano in giro sul web, ad esempio visitate www.ip-adress.com. L’indirizzo visibile sul sito non corrisponde a quello della vostra macchina? Potrebbe essere così, perché c’è il trucco :-). Come ho scritto su, è vero che ogni computer collegato ad Internet riceve un indirizzo univoco, ma solo se questo è collegato direttamente alla Rete. Molto spesso invece un computer si trova dietro ad un router, come nei sistemi casalinghi, o addirittura all’interno di una LAN più o meno complessa e comunque sempre dietro ad un router e/o firewall, come nei sistemi aziendali dove i pc sono molti. Dunque, esistono due tipi di indirizzi IP: pubblici e privati. La figura mostra un esempio tipico di connessione, dove i singoli computer (PC1, PC2, PC2) sono collegati ad Internet attraverso un router. E’ possibile osservare che ogni computer ha assegnato un indirizzo IP privato, e poi tutti sono collegati allo stesso router (passando per un hub/switch) che funge da punto di contatto tra i pc e Internet. A questo punto è naturale pensare che al router venga assegnato un indirizzo IP pubblico, essendo l’unico punto visibile dalla Rete.

topologia_rete

Topologia di una rete

Più in generale, qualora un computer o un qualunque device venga collegato direttamente ad Internet (come utilizzando un modem, e non un router) avrà un indirizzo pubblico, altrimenti se è posto dietro ad un router/firewall avrà un IP privato. I motivi per cui viene assegnato un IP diverso ai computer che si trovano dietro ad un router sono molteplici:

  • utilizzando un router è possibile collegare ad Internet un elevato numero di computer o in più in generale dispositivi, altrimenti per ognuno servirebbe un modem diverso. Inoltre il numero di dispositivi collegati ad Internet sta aumentando sempre più, e poiché il numero totale dei possibili indirizzi IP è limitato (ricordate la struttura X.X.X.X, con numero massimo 255 per ogni X), un po’ come le targhe delle macchine, ai computer dietro ad un router vengono assegnati degli indirizzi privati, ossia non visibili da Internet. Ciò significa che due computer diversi, che si trovano dietro a router diversi, possono avere lo stesso indirizzo IP privato;
  • i computer collegati ad Internet attraverso un router risultano più protetti, in quanto solo il router risulterà visibile sul web, ma non i computer dietro ad esso e con gli indirizzi privati.

Un’altra precisazione, se non sapete la differenza tra modem e router ve la spiego subito :-). Il modem (contrazione di modulator-demodulator) è un dispositivo che traduce i dati inviati da un solo computer in modo tale da trasmetterli sulla Rete, quindi un dispositivo un po’ stupido che esegue solamente questo compito. Quindi se avete 10 computer da collegare ad Internet avreste di bisogno di 10 modem. Un router invece è una sorta di “mini-computer”, che non solamente trasmette i dati a/da Internet, ma che ha in genere molte funzionalità, tipo quella di firewall (per la protezione dalle intrusioni esterne), e la possibilità di collegare ad esso più computer. Quindi con un router è possibile collegare ad Internet un numero elevatissimo di dispositivi, ovviamente in base al tipo e qualità del router. Per maggiori approfondimenti (oltre alla consueta wikipedia):

Matteo

[GNU/Linux] 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à simili a ifconfig e route. Vediamo in dettaglio cosa permettono di fare ifconfig e route.

Internet

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

Matteo