Partager la connexion WiFi du Pi via le port Ethernet

28

J'ai un pi exécutant la dernière version de raspbian et il est connecté à Internet à l'aide d'un dongle USB sans fil. Ce que je voudrais faire, c'est partager la connexion wifi du pi afin que tout ordinateur connecté au pi à l'aide d'un câble LAN puisse recevoir Internet. J'ai jeté un coup d'œil sur Internet mais je ne trouve rien de pertinent. Je connais ce processus sur Windows et Mac OS X, mais cela sur le pi vient de me faire perplexe.

EDIT: Je ne sais pas si cela aide quelqu'un, mais je suis connecté à Internet sur mon pi via wlan0, mais je voudrais partager cette connexion Internet via eth0.

MasterScrat
la source
Ponter vos connexions WiFi et Ethernet sur le Pi et le brancher sur un routeur serait plus simple. Est-ce possible pour votre application?
tlhIngan
@tlhIngan malheureusement pas, vous voyez que je n'ai accès à aucune prise Ethernet et j'ai besoin de démarrer mon ordinateur portable à partir de PXE, ce qui doit être fait par Ethernet. Je veux aussi en savoir plus sur Linux, et je pensais que la construction de ce projet me donnerait un peu plus de confiance avec Linux. Je pensais que ce serait une solution plus facile car mon routeur est partout dans ma maison: / Quoi qu'il en soit, merci pour votre réponse.
J'ai trouvé ce tutoriel vidéo exactement ce dont vous avez besoin: youtu.be/IAa4tI4JrgI Le Raspberry PI partage Internet, il passe du wifi au port Ethernet.
Mia19
@tlhIngan - Pouvez-vous élaborer? La création d'un pont nécessiterait-elle également un routeur? Je veux que mon récepteur audio réseau partage mon WiFi Pis sur Ethernet et soit sur le même sous-réseau et DHCP que mon routeur principal.
square_eyes

Réponses:

40

Pour Raspbian Jessie

De ce document :

Nous utiliserons le dnsmasqpackage à cet effet car il est un serveur DHCP et DNS combiné et également facile à configurer.

Si vous voulez quelque chose d'un peu plus «lourd», vous pouvez utiliser les packages isc-dhcp-serveret bind9pour DHCP et DNS respectivement, mais pour nos besoins, cela dnsmasqfonctionne très bien.

sudo apt-get install dnsmasq

Nous devons configurer des interfaces. Nous allons attribuer une adresse IP statique à eth0laquelle sera utilisée comme passerelle. Ouvrez le fichier d'interface

sudo nano /etc/network/interfaces

Modifiez la eth0section comme ceci:

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

Ensuite, nous allons configurer dnsmasq. Le dnsmasqfichier de configuration livré contient de nombreuses informations sur son utilisation. Je conseillerai donc de le déplacer et d'en créer un nouveau.

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

Collez ce qui suit dans le nouveau fichier

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 

Modifiez le /etc/sysctl.conffichier pour activer le transfert de paquets

sudo nano /etc/sysctl.conf

Supprimez le #du début de la ligne contenant net.ipv4.ip_forward=1Cela permettra le transfert de paquets au prochain redémarrage. Mais si vous voulez l'essayer maintenant sans redémarrer, faites-le.

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

Nous devons également partager la connexion Internet de RPi avec les appareils connectés via Wi-Fi. Nous allons configurer un NAT entre eth0et 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  

Cependant, nous avons besoin que ces règles soient appliquées à chaque redémarrage du Pi, alors exécutez sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" pour enregistrer les règles dans le fichier /etc/iptables.ipv4.nat. Maintenant, nous devons l'exécuter après chaque redémarrage, alors ouvrez le /etc/rc.localfichier avec sudo nano /etc/rc.localet juste au-dessus de la ligne exit 0, ajoutez la ligne suivante:

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

Et c'est tout! Redémarrez maintenant votre RPi et vous pourrez accéder à Internet

sudo reboot

Mis à jour pour Raspbian Stretch

