Pi'nin WiFi bağlantısını Ethernet portu üzerinden paylaşma


28

Raspbian'ın son sürümünü çalıştıran bir pi'm var ve kablosuz bir USB dongle kullanarak internete bağlı. Yapmak istediğim, pi'nin wifi bağlantısını paylaşmak, böylece bir LAN kablosu kullanarak pi'ye bağlı olan herhangi bir bilgisayar Internet'i alabilecekti. İnternete baktım ama alakadar bir şey bulamıyorum. Windows ve Mac OS X'teki bu işleme aşinayım, ancak bunu pi üzerinde yapmak beni çok şaşırttı.

EDIT: Bunun kimseye yardım edip etmediğini bilmiyorum ama ben pi ile wlan0 üzerinden internete bağlıyım ama bu internet bağlantısını eth0 üzerinden paylaşmak istiyorum.


WiFi ve Ethernet bağlantılarınızı Pi'ye bağlamak ve bir yönlendiriciye bağlamak daha kolay olacaktır. Başvurunuz için bu mümkün mü?
tlhIngan,

Ne yazık ki ne yazık ki hayır, herhangi bir Ethernet soketine erişimim olmadığını görüyorum ve dizüstü bilgisayarımı Ethernet tarafından yapılması gereken PXE'den başlatmam gerekiyor. Ayrıca Linux hakkında daha fazla bilgi edinmek istiyorum ve bu projeyi inşa etmem konusunda Linux'a biraz daha güven duyacağımı düşündüm. Yönlendiricimin evimin her tarafında olduğu için bunun daha kolay bir çözüm olacağını düşündüm: / Neyse, cevabınız için teşekkürler.

Bu öğretici videoyu tam olarak neye ihtiyacınız olduğunu buldum: youtu.be/IAa4tI4JrgI Ahududu PI, wifi'ten Ethernet portuna aldığı interneti paylaşıyor.
Mia19

@tlIngan - Ayrıntılı olabilir misiniz? Köprü oluşturmak da bir yönlendirici gerektiriyor mu? Ağ ses alıcımın Pis WiFi'imi Ethernet üzerinden paylaşmasını ve ana yönlendiricimle aynı alt ağda ve DHCP'de olmasını istiyorum.
square_eyes,

Yanıtlar:


40

İçin Raspbian Jessie

Gönderen Bu belgede :

dnsmasqBu amaçla paketi kullanacağız , çünkü DHCP ve DNS sunucusu birleştirildi ve yapılandırılması da kolay.

Biraz daha ağır bir şey istiyorsanız, sırasıyla DHCP ve DNS için isc-dhcp-serverve bind9paketlerini kullanabilirsiniz , ancak amaçlarımız için dnsmasqgayet iyi çalışıyor.

sudo apt-get install dnsmasq

Arabirimleri yapılandırmamız gerekiyor. eth0Ağ geçidi olarak kullanılacak statik bir IP adresi atayacağız . Arabirimler dosyasını açın

sudo nano /etc/network/interfaces

eth0Bu kısmı şöyle düzenle :

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

Ardından yapılandırırız dnsmasq. Gönderilen dnsmasqconfig dosyası, nasıl kullanılacağı hakkında birçok bilgi içerir. Bu yüzden onu hareket ettirmenizi ve yeni bir tane oluşturmanızı tavsiye edeceğim.

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

Aşağıdakileri yeni dosyaya yapıştırın

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 

/etc/sysctl.confPaket iletmeyi etkinleştirmek için dosyayı düzenleyin

sudo nano /etc/sysctl.conf

Bunu #içeren satırın başından kaldır net.ipv4.ip_forward=1Bu, sonraki yeniden başlatmada paket iletmeyi etkinleştirir. Ama şimdi yeniden başlatmadan denemek istiyorsanız, o zaman bunu yapın.

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

Ayrıca RPi'nin internet bağlantısını Wi-Fi üzerinden bağlı cihazlarla paylaşmamız gerekiyor. NAT ile eth0ve arasında bir yapılandırma yapacağız 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  

Ancak, Pi'yi her yeniden başlattığımızda bu kuralların uygulanmasına ihtiyacımız var, bu yüzden sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" kuralları dosyaya kaydetmek için çalıştırın /etc/iptables.ipv4.nat. Şimdi bunu her yeniden başlatmadan sonra çalıştırmamız gerekiyor, bu yüzden /etc/rc.localdosyayı açıp sudo nano /etc/rc.localsatırın hemen üstüne exit 0aşağıdaki satırı ekleyin:

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

Ve hepsi bu! Şimdi sadece RPI'nizi yeniden başlatın ve Internet'e erişebileceksiniz

