Condivisione della connessione WiFi del Pi tramite la porta Ethernet


28

Ho un pi che esegue l'ultima versione di raspbian ed è collegato a Internet tramite un dongle USB wireless. Quello che vorrei fare è condividere la connessione wifi del pi in modo che qualsiasi computer collegato al pi usando un cavo LAN sia in grado di ricevere Internet. Ho dato un'occhiata a Internet ma non riesco a trovare nulla di rilevante. Ho familiarità con questo processo su Windows e Mac OS X, ma farlo sul pi mi ha appena lasciato perplesso.

EDIT: Non so se questo aiuta qualcuno ma sono connesso a Internet sul mio pi via wlan0, ma vorrei condividere quella connessione Internet via eth0.


Collegare le connessioni WiFi ed Ethernet sul Pi e collegarlo a un router sarebbe più semplice. Questo è possibile per la tua applicazione?
tlhIngan

Sfortunatamente @tlhIngan, vedi che non ho accesso a nessuna presa Ethernet e che devo avviare il mio laptop da PXE, che deve essere fatto da Ethernet. Voglio anche saperne di più su Linux e ho pensato che la costruzione di questo progetto mi avrebbe dato un po 'più di fiducia con Linux. Ho pensato che sarebbe stata una soluzione più semplice dato che il mio router è in tutta la mia casa: / Comunque, grazie per la tua risposta.

Ho trovato questo video tutorial esattamente quello che ti serve: youtu.be/IAa4tI4JrgI Il Raspberry PI condivide Internet che ottiene dalla porta wifi alla porta Ethernet.
Mia19,

@tlhIngan - Puoi elaborare? La creazione di un bridge richiederebbe anche un router? Voglio che il mio ricevitore audio di rete condivida il mio WiFi WiFi su Ethernet e si trovi sulla stessa sottorete e DHCP del mio router principale.
square_eyes,

Risposte:


40

Per Raspbian Jessie

Da questo documento :

Useremo il dnsmasqpacchetto per questo scopo perché è un server DHCP e DNS combinato e anche facile da configurare.

Se volete qualcosa di un po 'più 'pesante', è possibile utilizzare la isc-dhcp-servere bind9pacchetti per DHCP e DNS, rispettivamente, ma per i nostri scopi, dnsmasqfunziona bene.

sudo apt-get install dnsmasq

Dobbiamo configurare le interfacce. Assegneremo un indirizzo IP statico a eth0cui verrà utilizzato come gateway. Apri il file delle interfacce

sudo nano /etc/network/interfaces

Modifica la eth0sezione in questo modo:

allow-hotplug eth0  
iface eth0 inet static  
    address 192.168.2.1
    netmask 255.255.255.0
    network 192.168.2.0
    broadcast 192.168.2.255

Successivamente, configureremo dnsmasq. Il dnsmasqfile di configurazione fornito contiene molte informazioni su come usarlo. Quindi, consiglierò di spostarlo e crearne uno nuovo.

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig  
sudo nano /etc/dnsmasq.conf

Incolla quanto segue nel nuovo file

interface=eth0      # Use interface eth0  
listen-address=192.168.2.1 # listen on  
# Bind to the interface to make sure we aren't sending things 
# elsewhere  
bind-interfaces
server=8.8.8.8       # Forward DNS requests to Google DNS  
domain-needed        # Don't forward short names  
# Never forward addresses in the non-routed address spaces.
bogus-priv
# Assign IP addresses between 192.168.2.2 and 192.168.2.100 with a
# 12 hour lease time
dhcp-range=192.168.2.2,192.168.2.100,12h 

Modifica il /etc/sysctl.conffile per abilitare l'inoltro di pacchetti

sudo nano /etc/sysctl.conf

Rimuovi #dall'inizio della riga contenente net.ipv4.ip_forward=1Ciò consentirà l'inoltro di pacchetti al successivo riavvio. Ma se vuoi provarlo subito senza riavviare, fallo.

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

Dobbiamo anche condividere la connessione Internet di RPi con i dispositivi collegati tramite Wi-Fi. Configureremo un NAT tra eth0e wlan0:

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT  

Tuttavia, abbiamo bisogno di applicare queste regole ogni volta che riavviamo Pi, quindi esegui sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" per salvare le regole nel file /etc/iptables.ipv4.nat. Ora dobbiamo eseguirlo dopo ogni riavvio, quindi apri il /etc/rc.localfile con sudo nano /etc/rc.locale appena sopra la linea exit 0, aggiungi la seguente riga:

iptables-restore < /etc/iptables.ipv4.nat  

E questo è tutto! Ora riavvia il tuo RPi e sarai in grado di accedere a Internet

sudo reboot

Aggiornato per Raspbian Stretch

La configurazione precedente non funzionerà nella versione più recente di Raspbian. Quindi, ho creato una sceneggiatura per questo che lo rende possibile con meno dolore.

Collegati alla rete WiFi usando questa guida.

Scarica lo script da qui . Posizionalo a/home/pi/

Apri il /home/pi/.config/lxsession/LXDE-pi/autostartfile

nano /home/pi/.config/lxsession/LXDE-pi/autostart

Aggiungi l'ultima riga:

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@point-rpi
sudo bash /home/pi/wifi-to-eth-route.sh

Assicurati di aver fornito il percorso completo del file. E hai finito. Ora riavvia per vedere le modifiche

sudo reboot

1
Grazie mille. Ho appena provato questo sul mio pi e la connessione andava bene! Ancora grazie per il tuo tempo. Lo apprezzo.

