Si trovano su amazon, ebay, ecc... adattatori in grado di trasformare in wifi i dispositivi (decoder, consolle, ...) che fisicamente dispongono di sola porta ethernet.
Io ho usato il mio Raspberry Pi 2 con installato Raspbian Jessie con un adattatore wifi che già possedevo. Il primo passo è assicurarsi che l'adattatore wifi venga riconosciuto e che il Raspberry sia in grado di connettersi alla vostra rete wifi.
Nel mio caso l'access point wifi si trova sull'indirizzo 192.168.1.1
Trasformeremo il Raspberry in un router che fa da bridge wifi-ethernet con integrato server dhcp.
Bridge wifi to ethernet
1) assegniamo ip statico all'interfaccia ethernet editando il file di configurazione:
sudo nano /etc/network/interfaces
e inseriamo
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
Per il prossimo passo ho optato per dnsmasq che è semplice e volce da configurare e leggero.
2) Installiamo il server dhcp:
sudo apt-get install dnsmasq
e lo configuriamo editando il file /etc/dnsmasq.conf
sudo nano /etc/dnsmasq.conf
e inseriamo
interface=eth0 # usiamo interfaccia eth0
listen-address=192.168.0.1 # specifichiamo l'indirizzo sui cui servire le connessioni in entrata
bind-interfaces # facciamo il bind per essere sicuri di non mandare cose da altre parti
server=8.8.8.8 # inoltra richieste DNS a Google
domain-needed # non inoltrare nomi brevi
bogus-priv # non inoltrare indirizzi nello spazio indirizzi per i quali non esiste una route
dhcp-range=192.168.0.2,192.168.0.99,72h # assegna indirzzi ip con un lease time di 72 ore
3) editiamo il file di configurazione /etc/sysctl.conf e abilitiamo il forward ipv4
sudo nano /etc/sysctl.conf
e inseriamo/decommentiamo la riga
net.ipv4.ip_forward=1
per permettere al sistema di diventare un router.
4) configuriamo il kernel al fine di far passare i pacchetti, mettiamo i comandi nel file /etc/rc.local in modo che la configurazione viene attivata ad ogni boot:
sudo nano /etc/rc.local
e inseriamo
iptables -F # svuota regole sulle catene
iptables -P INPUT ACCEPT # accettiamo tutto il traffico in entrata
iptables -P OUTPUT ACCEPT #accettiamo tutto il traffico in uscita
iptables -P FORWARD ACCEPT # permettiamo l'inoltro richieste tra le interfacce di rete
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE # mascheriamo le richieste che devono andare su internet attraverso il nat
Riavviamo e colleghiamo il cavo di rete tra il Raspberry e un dispositivo con porta ethernet. Se tutto è andato bene adesso il vostro dispositivo è collegato a internet tramite wifi. Si può collegare in cascata al Raspberry uno switch in modo da poter collegare più di un dispositivo contemporaneamente.
Essendo a questo punto il Raspberry posizionato tra 2 reti, quindi raggiungibile senza ulteriori configurazioni sia dai dispositivi collegati all'access point che da i dispositivi ai quali sta fornendo accesso internet, possiamo utilizzarlo per fornire anche altri servizi come ad esempio un file server basato su samba.
Server samba
5) installiamo il server samba
sudo apt-get install samba
e lo configuriamo
sudo nano /etc/samba/smb.conf
inserendo una configurazione del tipo:
[global]
netbios name = RASPY
server string = RASPY
guest account = pi
workgroup = WORKGROUP
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
server role = standalone server
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
map to guest = Bad User
unix password sync = yes
[usb_shared]
path = /media/pi
guest ok = yes
writable = yes
browseable = yes
create mask = 0777
directory mask = 0777
questa configurazione rende disponibile a tutti la cartella /media/pi dove Raspbian ha montato automaticamente e per default l'harddisk usb che ho collegato.
Su altre disto debian based, ad esempio DietPI, bisogna cambiare la riga del guest account con:
guest account = root
Aggiornamento del 30/04/2020: a partire da Samba 4.11 i vecchi protocolli SMBv1 sono disabilitati di default, quindi per permettere ai vecchi client di trovare e collegarsi al server samba, bisogna aggiungere la seguente opzione nella sezione [global]:
server min protocol = LANMAN1
6) per montare automaticamente ad ogni avvio il disco usb precedentemente condiviso:
sudo apt-get install ntfs-3g
sudo mkdir /media/pi
sudo chown -R pi:pi /media/pi
ls -l /dev/disk/by-uuid/ <-- questo comando restituisce la lista dei dischi e dei loro UUID
sudo nano /etc/fstab
e inseriamo
UUID=xxxxxxxxxxxx /media/pi ntfs-3g auto,noatime,rw,uid=pi,gid=users 0 0
dove xxxxxxxxxxxx sarebbe il valore UUID relativo al disco che si vuole montare(solitamente il primo disco usb collegato è sda).
Passi opzionali
Se ad esempio si sta usando un harddisk tradizionale esterno (usb, ...) per la condivisione samba, allora si potrebbe pensare di spegnerlo quando non in uso.
Ipotizziamo che l'harddisk sia idnetificato con /dev/sdb, diamo un comando per far si che si spenga dopo 10 minuti di inutilizzo:
sudo hdparm -S 120 /dev/sdb
Su alcuni modelli di harddisk questo comando è sufficiente per rendere permanente il comando, su altri invece bisogna fare in modo che venga eseguito ad ogni avvio.
Esistono almeno 2 modi per rendere il comando permanente:
- /etc/hdparm.conf
- udev rule
hdparm.conf
Modificare il file /etc/hdparm.conf e aggiungere una linea del tipo:
/dev/sdb {
# apm 127: Highest performance that allows spindown
apm = 127
# spindown 120 = 10 min
spindown_time = 120
}
si può identificare il disco anche tramite un ID, in questo caso bisogna identificare il disco utilizzando un comando del tipo:
ls -l /dev/disk/by-id
oppure
udisksctl info -b /dev/sdb
...
Device: /dev/sdb
...
Symlinks: /dev/disk/by-id/ata-HGST_HTS545050A7E380_TEA51C49CAS5TR...
quindi possiamo usare nel file /etc/hdparm.conf una sintassi del tipo
/dev/disk/by-id/ata-HGST_HTS545050A7E380_TEA51C49CAS5TR {
apm = 127
spindown_time = 120
}
udev rule
Per rendere il comando permanente, si può usare udev rule:
/etc/udev/rules.d/69-hdparm.rules
ACTION=="add", SUBSYSTEM=="block", KERNEL=="sdb", RUN+="/sbin/hdparm -S 120 /dev/sdb"
Oppure applicare le impostatzioni a tutti gli harddisk tradizionali del sistema:
/etc/udev/rules.d/69-hdparm.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTRS{queue/rotational}=="1", RUN+="/sbin/hdparm -S 120 /dev/%k"
Siccome ad una periferica usb può venire assegnato in modo arbitrario il nome /dev/sdx, si può indetificare il disco in base al proprio seriale. Per ottenere l'id seriale possiamo usare il comando
udevadm info -n /dev/sdb
e poi col seriale che troviamo al tag ID_SERIAL_SHORT=
/etc/udev/rules.d/69-disk.rules
ACTION=="add", KERNEL=="sd[a-z]", ENV{ID_SERIAL_SHORT}=="XXXXXXXX", RUN+="/sbin/hdparm -S 120 /dev/%k"
Server DLNA
Perché no!?
sudo apt-get install minidlna
modificare configurazione e indicare il prcorso dei file multimediali:
sudo nano /etc/minidlna.conf
...