Freigabe der WiFi-Verbindung des Pi über den Ethernet-Port

28

Ich habe ein Pi, auf dem die neueste Version von Raspbian ausgeführt wird, und es ist über einen drahtlosen USB-Dongle mit dem Internet verbunden. Was ich tun möchte, ist, die Wi-Fi-Verbindung des Pi zu teilen, damit jeder Computer, der über ein LAN-Kabel mit dem Pi verbunden ist, das Internet empfangen kann. Ich habe mich im Internet umgesehen, aber ich kann anscheinend nichts Relevantes finden. Ich bin mit diesem Prozess unter Windows und Mac OS X vertraut, aber wenn ich das auf dem Pi mache, bin ich nur verblüfft.

EDIT: Ich weiß nicht, ob dies jemandem hilft, aber ich bin über wlan0 auf meinem Pi mit dem Internet verbunden, aber ich möchte diese Internetverbindung über eth0 teilen.

MasterScrat
quelle
Das Überbrücken Ihrer WLAN- und Ethernet-Verbindungen auf dem Pi und das Anschließen an einen Router ist einfacher. Ist das für Ihre Bewerbung möglich?
tlhIngan
@tlhIngan leider nicht, Sie sehen, ich habe keinen Zugriff auf Ethernet-Sockets und ich muss meinen Laptop von PXE booten, was über Ethernet erfolgen muss. Außerdem möchte ich mehr über Linux erfahren, und ich dachte, das Erstellen dieses Projekts würde mir ein bisschen mehr Vertrauen in Linux geben. Ich dachte, dies wäre eine einfachere Lösung, da sich mein Router überall in meinem Haus befindet: / Wie auch immer, danke für Ihre Antwort.
Ich fand dieses Tutorial-Video genau das, was Sie brauchen: youtu.be/IAa4tI4JrgI Der Raspberry PI teilt sich das Internet, das er vom WLAN zum Ethernet-Port bekommt.
Mia19
@tlhIngan - Können Sie das näher erläutern? Würde das Erstellen einer Bridge auch einen Router erfordern? Ich möchte, dass mein Netzwerk-Audio-Receiver mein Pis WiFi über Ethernet teilt und sich im selben Subnetz und DHCP wie mein Haupt-Router befindet.
square_eyes

Antworten:

40

Für Raspbian Jessie

Aus diesem Dokument :

Wir werden das dnsmasqPaket für diesen Zweck verwenden, da es ein kombinierter DHCP- und DNS-Server ist und auch einfach zu konfigurieren ist.

Wenn Sie etwas "Schwergewichtigeres" möchten, können Sie die Pakete isc-dhcp-serverund bind9für DHCP bzw. DNS verwenden. Für unsere Zwecke dnsmasqfunktioniert dies jedoch einwandfrei.

sudo apt-get install dnsmasq

Wir müssen Schnittstellen konfigurieren. Wir werden eine statische IP-Adresse zuweisen eth0, die als Gateway verwendet wird. Öffnen Sie die Interface-Datei

sudo nano /etc/network/interfaces

Bearbeiten Sie den eth0Abschnitt wie folgt:

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

Als nächstes werden wir konfigurieren dnsmasq. Die mitgelieferte dnsmasqKonfigurationsdatei enthält viele Informationen zur Verwendung. Daher rate ich, es zu verschieben und ein neues zu erstellen.

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

Fügen Sie Folgendes in die neue Datei ein

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 

Bearbeiten Sie die /etc/sysctl.confDatei, um die Paketweiterleitung zu aktivieren

sudo nano /etc/sysctl.conf

Entfernen Sie am #Anfang der Zeile, die Folgendes enthält: net.ipv4.ip_forward=1Damit wird die Paketweiterleitung beim nächsten Neustart aktiviert. Aber wenn Sie es jetzt ohne Neustart versuchen möchten, dann tun Sie dies.

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

Wir müssen auch die Internetverbindung von RPi mit den über Wi-Fi verbundenen Geräten teilen. Wir konfigurieren ein NAT zwischen eth0und 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  

Diese Regeln müssen jedoch bei jedem Neustart des Pi angewendet werden. Führen Sie sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" sie daher aus , um die Regeln in der Datei zu speichern /etc/iptables.ipv4.nat. Jetzt müssen wir dies nach jedem Neustart ausführen. Öffnen Sie die /etc/rc.localDatei mit sudo nano /etc/rc.localund exit 0fügen Sie über der Zeile die folgende Zeile hinzu:

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

Und das ist alles! Starten Sie jetzt einfach Ihr RPi neu und Sie haben Zugang zum Internet

sudo reboot

Aktualisiert für Raspbian Stretch

Die obige Konfiguration funktioniert in neueren Versionen von Raspbian nicht. Deshalb habe ich ein Skript dafür erstellt, das es mit weniger Schmerzen ermöglicht.