1
Questo è eccellente per condividere la connessione Internet con un dispositivo wireless. Tuttavia, voglio accedere al dispositivo da un altro laptop nella mia rete e questo non funziona. Immagino sia perché sono in diverse sottoreti? Qualche consiglio per aggirarlo?
Björn Andersson,

1
Ha funzionato perfettamente, anche se con Raspbian Stretch, ho dovuto includere manualmente la configurazione WiFi in / etc / network / interfaces
xfx

1
@xfx, potresti mostrare il codice che hai aggiunto per la configurazione WiFi?
karl71,

1
Ho seguito attentamente il tuo post e il link. Il mio Pi (appena fatto una nuova installazione del sistema operativo), ogni volta che aggiungo la parola "statica", non è nemmeno in grado di connettersi al wifi ...
Karl71,

6

Essendo il tuo scopo fornire accesso a Internet ai tuoi dispositivi LAN, supponiamo che il doppio "NAT" non sarà un grosso problema.
Con questa configurazione fornirai l'accesso wireless a dispositivi non WiFi che beneficeranno dell'accesso a Internet.
disegno

necessario

Assicurati che il tuo Wi-Fi sia correttamente configurato e funzionante. se qualcosa va storto l'accesso al dispositivo eth0sarà limitato o inesistente.

Impostare

Abbiamo bisogno di un paio di pacchetti per iniziare:

apt-get update
apt-get install network-manager isc-dhcp-server

interfacce

modifica il file /etc/network/interfacesin modo che corrisponda a quanto segue, questo imposterà il tuo eth0 un indirizzo IP fisso (10.10.10.1) e verrà ricreato resolv.conf.

auto lo
iface lo inet loopback

iface default inet dhcp

allow-hotplug eth0
iface eth0 inet static
  address 10.10.10.1
  network 10.10.10.0
  netmask 255.255.255.0
  broadcast 10.10.10.255
  gateway 10.10.10.1

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
  up cat /etc/resolv.conf | sed 's/ver /ver 127.0.0.1,/g' > /etc/resolv_local.conf
  up cat /etc/resolv.conf | sed 's/ver /ver 127.0.0.1,/g' > /etc/resolv.conf

DHCP

Modifica la dhcpconfigurazione predefinita per renderla autorevole e aggiungere la rete LAN (10.10.10. *), Modificare il file /etc/dhcp/dhcpd.conf, aggiungere il seguente contenuto:

# configuration for the bridge internal subnet.
subnet 10.10.10.0 netmask 255.255.255.0 {
  range 10.10.10.101 10.10.10.119;
  option domain-name-servers 8.8.8.8;
  option domain-name "domain.local";
  option routers 10.10.1.1;
  default-lease-time 600;
  max-lease-time 7200;
}

IPTABLES

Ora crea il seguente script per configurare e avviare la rete ad ogni riavvio. Lo script creerà dinamicamente alcune regole "IPTABLES". Nominalo /root/bridge.sh:

#!/bin/bash
LOCAL_IFACE=eth0
INET_IFACE=wlan0

# this is where the dhcp info comes in. We need the default gateway
# /var/lib/dhcp/dhclient.wlan0.leases
f=/var/lib/dhcp/dhclient.$INET_IFACE.leases
GATEWAY=$(cat $f| grep "option route" | tail -1 |awk '{print $3}'| sed 's/;//')

IPT=$(which iptables)
# get the wlan address
INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$

# Flush the tables
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -t nat -F

$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT

# Allow forwarding packets:
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# Packet masquerading
$IPT -t nat -A POSTROUTING -o $INET_IFACE  -j SNAT --to-source $INET_ADDRESS
$IPT -t nat -A POSTROUTING -o $LOCAL_IFACE -j MASQUERADE

# save the created tables 
iptables-save > /etc/network/iptables

#cat /proc/sys/net/ipv4/ip_forward
# make sure we are forwarding packets
echo "1" > /proc/sys/net/ipv4/ip_forward
sysctl --system > /dev/nul

#remove the default route, usually on eth0 interface
route del default
#ifdown $INET_IFACE  && ifup $INET_IFACE
#ensure is $INET_IFACE now...
route add default gw $GATEWAY $INET_IFACE
gw=$(route -n -A inet | grep '^0.0.0.0' |awk '{ print $2 }')
echo "default route is now " $gw

Finalmente

Infine, è necessario eseguire lo script ad ogni riavvio, aggiungere le seguenti due righe prima exit 0del file `/etc/rc.local 'per eseguire lo script creato in precedenza.

# will run the bridge on startup
sudo ./root/bridge.sh

Ora riavvia il dispositivo e il bridge funzionerà per te.

pd: è sudostato omesso per brevità. Utilizzare sudo -iEper avere una sessione comeroot


Wow! Grazie mille per una risposta così dettagliata! Non ho mai capito che sarebbe stato così complicato, ma penso di poterlo affrontare. Ancora grazie, lo proverò tra un paio d'ore e se funziona ti segnerò come risposta. Grazie mille

@GrowlingSolid Non dovrebbe essere così complicato. La risposta ti consente network-managerdi gestire le reti, incompatibili con dhcpcd, che è l'impostazione predefinita per Raspbian. Non c'è niente di sbagliato nell'utilizzo di un gestore alternativo, ma è necessario disabilitare dhcpcd(la risposta lo fa indirettamente poiché dhcpsi dhcpcdfermerà). Impedirà inoltre il funzionamento del supporto WiFi nella GUI.
Milliways,

1
Mi sono informato e sono arrivato a questa linea corretta invece della tua: La INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')tua versione "falsa" era:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.