แบ่งปันการเชื่อมต่อ WiFi ของ Pi ผ่านพอร์ตอีเธอร์เน็ต


28

ฉันมี pi ที่รัน raspbian รุ่นล่าสุดและเชื่อมต่อกับอินเทอร์เน็ตโดยใช้ดองเกิล USB แบบไร้สาย สิ่งที่ฉันต้องการจะทำคือการแบ่งปันการเชื่อมต่อ wifi ของ pi เพื่อให้คอมพิวเตอร์ทุกเครื่องที่เชื่อมต่อกับ pi โดยใช้สาย LAN จะสามารถรับอินเทอร์เน็ตได้ ฉันดูอินเทอร์เน็ต แต่ฉันไม่สามารถหาสิ่งที่เกี่ยวข้องได้ ฉันคุ้นเคยกับกระบวนการนี้ใน Windows และ Mac OS X แต่การทำเช่นนี้ใน pi ทำให้ฉันต้องนิ่งงัน

แก้ไข:ฉันไม่ทราบว่าสิ่งนี้จะช่วยให้ทุกคน แต่ฉันเชื่อมต่อกับอินเทอร์เน็ตบน pi ของฉันผ่าน wlan0 แต่ฉันต้องการแบ่งปันการเชื่อมต่ออินเทอร์เน็ตนั้นผ่าน eth0


การเชื่อมการเชื่อมต่อ WiFi และอีเธอร์เน็ตของคุณบน Pi และเสียบเข้ากับเราเตอร์จะทำได้ง่ายกว่า เป็นไปได้สำหรับใบสมัครของคุณ?
tlhIngan

@tlhIngan โชคไม่ดีที่คุณเห็นฉันไม่สามารถเข้าถึงซ็อกเก็ตอีเธอร์เน็ตและฉันต้องบูตแล็ปท็อปของฉันจาก PXE ซึ่งต้องทำโดยอีเธอร์เน็ต นอกจากนี้ฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Linux และฉันคิดว่าการสร้างโครงการนี้จะให้ความมั่นใจกับ Linux มากขึ้น ฉันคิดว่านี่จะเป็นวิธีแก้ปัญหาที่ง่ายกว่าเนื่องจากเราเตอร์ของฉันตั้งอยู่ตรงข้ามบ้านของฉัน: / อย่างไรก็ตามขอขอบคุณสำหรับคำตอบของคุณ

ฉันพบวิดีโอการสอนนี้ว่าคุณต้องการอะไร: youtu.be/IAa4tI4JrgI Raspberry PI แบ่งปันอินเทอร์เน็ตที่ได้รับจาก wifi ไปยังพอร์ตอีเธอร์เน็ต
Mia19

@tlhIngan - คุณสามารถทำอย่างละเอียด? การสร้างบริดจ์จำเป็นต้องมีเราเตอร์ด้วยหรือไม่ ฉันต้องการให้เครื่องรับสัญญาณเสียงเครือข่ายของฉันแบ่งปัน Pis WiFi ผ่านทางอีเธอร์เน็ตและอยู่ในเครือข่ายย่อยและ DHCP เดียวกันกับเราเตอร์หลักของฉัน
square_eyes

คำตอบ:


40

สำหรับRaspbian Jessie

จากเอกสารนี้ :

เราจะใช้dnsmasqแพ็คเกจเพื่อการนี้เพราะมันรวม DHCP และเซิร์ฟเวอร์ DNS และยังง่ายต่อการกำหนดค่า

หากคุณต้องการบางสิ่งบางอย่าง 'หนา' มากกว่านี้คุณสามารถใช้ isc-dhcp-serverและbind9แพ็คเกจสำหรับ DHCP และ DNS ตามลำดับ แต่สำหรับวัตถุประสงค์ของเราdnsmasqทำงานได้ดี

sudo apt-get install dnsmasq

เราจำเป็นต้องกำหนดค่าอินเทอร์เฟซ เราจะกำหนดที่อยู่ IP แบบคงที่ eth0ซึ่งจะใช้เป็นเกตเวย์ เปิดไฟล์อินเตอร์เฟส

sudo nano /etc/network/interfaces

แก้ไขeth0ส่วนดังนี้:

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