sudo reboot

Raspbian Stretch için güncellendi

Yukarıdaki yapılandırma, Raspbian'ın daha yeni sürümünde çalışmaz. Böylece bunun için daha az acı çekecek bir senaryo hazırladım.

Bu kılavuzu kullanarak WiFi ağına bağlanın .

Komut dosyasını buradan indirin . Yerine koy/home/pi/

/home/pi/.config/lxsession/LXDE-pi/autostartDosya aç

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

Son satırı ekle:

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

Dosyanın tam yolunu verdiğinizden emin olun. Ve bitti. Şimdi değişiklikleri görmek için yeniden başlatın

sudo reboot

1
Çok teşekkür ederim. Bunu pi'mde denedim ve bağlantı iyiydi! Zaman ayırdığınız için tekrar teşekkürler. Bunu takdir ediyorum.

1
İnternet bağlantısını kablosuz bir cihazla paylaşmak için mükemmeldir. Ancak, aygıta ağımdaki başka bir dizüstü bilgisayardan erişmek istiyorum ve bu işe yaramıyor. Sanırım farklı alt ağlarda oldukları için mi? Etrafında dolaşmak için herhangi bir ipucu?
Björn Andersson

1
Raspbian Stretch'in altında WiFi konfigürasyonunu manuel olarak / etc / network / interfaces
xfx

1
@xfx, lütfen WiFi yapılandırması için eklediğiniz kodu gösterir misiniz?
karl71

1
Mesajınızı ve bağlantıyı dikkatlice takip ettim. Pi'm (yeni bir işletim sistemi kurulumu yaptım), "statik" kelimesini her eklediğimde,
wifi'a

6

Amacınız LAN cihazlarınıza internet erişimi sağlamak, çift 'NAT'ın büyük bir sorun olmayacağını varsayar.
Bu yapılandırma ile, internet erişiminden yararlanacak WiFi olmayan cihazlara kablosuz erişim sağlayacaksınız.
çizim

Önkoşul

Wi-Fi'nizin doğru şekilde yapılandırıldığından ve çalıştığından emin olun. eğer bir şeyler kötüye giderse, cihaza erişiminiz eth0sınırlı ya da eksik olacaktır.

Kurmak

Başlamak için birkaç pakete ihtiyacımız var:

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

Arayüzler

/etc/network/interfacesaşağıdaki ile eşleşecek şekilde dosyayı düzenleyin , bu eth0 adresinizi bir ip adresi (10.10.10.1) olarak ayarlayacaktır ve yeniden oluşturacaktır 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

dhcpYetkili hale getirmek için varsayılan yapılandırmayı değiştirin ve LAN ağını (10.10.10. *) Ekleyin, dosyayı düzenleyin /etc/dhcp/dhcpd.conf, aşağıdaki içeriği ekleyin:

# 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

Şimdi her yeniden başlatma işleminde ağı kurmak ve başlatmak için aşağıdaki komut dosyasını oluşturun. Betik dinamik olarak birkaç 'IPTABLES' kuralı oluşturacaktır. Adını ver /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

En sonunda

Son olarak, komut dosyasını her yeniden başlatmada exit 0çalıştırmanız, daha önce oluşturulan komut dosyasını çalıştırmak için `/etc/rc.local 'dosyasından önce iki satır ekleyin .

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

Şimdi cihazınızı yeniden başlatın, köprü sizin için çalışacaktır.

pd: sudokısalık ihmal edildi. sudo -iEOlarak oturum yapmak için kullanın .root


Vaov! Böyle ayrıntılı bir cevap için çok teşekkür ederim! Bunun o kadar karmaşık olacağını asla anlamadım, ancak başa çıkabileceğimi düşünüyorum. Tekrar teşekkürler, birkaç saat içinde deneyeceğim ve işe yararsa sizi cevap olarak işaretleyeceğim. Çok teşekkürler

@GrowlingSolid Bu kadar karmaşık olmamalı. Yanıt, Raspbian için varsayılan olan ve network-manageruyumsuz olan ağları yönetmek dhcpcdiçin kullandı. Alternatif bir yönetici kullanmakta yanlış bir şey yoktur, ancak devre dışı bırakmanız gerekir dhcpcd(cevap bunu dolaylı olarak durmasına dhcpneden olacak şekilde yapar dhcpcd). Ayrıca GUI'deki WiFi desteğinin çalışmasını da önleyecektir.
Milliways

1
Kendimi bilgilendirdim ve sizinki yerine bu doğru çizgiye geldim: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')"Yanlış" Sürümünüz şuydu:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.