Fast connection sharing

recentemente ho avuto la necessità di condividere una connessione 3g con 9 tra pc e mac avendo solamente il mio portatile e una chiavetta umts. Data la mia ignoranza ho dovuto smanettare per un paio di giorni, ma alla fine sono arrivato ad una conclusione decente della quale vorrei rendervi partecipi. Ovviamente, questo metodo è adattabile per qualsiasi tipo condivisione, sul quale farò una guida un poco più generale. Nella pratica i passaggi che ho seguito sono essenzialmente 3:

  1. connettersi alla linea 3g:

  2. preparare la scheda wireless alla condivisione;

  3. preparare l'OS a condividere la connessione;

Prima di tutto è necessario connettersi con un'interfaccia ad internet; per far ciò io ho utilizzato una

chiavetta 3g, e con l'ausilio di wvdial (qui il README)ho allacciato una connessione ppp0 (point-to-point) al mio provider. Per l'utilizzo di wvdial è necessario settare i parametri specifici per ogni provider; fortunatamente ho trovato questa pagina dove si possono trovare le configurazioni per le principali compagnie italiane.

Fatto ciò si può passare alla messa a punto della scheda di rete che servirà a condividere la connessione con altri dispositivi.

La scheda può essere di qualsiasi tipo, anche virtuale, ma nel mio caso avevo necessità di connettere 9 pc in una stanza, quindi ho usato la mia scheda wi-fi.

Per prima cosa bisogna attivare l'interfaccia e assegnare un indirizzo e una maschera di rete; in secondo luogo va messa in ad-hoc mode (sarebbe stato meglio in master mode, ma non tutte le schede lo supportano) e selezionare un essid per la connessione; in fine mettere una protezione: quest'ultimo passo è facoltativo perché l'unica protezione possibile via iwconfig è di tipo wep, tra l'altro non compatibile con tutti i sistemi, infatti io ho optato per una soluzione di filtraggio di indirizzi mac via iptables.

# Put the interface in Ad-hoc mode
iwconfig wlan0 mode Ad-Hoc

# Set the essid for the access point
iwconfig wlan0 essid "_youressid_"

# Set auto channel
iwconfig wlan0 channel auto

# Set the security (WEP)

# Set Key
iwconfig wlan0 key restricted s:"_yourpassword_"

# Set encryption
iwconfig wlan0 key on

ifconfig wlan0 "_chosenip_"/24 netmask 255.255.255.0 up

Ovviamente dovete sostituire a wlan0 il nome della vostra interfaccia, e scegliere essid, password e indirizzo ip per l'interfaccia.

Un passaggio opzionale è quello di gestire i clients con un server DHCP, usando dnsmasq:

/usr/bin/dnsmasq -C /dev/null \
--domain-needed \
--bogus-priv \
--interface=wlan0 \
--dhcp-option=6,8.8.8.8,8.8.4.4 \
--listen-address="_chosenip_" \
--dhcp-range="_chosenrange_",12h

Potete passare questo codice in uno script ed eseguirlo; da notare che in listen-address è necessario mettere lo stesso indirizzo usato in precedenza, mentre in dhcp-range bisogna semplicemente scegliere il numero e l'intervallo di indirizzi da assegnare tramite dhcp (per esempio 192.168.1.2,192.168.1.254).

Ora che avete una connessione attiva ed un'interfaccia correttamente settata per fare da access point, non vi resta che organizzare l'OS in maniera da condividere la connessione:

per prima cosa bisogna impostare il kernel in maniera da forwardare il traffico con questo comando:

 sysctl -w net.ipv4.ip_forward=1

Dove 1 sta per attivo e 0 per inibito. In secondo luogo bisogna utilizzare iptables per forwardare un'interfaccia verso l'altra, e per creare una nat sull'interfaccia connessa ad internet. In questo caso consideriamo ppp0 l'interfaccia connessa ad internet mentre wlan0 quella che farà da access point:

sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

sudo iptables -A FORWARD -i wlan0 -j ACCEPT

per correttezza, qua è segnata una policy ACCEPT all, mentre sarebbe molto meglio, come ho anch'io fatto, impostare una policy per accettare uno ad uno i pc tramite indirizzo mac, e successivamente una policy DROP all per le rimanenti connessioni:

sudo iptables -A FORWARD -i wlan0 -m mac --mac-source "_macaddresstoaccept_" -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -j DROP

Ricordatevi che è importante inserire prima i filtri agli indirizzi mac, e poi la policy deny, se no iptables bloccherà tutto prima ancora di leggere quali indirizzi accettare.

Sinceramente, ho collezionato un paio di scripts trovati in rete (sfortunatamente non ho recuperato tutte le fonti) e le ho modificate per le mie necessità, quindi vi posto lo script che, tra l'altro, spero di sviluppare per rendere un poco più carino e utile.

Qui il link, (alla riga 61 c'è un riferimento ad impostazioni iptables salvate con anche una lista di mac address) non dimenticate di renderlo eseguibile e di lanciarlo con privilegi di root.

Fatemi sapere se lo trovate utile, e soprattutto se avete qualche suggerimento per migliorarlo. P.S.

Ammetto che la limitazione di una protezione wep o mac filtering è molto limitante, ma lo script è per uno sharing volante; cercherò di implementare l'uso di protezione wpa, o più semplicemente farò un tutorial per l'uso di hostapd che implementa già moltissime features.