Udostępnianie połączenia WiFi Pi przez port Ethernet

28

Mam wersję pi z najnowszą wersją raspbian, która jest podłączona do Internetu za pomocą bezprzewodowego klucza USB. Chciałbym udostępnić połączenie WiFi pi, aby każdy komputer podłączony do pi za pomocą kabla LAN był w stanie odbierać Internet. Rozejrzałem się po Internecie, ale nie mogę znaleźć nic istotnego. Znam ten proces w systemach Windows i Mac OS X, ale zrobienie tego na pi właśnie mnie zaskoczyło.

EDYCJA: Nie wiem, czy to pomaga komukolwiek, ale jestem podłączony do Internetu na mojej pi przez wlan0, ale chciałbym udostępnić to połączenie internetowe przez eth0.

MasterScrat
źródło
Mostkowanie połączeń WiFi i Ethernet na Pi i podłączenie go do routera byłoby prostsze. Czy jest to możliwe w twojej aplikacji?
tlhIngan
@ tlhIngan niestety nie widzisz, że nie mam dostępu do żadnych gniazd Ethernet i muszę uruchomić laptopa z PXE, co musi zrobić Ethernet. Chciałbym również dowiedzieć się więcej o Linuksie i pomyślałem, że zbudowanie tego projektu dałoby mi trochę więcej pewności co do Linuksa. Pomyślałem, że będzie to łatwiejsze rozwiązanie, ponieważ mój router jest w całym domu: / W każdym razie dziękuję za odpowiedź.
Znalazłem ten film instruktażowy dokładnie to, czego potrzebujesz: youtu.be/IAa4tI4JrgI Raspberry PI dzieli się internetem z wifi do portu Ethernet.
Mia19,
@tlhIngan - Czy potrafisz opracować? Czy utworzenie mostu również wymaga routera? Chcę, aby mój sieciowy odbiornik audio współdzielił moje Pis WiFi przez Ethernet i był w tej samej podsieci i DHCP, co mój główny router.
square_eyes

Odpowiedzi:

40

Dla Raspbian Jessie

Z tego dokumentu :

W dnsmasqtym celu wykorzystamy pakiet, ponieważ jest on połączony z serwerem DHCP i DNS, a także łatwy w konfiguracji.

Jeśli chcesz coś trochę bardziej „wagi ciężkiej”, można użyć isc-dhcp-serveri bind9pakietów DHCP i DNS odpowiednio, ale dla naszych celów, dnsmasqdziała dobrze.

sudo apt-get install dnsmasq

Musimy skonfigurować interfejsy. Przydzielimy statyczny adres IP, eth0który będzie używany jako brama. Otwórz plik interfejsów

sudo nano /etc/network/interfaces

Edytuj eth0sekcję w następujący sposób:

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

Następnie skonfigurujemy dnsmasq. Dostarczony dnsmasqplik konfiguracyjny zawiera wiele informacji o tym, jak go używać. Radzę więc go przenieść i stworzyć nowy.

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

Wklej następujące elementy do nowego pliku

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 

Edytuj /etc/sysctl.confplik, aby włączyć przekazywanie pakietów

sudo nano /etc/sysctl.conf

Usuń #początek linii zawierającej net.ipv4.ip_forward=1To umożliwi przekazywanie pakietów przy następnym uruchomieniu. Ale jeśli chcesz wypróbować go teraz bez ponownego uruchamiania, zrób to.

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

Musimy także udostępniać połączenie internetowe RPi urządzeniom podłączonym przez Wi-Fi. Skonfigurujemy NAT pomiędzy eth0i 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  

Musimy jednak stosować te reguły przy każdym ponownym uruchomieniu Pi, więc uruchom, sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" aby zapisać reguły w pliku /etc/iptables.ipv4.nat. Teraz musimy uruchomić to po każdym ponownym uruchomieniu, więc otwórz /etc/rc.localplik z sudo nano /etc/rc.locali tuż nad linią exit 0, dodaj następujący wiersz:

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

I to wszystko! Teraz ponownie uruchom RPi, a będziesz mieć dostęp do Internetu

sudo reboot

Zaktualizowano dla Raspbian Stretch

Powyższa konfiguracja nie będzie działać w nowszej wersji Raspbian. Stworzyłem więc skrypt, który pozwala na mniejszy ból.