Stellen Sie mithilfe dieser Anleitung eine Verbindung zum WiFi-Netzwerk her .

Laden Sie das Skript hier herunter . Platziere es bei/home/pi/

/home/pi/.config/lxsession/LXDE-pi/autostartDatei öffnen

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

Fügen Sie die letzte Zeile hinzu:

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

Stellen Sie sicher, dass Sie den vollständigen Pfad zur Datei angegeben haben. Und du bist fertig. Starten Sie jetzt neu, um die Änderungen zu sehen

sudo reboot
Arpit Agarwal
quelle
1
Vielen Dank. Habe das gerade auf meiner Pi getestet und die Verbindung war in Ordnung! Nochmals vielen Dank für Ihre Zeit. Ich schätze es.
1
Dies ist hervorragend für die gemeinsame Nutzung der Internetverbindung mit einem drahtlosen Gerät geeignet. Ich möchte jedoch von einem anderen Laptop in meinem Netzwerk auf das Gerät zugreifen und das funktioniert nicht. Ich denke, es ist, weil sie in verschiedenen Subnetzen sind? Irgendein Tipp, um es zu umgehen?
Björn Andersson
1
Es funktionierte perfekt, obwohl ich unter Raspbian Stretch die WiFi-Konfiguration manuell in die
Datei
1
@xfx, könntest du bitte den Code anzeigen, den du für die WiFi-Konfiguration hinzugefügt hast?
Karl71
1
Ich habe Ihren Beitrag und den Link sorgfältig verfolgt. Mein Pi (hat gerade eine Neuinstallation des Betriebssystems durchgeführt) kann, wenn ich das "statische" Wort hinzufüge, nicht einmal eine Verbindung zum WLAN herstellen ...
karl71
6

Da Sie beabsichtigen, einen Internetzugang für Ihre LAN-Geräte bereitzustellen, wird davon ausgegangen, dass doppeltes NAT kein großes Problem darstellt.
Mit dieser Konfiguration bieten Sie drahtlosen Zugang zu Nicht-WiFi-Geräten, die vom Internetzugang profitieren.
Zeichnung

Voraussetzung

Stellen Sie sicher, dass Ihr Wi-Fi richtig konfiguriert ist und funktioniert. Wenn etwas eth0schief geht, ist der Zugriff auf das Gerät eingeschränkt oder nicht vorhanden.

Installieren

Wir brauchen ein paar Pakete, um zu beginnen:

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

Schnittstellen

Bearbeiten Sie die Datei so /etc/network/interfaces, dass sie mit der folgenden übereinstimmt. Dadurch wird Ihrem eth0 eine feste IP-Adresse (10.10.10.1) zugewiesen und neu erstellt 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

Ändern Sie die Standardkonfiguration dhcp, um sie als autorisierend zu kennzeichnen, und fügen Sie das LAN-Netzwerk (10.10.10. *) Hinzu. Bearbeiten Sie die Datei /etc/dhcp/dhcpd.conf, und fügen Sie den folgenden Inhalt hinzu:

# 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

Erstellen Sie nun das folgende Skript, um das Netzwerk bei jedem Neustart einzurichten und zu starten. Das Skript erstellt dynamisch einige 'IPTABLES'-Regeln. Nennen Sie es /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

Endlich

Schließlich müssen Sie das Skript bei jedem Neustart exit 0ausführen. Fügen Sie die folgenden zwei Zeilen vor der in der Datei /etc/rc.local enthaltenen Zeile hinzu, um das zuvor erstellte Skript auszuführen.

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

Starten Sie jetzt einfach Ihr Gerät neu und die Bridge funktioniert für Sie.

pd: sudowurde der Kürze halber weggelassen. Verwenden Sie sudo -iE, um eine Sitzung als zu habenroot

fcm
quelle
Wow! Vielen Dank für eine so ausführliche Antwort! Ich hätte nie gedacht, dass es so kompliziert sein würde, aber ich denke, ich kann es angehen. Nochmals vielen Dank, ich werde es in ein paar Stunden ausprobieren und wenn es funktioniert, werde ich Sie als Antwort markieren. Vielen Dank
@GrowlingSolid Es sollte nicht so kompliziert sein. Mit der Antwort können Sie network-managerNetzwerke verwalten, die nicht mit dhcpcdRaspbian kompatibel sind . Dies ist die Standardeinstellung für Raspbian. Es ist nichts Falsches daran, einen alternativen Manager zu verwenden, aber Sie sollten ihn deaktivieren dhcpcd(die Antwort bewirkt dies indirekt, da dies dazu dhcpführt, dass dhcpcder stoppt). Es wird auch verhindern, dass die WiFi-Unterstützung in der GUI funktioniert.
Milliways
1
Ich habe mich informiert und bin statt deiner zu dieser richtigen Zeile gekommen: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')Deine "falsche" Version war:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R