Raspberry come bridge wifi to ethernet e file server samba

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
passdb backend = tdbsam
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
pam password change = yes
map to guest = Bad User
obey pam restrictions = yes
unix password sync = yes
usershare allow guests = yes
[usb_shared]
path = /media/pi
guest ok = yes
writable = yes
browseable = yes
create mask = 0777
directory mask = 0777
valid users= utente, user, sante, ziosante, pi, guest, root, nobody

[homes]
comment = Home Directories
browseable = no
read only = yes
create mask = 0700
directory mask = 0700
valid users = %S

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/
sudo nano /etc/fstab
UUID=xxxxxxxxxxxx /media/pi ntfs-3g auto,noatime,users,rw,uid=pi,gid=pi 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:

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 comnado permanente:

  1. /etc/hdparm.conf
  2. 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:

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"