Old:Creare un Access Point con Debian

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca


Creare un Access Point con Debian
Banner e-zine.png
La prima e-zine italiana sul mondo Debian

Come trasformare una semplice Debian box in un access point wireless pienamente configurabile e personalizzabile.

In questo articolo esploreremo insieme tutti i passaggi necessari a realizzare un access point wireless basato sul nostro sistema operativo preferito: GNU/Linux Debian! Non si copriranno tutti gli aspetti che riguardano il raggiungimento di questo obiettivo (ci vorrebbe un libro intero!) ma si cercherà di fornire delle linee guida da seguire e una panoramica delle difficoltà che ci si troverà a dovere affrontare.

Tratto dalla e-zine di Debianizzati.org

Link agli articoli:



Introduzione

In questo articolo esploreremo insieme tutti i passaggi necessari a realizzare un access point wireless basato sul nostro sistema operativo preferito: GNU/Linux Debian! Non si copriranno tutti gli aspetti che riguardano il raggiungimento di questo obiettivo (ci vorrebbe un libro intero!) ma si cercherà di fornire delle linee guida da seguire e una panoramica delle difficoltà che ci si troverà a dovere affrontare.
La domanda potrebbe essere: perchè realizzare un access point software invece di acquistarne uno bello e pronto?
Risposta: e perchè no?
E' chiaro a tutti che acquistare un prodotto oggi molto comune sul mercato è ben più economico che "costruirsi" una custom-box; non ci sarebbe neanche bisogno di impiegare tempo ad effettuare settaggi e configurazioni.
Ci sono però, a mio avviso, due grandi motivazioni che possono spingerci ad affrontare un'avventura del genere. La prima è la flessibilità e la possibilità di personalizzazione: si vuole un firewall? Un proxy? Nat? Nessun problema. L'altra ragione (forse la più stimolante...) è che è divertente ed anche un ottimo modo per imparare dalle difficoltà che si incontreranno lungo il cammino.

Requisiti

Il computer utilizzato per questo progetto è un notebook (vecchiotto) Acer Travelmate 2300 con 512Mb Ram, CPU Celeron M a 1400MHz, sistema operativo, neanche a dirlo, una installazione minimale di Debian GNU/Linux Lenny (la stabile attuale) con kernel 2.6.26-2-686.
La connettività è garantita da una scheda ethernet, da una scheda wifi pcmcia Netgear Wpn511 gestita dai driver Madwifi (presenti nei repository di Lenny e installati con module-assistant) e da un router adsl Alice Gate 2+.

Purtroppo non tutte le schede wireless in commercio sono capaci di accettare connessioni ed autenticazioni così come richiede un access point.
Su sistemi GNU/Linux, ad oggi, solo pochi tipi di schede, ad esempio quelle gestite dai drivers iwlwifi (per chipset Intel) o da quelli madwifi (per chipset Atheros), sono capaci di assolvere a questo compito perchè riescono a supportare la modalità "Master".
Considerato che tali schede hanno costi davvero contenuti (che si possono aggirare sui 30-40 €) possiamo sostenere che, con una spesa minima, ci si può dotare di una periferica che può darci davvero grandi soddisfazioni.

Non è proponibile, in questo contesto, affrontare tutte le problematiche d'installazione e di configurazione delle varie tipologie di schede wifi e relativi driver disponibili.
Si assume quindi che il sistema operativo sia stato installato e che la scheda sia stata riconosciuta e configurata correttamente.
Tutti i comandi relativi sono propri delle schede funzionanti con driver madwifi.

Per controllare se sul chip della scheda wifi di cui disponiamo è possibile settare il "Master mode" si può impartire il comando:

# wlanconfig ath0 create wlandev wifi0 wlanmode master

che, in assenza di errori segnalati in ouput, imposterà la scheda ath0 in modalità master.
Lo stato della scheda è comunque visualizzabile con:

# iwconfig ath0

Per riportare la scheda alla condizione di partenza:

# wlanconfig ath0 destroy

