Mi serve un AP in casa? #5
Illustro la soluzione che ho sperimentato al problema della cheda wireless che non funziona in modalità promiscua. Se non ricordate o vi siete persi i post precedenti vi invito a rileggerli (n. 1 2 3 4).
La soluzione è piuttosto specifica per la mia situazione e non va bene per realizzare un bridge in generale fra una lan via cavo e una cella wireless.
Il problema che devo risolvere è di far raggiungere agli host wireless il modem router sulla lan via cavo. Il server-bridge che ho realizzato non riesce ad operare in quanto la sua scheda wi-fi non cattura il traffico wireless non destinato esplicitamente a se.
Visto che sul lato via cavo è presente una sola macchina (il router), ho pensato di realizzare un NAT degli indirizzi MAC. Quando una macchina sul lato wireless manda una richiesta ARP per ottenere il MAC address del router, il server-bridge la intercetta e risponde con il MAC address della propria interfaccia WiFi. In questo modo gli host wireless, senza saperlo, invieranno il traffico per il firewall al server-bridge.
Il server-bridge dovrà avere delle altre regole per fare in modo di inoltrare al router i pacchetti ip che gli arrivano ma i cui indirizzi ip di destinazione non gli appartengono.
Per realizzare tutto questo ho utilizzato ebtables, l’equivalente di iptables che lavora a livello 2 anziché a livello 3.
Ecco le regole che ho usato:
IF_RINT_WLANMAC=00:01:23:45:67:89
#Nome dell’interfaccia wifi del server-bridge
IF_RINT_WLANIF=eth1
#rete locale
IF_RINT_BRIDGENET=192.168.1.0/24
#Indirizzo IP del router
IF_GATEWAY=192.168.1.254
#Indirizzo MAC del router
IF_RINT_GWMAC=00:E1:F2:3E:C0:87
# intercetta le richieste ARP per il router provenienti dalla rete wireless e risponde con il proprio MAC
ebtables -t nat -A PREROUTING -i $IF_RINT_WLANIF -p arp –arp-opcode Request –arp-ip-dst $IF_GATEWAY -j arpreply –arpreply-mac $IF_RINT_WLANMAC
# Cambia il MAC address mittente con il proprio ai pacchetti in transito che provengono dal router
ebtables -t nat -A POSTROUTING -p ip –ip-src $IF_GATEWAY -j snat –to-source $IF_RINT_WLANMAC
# Blocca il traffico ARP fra le due parti del bridge
ebtables -A FORWARD -p arp –arp-ip-src $IF_GATEWAY -j DROP
# Se il frame Ethernet è destinato a se ma l’ip di destinazione non è della rete locale o è quello del router, il pacchetto viene rispedito all’indirizzo MAC del router.
ebtables -t nat -A PREROUTING -d $IF_RINT_WLANMAC -p ip –ip-destination ! $IF_RINT_BRIDGENET -j dnat –to-destination $IF_RINT_GWMAC
ebtables -t nat -A PREROUTING -d $IF_RINT_WLANMAC -p ip –ip-destination $IF_GATEWAY -j dnat –to-destination $IF_RINT_GWMAC
Come si intuisce questo meccanismo non può essere generico perché bisogna scrivere esplicitamente delle regole per ogni macchina presente sulla LAN via cavo. Di buono questa soluzione ha che può essere implementata anche con la più schifosa delle schede wifi purché funzioni con linux.