dnsmasqต่อไปเราจะกำหนดค่า dnsmasqไฟล์กำหนดค่าที่จัดส่งมามีข้อมูลจำนวนมากเกี่ยวกับวิธีใช้งาน ดังนั้นฉันจะแนะนำให้ย้ายและสร้างใหม่

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

วางสิ่งต่อไปนี้ลงในไฟล์ใหม่

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.confไฟล์เพื่อเปิดใช้งานการส่งต่อแพ็คเก็ต

sudo nano /etc/sysctl.conf

ลบออก#จากจุดเริ่มต้นของบรรทัดที่มี net.ipv4.ip_forward=1นี้จะเปิดใช้งานการส่งต่อแพ็คเก็ตในการรีบูตครั้งต่อไป แต่ถ้าคุณต้องการลองตอนนี้โดยไม่ต้องรีบูทให้ทำสิ่งนี้

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

เราจำเป็นต้องแบ่งปันการเชื่อมต่ออินเทอร์เน็ตของ RPi กับอุปกรณ์ที่เชื่อมต่อผ่าน Wi-Fi เราจะกำหนดค่า NAT ระหว่างeth0และ 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  

อย่างไรก็ตามเราต้องกฎเหล่านี้จะนำมาใช้ทุกครั้งที่เรารีบูต Pi เรียกใช้เพื่อ ที่จะบันทึกกฎไปยังแฟ้มsudo sh -c "iptables-save > /etc/iptables.ipv4.nat" /etc/iptables.ipv4.natตอนนี้เราจำเป็นต้องเรียกใช้หลังจากรีบูตแต่ละครั้งดังนั้นให้เปิด/etc/rc.localไฟล์ด้วย sudo nano /etc/rc.localและเหนือบรรทัดexit 0ให้เพิ่มบรรทัดต่อไปนี้:

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

และนั่นคือทั้งหมด! ตอนนี้เพียงแค่รีบูต RPi ของคุณและคุณจะสามารถเข้าถึงอินเทอร์เน็ตได้

sudo reboot

อัปเดตสำหรับการยืด Raspbian

การกำหนดค่าด้านบนจะไม่ทำงานใน Raspbian รุ่นใหม่กว่า ดังนั้นฉันได้สร้างสคริปต์สำหรับสิ่งนี้ซึ่งทำให้เป็นไปได้ในความเจ็บปวดน้อยลง

เชื่อมต่อกับเครือข่าย WiFi โดยใช้นี้คู่มือ

ดาวน์โหลดสคริปต์จากที่นี่ วางไว้ที่/home/pi/

เปิด/home/pi/.config/lxsession/LXDE-pi/autostartไฟล์

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

เพิ่มบรรทัดสุดท้าย:

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

ตรวจสอบให้แน่ใจว่าคุณได้กำหนดพา ธ แบบเต็มไปยังไฟล์ และคุณทำเสร็จแล้ว ตอนนี้รีบูตเพื่อดูการเปลี่ยนแปลง

sudo reboot

1
ขอบคุณมาก. เพิ่งทดสอบสิ่งนี้กับ pi ของฉันและการเชื่อมต่อก็ใช้ได้! ขอบคุณอีกครั้งสำหรับเวลาของคุณ ฉันรู้สึกทราบซึ้ง.

1
เหมาะอย่างยิ่งสำหรับการแบ่งปันการเชื่อมต่ออินเทอร์เน็ตกับอุปกรณ์ไร้สาย อย่างไรก็ตามฉันต้องการเข้าถึงอุปกรณ์จากแล็ปท็อปเครื่องอื่นในเครือข่ายของฉันและใช้งานไม่ได้ ฉันเดาว่าเป็นเพราะพวกเขาอยู่ในเครือข่ายย่อยต่างกันหรือไม่ มีเคล็ดลับใดที่จะหลีกเลี่ยงได้
Björn Andersson

1
มันทำงานได้อย่างสมบูรณ์แม้ว่าภายใต้ Raspbian Stretch ฉันต้องรวมการกำหนดค่า WiFi ลงใน / etc / network / interfaces ด้วยตนเอง
xfx

1
@xfx คุณช่วยกรุณาแสดงรหัสที่คุณเพิ่มสำหรับการกำหนดค่า WiFi หรือไม่
karl71