La configuration ci-dessus ne fonctionnera pas dans la nouvelle version de Raspbian. J'ai donc créé un script pour cela qui le rend possible en moins de douleur.

Connectez-vous au réseau WiFi à l'aide de ce guide.

Téléchargez le script ici . Placez-le à/home/pi/

Ouvrir un /home/pi/.config/lxsession/LXDE-pi/autostartfichier

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

Ajoutez la dernière ligne:

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

Assurez-vous que vous avez indiqué le chemin d'accès complet au fichier. Et tu as fini. Redémarrez maintenant pour voir les changements

sudo reboot
Arpit Agarwal
la source
1
Merci beaucoup. Je viens de tester cela sur mon pi et la connexion était bonne! Merci encore pour votre temps. Je vous en suis reconnaissant.
1
C'est excellent pour partager une connexion Internet avec un appareil sans fil. Cependant, je veux accéder à l'appareil à partir d'un autre ordinateur portable de mon réseau et cela ne fonctionne pas. Je suppose que c'est parce qu'ils sont dans différents sous-réseaux? Une astuce pour le contourner?
Björn Andersson
1
Cela fonctionnait parfaitement, bien que sous Raspbian Stretch, j'ai dû inclure manuellement la configuration WiFi dans / etc / network / interfaces
xfx
1
@xfx, pourriez-vous s'il vous plaît montrer le code que vous avez ajouté pour la configuration WiFi?
karl71
1
J'ai suivi attentivement votre message et le lien. Mon Pi (vient de faire une nouvelle installation du système d'exploitation), chaque fois que j'ajoute le mot "statique", il n'est même pas capable de se connecter au wifi ...
karl71
6

Étant votre objectif, fournir un accès Internet à vos périphériques LAN, supposera que le double «NAT» ne sera pas un gros problème.
Avec cette configuration, vous fournirez un accès sans fil à des appareils non WiFi qui bénéficieront d'un accès Internet.
dessin

Prérequis

Assurez-vous que votre Wi-Fi est correctement configuré et fonctionne. en cas de problème, votre accès à l'appareil eth0sera limité ou inexistant.

Installer

Nous avons besoin de quelques packages pour commencer:

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

Interfaces

éditez le fichier /etc/network/interfacespour qu'il corresponde à ce qui suit, cela définira votre eth0 une adresse IP fixe (10.10.10.1) et recréera 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

Modifiez la dhcpconfiguration par défaut pour lui faire autorité et ajoutez le réseau LAN (10.10.10. *), Modifiez le fichier /etc/dhcp/dhcpd.conf, ajoutez le contenu suivant:

# 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

Créez maintenant le script suivant pour configurer et démarrer le réseau à chaque redémarrage. Le script créera dynamiquement quelques règles «IPTABLES». Nommez-le /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

finalement

Enfin, vous devez exécuter le script à chaque redémarrage, ajoutez les deux lignes suivantes avant le exit 0sur le fichier `/etc/rc.local 'pour exécuter le script créé auparavant.

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

Maintenant, redémarrez simplement votre appareil et le pont fonctionnera pour vous.

pd: a sudoété omis par souci de concision. Utilisez sudo -iEpour avoir une session en tant queroot

fcm
la source
Hou la la! Merci beaucoup pour une réponse aussi détaillée! Je n'avais jamais réalisé que ce serait si compliqué, mais je pense que je peux y faire face. Encore merci, je vais l'essayer dans quelques heures et si cela fonctionne, je vous marquerai comme la réponse. Merci beaucoup
@GrowlingSolid Cela ne devrait pas être si compliqué. La réponse vous permet network-managerde gérer les réseaux, ce qui est incompatible avec dhcpcd, qui est la valeur par défaut pour Raspbian. Il n'y a rien de mal à utiliser un autre gestionnaire, mais vous devez le désactiver dhcpcd(la réponse le fait indirectement car dhcpcela entraînera l' dhcpcdarrêt). Cela empêchera également le support WiFi dans l'interface graphique de fonctionner.
Milliways
1
Je me suis informé et suis arrivé à cette ligne correcte au lieu de la vôtre: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')Votre "fausse" version était:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R