Połącz się z siecią Wi-Fi, korzystając z tego przewodnika.

Pobierz skrypt stąd . Umieść to w/home/pi/

Otwórz /home/pi/.config/lxsession/LXDE-pi/autostartplik

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

Dodaj ostatni wiersz:

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

Upewnij się, że podałeś pełną ścieżkę do pliku. I jesteś skończony. Teraz uruchom ponownie, aby zobaczyć zmiany

sudo reboot
Arpit Agarwal
źródło
1
Dziękuję Ci bardzo. Właśnie przetestowałem to na mojej pi i połączenie było w porządku! Jeszcze raz dziękuję za poświęcony czas. Doceniam to.
1
Jest to doskonałe do udostępniania połączenia internetowego z urządzeniem bezprzewodowym. Chcę jednak uzyskać dostęp do urządzenia z innego laptopa w mojej sieci i to nie działa. Chyba dlatego, że są w różnych podsieciach? Wszelkie wskazówki, jak to obejść?
Björn Andersson
1
Działa idealnie, chociaż pod Raspbian Stretch musiałem ręcznie włączyć konfigurację Wi-Fi do / etc / network / interfaces
xfx 14.09.17
1
@xfx, czy możesz pokazać kod dodany do konfiguracji WiFi?
karl71,
1
Uważnie śledziłem twój post i link. Moje Pi (właśnie wykonałem nową instalację systemu operacyjnego), za każdym razem, gdy dodam słowo „statyczne”, nie można nawet połączyć się z Wi-Fi ...
karl71,
6

Ponieważ Twoim celem jest zapewnienie dostępu do Internetu dla urządzeń LAN, założysz, że podwójne NAT nie będzie dużym problemem.
Dzięki tej konfiguracji zapewnisz bezprzewodowy dostęp do urządzeń innych niż WiFi, które skorzystają z dostępu do Internetu.
rysunek

Warunek wstępny

Upewnij się, że Wi-Fi jest poprawnie skonfigurowany i działa. jeśli coś pójdzie nie tak, twój dostęp do urządzenia eth0będzie ograniczony lub nie będzie go wcale.

Ustawiać

Potrzebujemy kilku pakietów, aby rozpocząć:

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

Interfejsy

edytuj plik, /etc/network/interfacesaby dopasować go do poniższego, ustawi to et0 stały adres IP (10.10.10.1) i odtworzy 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

Zmodyfikuj domyślną dhcpkonfigurację, aby była autorytatywna, i dodaj sieć LAN (10.10.10. *), Edytuj plik /etc/dhcp/dhcpd.conf, dodaj następującą treść:

# 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

Teraz utwórz następujący skrypt, aby skonfigurować i uruchomić sieć przy każdym ponownym uruchomieniu. Skrypt dynamicznie utworzy kilka reguł „IPTABLES”. Nazwij to /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

Wreszcie

Na koniec musisz uruchomić skrypt przy każdym ponownym uruchomieniu, dodaj następujące dwa wiersze przed exit 0plikiem `/etc/rc.local ', aby uruchomić skrypt utworzony wcześniej.

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

Teraz uruchom ponownie urządzenie, a most będzie dla ciebie działał.

pd: sudozostał pominięty ze względu na zwięzłość. Użyj, sudo -iEaby mieć sesję jakoroot

fcm
źródło
Łał! Dziękuję bardzo za tak szczegółową odpowiedź! Nigdy nie zdawałem sobie sprawy, że będzie to tak skomplikowane, ale myślę, że dam sobie radę. Jeszcze raz dziękuję, wypróbuję to za kilka godzin, a jeśli zadziała, oznaczę cię jako odpowiedź. Dziękuję bardzo
@GrowlingSolid Nie powinno to być takie skomplikowane. Odpowiedź ma na network-managercelu zarządzanie sieciami, które są niezgodne dhcpcd, co jest ustawieniem domyślnym dla Raspbian. Nie ma nic złego w korzystaniu z alternatywnego menedżera, ale powinieneś wyłączyć dhcpcd(odpowiedź robi to pośrednio, ponieważ dhcpspowoduje dhcpcdto zatrzymanie). Zapobiegnie także obsłudze WiFi w GUI.
Milliways,
1
Poinformowałem się i doszedłem do tej właściwej linii zamiast twojej: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')Twoja „fałszywa” wersja brzmiała:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R,