1
ฉันติดตามโพสต์และลิงก์ของคุณอย่างระมัดระวัง Pi ของฉัน (เพิ่งทำการติดตั้งระบบปฏิบัติการใหม่) เมื่อใดก็ตามที่ฉันเพิ่มคำว่า "คงที่" จะไม่สามารถเชื่อมต่อกับ wifi ...
karl71

6

วัตถุประสงค์ของคุณคือให้การเข้าถึงอินเทอร์เน็ตไปยังอุปกรณ์ LAN ของคุณจะถือว่าเป็นสองเท่า 'NAT' จะไม่เป็นปัญหาใหญ่
ด้วยการกำหนดค่านี้คุณจะให้การเข้าถึงแบบไร้สายไปยังอุปกรณ์ที่ไม่ใช่ WiFi ซึ่งจะได้ประโยชน์จากการเข้าถึงอินเทอร์เน็ต
การวาดภาพ

ที่จำเป็นต้องมี

ตรวจสอบให้แน่ใจว่า Wi-Fi ของคุณได้รับการกำหนดค่าและทำงานอย่างเหมาะสม หากมีสิ่งใดที่ไม่ดีที่คุณเข้าถึงอุปกรณ์ผ่านeth0จะถูก จำกัด หรือไม่มีอยู่

ติดตั้ง

เราต้องการแพ็กเกจสองแบบเพื่อเริ่มต้น:

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

อินเตอร์เฟซ

แก้ไขไฟล์/etc/network/interfacesเพื่อให้ตรงต่อไปนี้จะตั้งค่า eth0 ของคุณที่อยู่แก้ไข IP (10.10.10.1) 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

แก้ไขdhcpการกำหนดค่าเริ่มต้นเพื่อให้สิทธิ์และเพิ่มเครือข่าย LAN (10.10.10. *) แก้ไขไฟล์/etc/dhcp/dhcpd.confเพิ่มเนื้อหาต่อไปนี้:

# 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

ตอนนี้สร้างสคริปต์ต่อไปนี้เพื่อตั้งค่าและเริ่มเครือข่ายในการรีบูตทุกครั้ง สคริปต์จะสร้างกฎ 'IPTABLES' แบบไดนามิกเล็กน้อย ตั้งชื่อมัน/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

ในที่สุด

สุดท้ายคุณต้องรันสคริปต์ในการรีบูตแต่ละครั้งเพิ่มสองบรรทัดต่อไปนี้ก่อนหน้าexit 0ไฟล์ `/etc/rc.local 'เพื่อเรียกใช้สคริปต์ที่สร้างขึ้นก่อน

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

ตอนนี้เพิ่งรีสตาร์ทอุปกรณ์ของคุณและบริดจ์จะทำงานให้คุณ

pd: sudoถูกละไว้เนื่องจากความกะทัดรัด ใช้sudo -iEเพื่อมีเซสชั่นเป็นroot


ว้าว! ขอบคุณมากสำหรับคำตอบอย่างละเอียด! ฉันไม่เคยรู้เลยว่ามันจะซับซ้อนขนาดนั้น แต่ฉันคิดว่าฉันสามารถรับมือได้ ขอขอบคุณอีกครั้งฉันจะลองใช้ในอีกสองถึงสามชั่วโมงและหากได้ผลฉันจะทำเครื่องหมายว่าคุณเป็นคำตอบ ขอบคุณมาก

@GrowlingSolid มันไม่ควรซับซ้อนขนาดนั้น คุณมีคำตอบที่ใช้network-managerในการจัดการเครือข่ายซึ่งเข้ากันไม่ได้dhcpcdซึ่งเป็นค่าเริ่มต้นสำหรับ Raspbian ไม่มีอะไรผิดปกติกับการใช้ตัวจัดการทางเลือก แต่คุณควรปิดการใช้งานdhcpcd(คำตอบทำสิ่งนี้ทางอ้อมซึ่งdhcpจะทำให้dhcpcdหยุด) นอกจากนี้ยังจะป้องกันการสนับสนุน WiFi ใน GUI จากการทำงาน
Milliways

1
ฉันได้แจ้งตัวเองแล้วและมาถึงบรรทัดที่ถูกต้องนี้แทนที่จะเป็นของคุณ: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')เวอร์ชัน "เท็จ" ของคุณคือ:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.