(a volte, dopo quest'ultimo comando, la scheda "sparisce" dal pc; per riportarla in funzione basterà ricaricare il modulo che la gestisce: ath_pci).

Topologia della rete

Il nostro pc avrà (ovviamente) sistema operativo GNU/Linux Debian installato e, perlomeno, due schede di rete riconosciute e funzionanti, una wireless (ath0) ed una ethernet (eth0). La prima si incaricherà di accettare o rifiutare le connessioni da parte dei clients che provano l'autenticazione e, nel caso di autenticazione avvenuta, di trasmettere i pacchetti alla seconda (eth0) che li instraderà verso la rete esterna.
Per i pacchetti in entrata, ovviamente, sarà la stessa eth0 che li "passerà" ad ath0 la quale si incaricherà di inoltrarli a sua volta ai clients connessi alla rete lan.

La topologia della rete che si andrà a "prefigurare" risulterà così simile a questa:

Internet <----> [router] <----> (eth0=192.168.1.4)-Debian Ap-(athn0=10.0.0.1) <----> Lan

Come si può notare, le interfacce di rete di Debian Ap, staranno su due classi differenti e per questo (lo vedremo proseguendo) avremo bisogno di un "qualcosa" che permetta loro di "dialogare".

Software necessario

Prima di proseguire con la configurazione della rete, ci soffermeremo giusto un attimo sull'installazione di tutti quei pacchetti che ci permetteranno di affrontare i passaggi successivi di questo articolo:

# apt-get install wireless-tools hostapd hostap-utils bridge-utils dhcp3-server

dove:

  • wireless-tools: set di comandi per la gestione del wifi.
  • hostapd  : demone che si occuperà della crittografia per l'autenticazione.
  • bridge-utils  : tools per configurare il bridging dei pacchetti.
  • dhcp3-server  : server dhcp che si occuperà di assegnare gli ip ai clients autenticati.



Configurazione delle interfacce di rete

Prima di iniziare le varie configurazioni è consigliabile "spegnere" le schede di rete e azzerare eventuali regole di iptables:

# ifconfig eth0 0.0.0.0 down
# ifconfig ath0 0.0.0.0 down
# /sbin/iptables -F
# /sbin/iptables -X

Questo per poter lavorare su un sistema "incontaminato" da configurazioni o settaggi precedenti.

Fatto questo, passeremo alla modifica del file /etc/network/interfaces (il "gestore" delle interfacce di rete su sistemi Debian-based):

# ethernet settings
auto eth0
iface eth0 inet static
	address 192.168.1.4
	netmask 255.255.255.0
	broadcast 192.168.1.255
	gateway 192.168.1.1
	dns-nameservers 192.168.1.1

# wireless settings
auto ath0
iface ath0 inet static
	address 10.0.0.1
	netmask 255.255.255.0
	broadcast 10.0.0.255
	network 10.0.0.0
	pre-up modprobe -r ath_pci
	pre-up modprobe ath_pci autocreate=none
	pre-up wlanconfig ath create wlandev wifi0 wlanmode ap
	wireless-essid "debian-ap"
	wirelsess-rate 54Mb
	wireless txpower auto
	post-up /etc/init.d/hostapd start
	down /etc/init.d/hostapd stop
	post-down wlanconfig ath0 destroy
	post-down modprobe -r ath_pci
	post-down modprobe ath_pci

Le due schede di rete, come già detto, staranno su due network differenti: 192.168.1.0/24 e 10.0.0.0/24. La scheda eth0 avrà come gateway e server dns il router adsl (192.168.1.1) che farà "transitare" i pacchetti da e verso internet.

Le righe

pre-up modprobe -r ath_pci
pre-up modprobe ath_pci autocreate=none
pre-up wlanconfig ath create wlandev wifi0 wlanmode ap

setteranno la scheda wireless in modalità Master.
Le prime due sono necessarie per il tipo di chip utilizzato perchè quest'ultimo riesce a settarsi correttamente solo quando il modulo che lo gestisce viene caricato con l'opzione autocreate=none.
E' evidente che questo è un settaggio "particolare" relativo ad un chip ben preciso e che lo stesso non si applicherà ad altri modelli di schede.

Il passo successivo consiste nell'impostare il sistema affinchè i pacchetti possano passare da un'interfaccia di rete all'altra.
Questo può essere ottenuto in due modi: con il bridging o con il routing.

Modalità bridge

Per utilizzare il bridging abbiamo bisogno di installare le bridge-utils e di riconfigurare le interfacce di rete:

# apt-get install bridge-utils
# ifconfig ath0 down
# ifconfig eth0 down
# ifconfig ath0 0.0.0.0 up
# ifconfig eth0 0.0.0.0 up

Creiamo una interfaccia di bridge chiamata br0 e aggiungiamo a questa le due interfacce di rete:

# brctl addbr br0
# brctl addif br0 ath0
# brctl addif br0 eth0

infine accertiamoci che le impostazioni siano corrette:

# brctl show

e riavviamo hostapd:

# /etc/init.d/hostapd restart

Da notare che, per poter funzionare correttamente in modalità bridging, l'ip-forwarding deve essere impostato:

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

ma non dovrà esistere nessuna regola di masquerading di iptables.

Se mai questa esistesse, bisognerà rimuoverla:

# iptables -t nat -D POSTROUTING 1

Una volta configurata, sarà possibile attivare l'interfaccia di bridge virtuale br0 come una normale scheda di rete fisica sia assegnando un ip statico che dinamico via dhcp.

A questo punto si potranno collegare pc, hub, switch, etc. alla porta ethernet o a quella wifi e la "comunicazione" sarà garantita. Queste periferiche saranno in grado di "vedersi" e comunicare l'una con l'altra senza che ci sia bisogno di impostare gli indirizzi ip su classi differenti e senza dover impostare le regole di iptables.

Modalità router

Per il routing, invece, è necessario avere a che fare con le regole di netfilter per mezzo di iptables.

Autorizziamo l'interfaccia ath0 ad accettare nuove connessioni e istruiamola a forwardarle verso l'esterno attraverso l'interfaccia eth0:

# iptables -A FORWARD --in-interface ath0 --out-interface eth0 --source 192.168.1.0/255.255.255.0 -m state --state NEW -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
# iptables -A FORWARD -m state --state RELATED -j ACCEPT

Impostiamo il NAT per "mascherare" gli ip della lan:

# iptables -t nat -A POSTROUTING -j MASQUERADE

in questo modo i pacchetti in uscita sembreranno tutti provenienti dalla linux-box che sta eseguendo il routing.

Infine attiviamo il packet forwarding a livello kernel:

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

Questo setup farà passare il traffico dalla lan ad internet ma non si preoccuperà di configurare i parametri di rete nei computer della lan. In ognuno di essi sarà necessario impostare indirizzo ip, indirizzo del gateway, indirizzo del dns. Se si utilizza il nostro Debian AP come NAT gateway, questo potrà essere facilmente ottenuto usando il dhcp.

Le impostazioni di iptables e dell'ip_forward fin qui definite si perderebbero in caso di halt o reboot del sistema. E' quindi consigliabile inserirle in uno script apposito da avviarsi in automatico al boot dell'ap.

Si sottolinea che queste regole non si occupano di "proteggere" la rete, ma solo di permettere il routing dei pacchetti. E' utile, quindi, integrarle con regole adatte al "filtraggio" vero e proprio, per garantire la sicurezza all'interno del proprio network.
Come già detto, in questo articolo sarebbe stato impensabile affrontare in maniera approfondita ogni singolo aspetto della gestione di rete. Ritengo corretto però consigliare un approfondimento teorico volto all'implementazione di un firewall robusto e modulare per mezzo di uno strumento eccellente e flessibile come iptables.

Crittografia

Perchè il nostro access point possa stabilire una politica di sicurezza autorizzando l'autenticazione con chiave crittografica (wep, wpa, wpa2, radius) sarà necessario installare il pacchetto hostapd:

# apt-get install hostapd

e intervenire modificando alcune righe del suo file di configurazione /etc/hostapd/hostapd.conf:

interface=ath0
driver=madwifi
...
ssid=debian-ap
hw_mode=b
channel=7
...
macaddr_acl=0
auth_algs=3
ignore_broadcast_ssid=0
...
wpa=1
wpa_passphrase=wdebianizzati
wpa_key_mgmt=WPA-PSK

dove:

  • hw_mode = (hardware mode) può assumere i valori a / b / g.
  • channel = canale sul quale si vuole trasmettere.
  • macaddr_acl = autenticazione basata sul macaddress (0 accetta se non espressamente negato, 1 nega se non espressamente consentito, 2 utilizza server radius).
  • auth_algs = algoritmo di autenticazione (0 open system, 1 wep, 3 entrambi).
  • ignore_broadcast_ssid = 0 disabilitato, 1 ssid vuoto, 2 clear ssid.
  • wpa = 1 solo wpa, 2 wpa2, 3 entrambi.


Nello stesso file, inoltre, nel caso avessimo deciso di adottare la modalità di bridging, dovremmo decommentare la riga

bridge=br0

Decommentiamo inoltre, nel file /etc/default/hostapd, la riga

RUN_DAEMON="yes"


A questo punto possiamo riavviare la rete e di conseguenza, per come abbiamo impostato il file /etc/network/interfaces, anche il demone hostapd:

# /etc/init.d/networking start

e provare l'autenticazione da un qualsiasi pc munito di scheda wifi:

# wpa_passphrase debian-ap wdebianizzati > /etc/wpa_supplicant/wpa_supplicant-custom.conf
# wpa_supplicant -D wext -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant-custom.conf &

ovviamente a wlan0 sostituiremo il nome dell'interfaccia wireless del client.

Se non vengono restituiti errori, l'autenticazione è avvenuta con successo.

Filtri sulle connessioni

Per rendere più sicuro l'accesso all'acces point imposteremo un filtro sui mac address autorizzati a connettersi (previa autenticazione).
La regola che vogliamo impostare è che il nostro Debian Ap neghi la connessione a tutti i mac address che ne fanno richiesta meno quelli che si vogliono autorizzare.
In pratica, si stabilirà un insieme di mac address conosciuti ai quali permettere l'eventuale connessione. A tutti gli altri non facenti parte di questo insieme, la possibilità verrà negata.

Questo risultato può essere raggiunto percorrendo diverse strade (come d'altronde succede in ambiente linux): si possono impostare apposite regole di iptables, ci si può avvalere nuovamente di iwpriv, etc.
In questo caso si è scelto di far svolgere il lavoro al demone hostapd.

Creiamo due nuovi files:

# touch /etc/hostapd/hostapd.accept
# touch /etc/hostapd/hostapd.deny

Il primo conterrà una lista di mac address da "accettare", il secondo da "rifiutare". Il tutto si basa sul tipo di politica da voler adottare. Noi abbiamo scelto quella del: "nega a tutti meno che a quelli appartenenti ad un insieme stabilito".
Editiamo il file /etc/hostapd/hostapd.conf e sostituiamo alla riga:

macaddr_acl=0

la riga:

macaddr_acl=1

e inseriamo la riga (o decommentiamola se presente):

accept_mac_file=/etc/hostapd/hostapd.accept

In questo modo solo i mac address presenti in /etc/hostapd/hostapd.accept saranno autorizzati ad agganciarsi alla lan.

Ad esempio:

# echo "11:22:33:44:55:66" >> /etc/hostapd/hostapd.accept
# echo "99:88:77:66:55:44" >> /etc/hostapd/hostapd.accept
# /etc/init.d/hostapd restart

farà in modo che questi siano gli unici due mac address autorizzati ad entrare in rete.

Server dhcp

Come dhcp server utilizzeremo dhcp3-server avviato come demone sull'interfaccia wlan0, dato che sarà questa quella che i vari clients della lan interrogheranno per cercare autenticazione ed ottenere indirizzo ip.

Installato il server:

# apt-get install dhcp3-server

interverremo sul file /etc/init.d/dhcpd impostando al suo interno:

INTERFACES=ath0

Nel file di configurazione /etc/dhcp3/dhcpd.conf setteremo invece le direttive riguardanti il lease time (tempo di attesa) e il range di indirizzi ip da assegnare, nonchè le indicazioni riguardanti i dns:

subnet 10.0.0.0 netmask 255.255.255.0 {
	range 10.0.0.2 10.0.0.254;
	option broadcast-address 10.0.0.255;
	option routers 10.0.0.1;
	option domain-name-servers 208.67.222.222, 208.67.220.220;
}

In questo esempio come server di dominio sono stati impostati gli indirizzi di opendns, ma ovviamente possono essere sostituiti da quelli di eventuali dns interni alla lan.

Per applicare le modifiche, come sempre, dovremo riavviare il servizio:

# /etc/init.d/dhcp3-server restart


Considerazioni finali

La configurazione del nostro Debian-Ap è terminata. Abbiamo visto come sia relativamente semplice, disponendo di hardware comune (anche datato) e di scheda wifi compatibile con la modalità master, realizzare "via software" un access point in piena regola da poter utilizzare nella nostra lan.
E' chiaro che il tutto si presta a personalizzazioni e miglioramenti infiniti.
Dal settare un proxy per le autenticazioni e il filtro dei contenuti, alla definizione di regole firewall ben più articolate e complete, etc. ci si può davvero sbizzarrire e dar fondo alla nostra creatività e capacità tecnica...
Il tutto, ovviamente, sempre e solo con strumenti liberi ed in pieno spirito open source!

Happy surfing & happy Debian!


pmate 12:12, 16 feb 2010 (CET)