Berbagi koneksi WiFi Pi melalui port Ethernet


28

Saya memiliki pi menjalankan rilis raspbian terbaru dan terhubung ke Internet menggunakan dongle USB nirkabel. Yang ingin saya lakukan adalah berbagi koneksi wifi pi sehingga setiap komputer yang terhubung ke pi menggunakan kabel LAN akan dapat menerima Internet. Saya telah melihat-lihat Internet, tetapi sepertinya saya tidak dapat menemukan relevansi apa pun. Saya akrab dengan proses ini pada Windows dan Mac OS X, tetapi melakukan ini pada pi baru saja membuat saya bingung.

EDIT: Saya tidak tahu apakah ini membantu siapa pun, tetapi saya terhubung ke Internet pada pi saya melalui wlan0, tapi saya ingin berbagi koneksi internet melalui eth0.


Menjembatani koneksi WiFi dan Ethernet Anda pada Pi dan menghubungkannya ke router akan lebih mudah. Apakah ini mungkin untuk aplikasi Anda?
tlhIngan

@ tlhIngan sayangnya tidak, Anda tahu saya tidak memiliki akses ke soket Ethernet dan saya perlu mem-boot laptop saya dari PXE, yang harus dilakukan oleh Ethernet. Saya juga ingin belajar lebih banyak tentang Linux, dan saya pikir membangun proyek ini akan memberi saya sedikit lebih percaya diri dengan Linux. Saya pikir ini akan menjadi solusi yang lebih mudah karena router saya ada di seberang rumah saya: / Pokoknya, terima kasih atas balasan Anda.

Saya menemukan video tutorial ini persis apa yang Anda butuhkan: youtu.be/IAa4tI4JrgI Raspberry PI membagikan internet yang didapatnya dari wifi ke port Ethernet.
Mia19

@ tlhIngan - Bisakah Anda menguraikan? Apakah membuat jembatan memerlukan router juga? Saya ingin penerima audio jaringan saya berbagi Pis WiFi melalui Ethernet dan berada di subnet dan DHCP yang sama dengan router utama saya.
square_eyes

Jawaban:


40

Untuk Raspbian Jessie

Dari dokumen ini :

Kami akan menggunakan dnsmasqpaket untuk tujuan ini karena ia menggabungkan DHCP dan server DNS dan juga mudah dikonfigurasi.

Jika Anda menginginkan sesuatu yang lebih 'berat', Anda dapat menggunakan paket isc-dhcp-serverdan bind9untuk DHCP dan DNS masing-masing, tetapi untuk tujuan kami, dnsmasqberfungsi dengan baik.

sudo apt-get install dnsmasq

Kita perlu mengkonfigurasi antarmuka. Kami akan menetapkan alamat IP statis eth0yang akan digunakan sebagai gateway. Buka file antarmuka

sudo nano /etc/network/interfaces

Edit eth0bagian seperti ini:

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

Selanjutnya, kita akan mengkonfigurasi dnsmasq. dnsmasqFile konfigurasi yang dikirim berisi banyak informasi tentang cara menggunakannya. Jadi, saya akan menyarankan untuk memindahkannya dan membuat yang baru.

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

Rekatkan yang berikut ke dalam file baru

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 

Edit /etc/sysctl.conffile untuk mengaktifkan penerusan paket

sudo nano /etc/sysctl.conf

Hapus #dari awal baris yang berisi net.ipv4.ip_forward=1ini akan memungkinkan penerusan paket pada reboot berikutnya. Tetapi jika Anda ingin mencobanya sekarang tanpa reboot maka lakukan ini.

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

Kita juga perlu berbagi koneksi internet RPi dengan perangkat yang terhubung melalui Wi-Fi. Kami akan mengonfigurasi NAT antara eth0dan 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  

Namun, kita membutuhkan aturan ini untuk diterapkan setiap kali kita me-reboot Pi, jadi jalankan sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" untuk menyimpan aturan ke file /etc/iptables.ipv4.nat. Sekarang kita perlu menjalankan ini setelah setiap reboot, jadi buka /etc/rc.localfile dengan sudo nano /etc/rc.localdan tepat di atas baris exit 0, tambahkan baris berikut:

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

Dan itu saja! Sekarang cukup Reboot RPi Anda dan Anda akan dapat mengakses Internet

sudo reboot

Diperbarui untuk Peregangan Raspbian

Konfigurasi di atas tidak akan berfungsi di versi Raspbian yang lebih baru. Jadi, saya telah membuat skrip untuk hal ini yang memungkinkannya untuk mengurangi rasa sakit.

Terhubung ke jaringan WiFi menggunakan panduan ini .

Unduh skrip dari sini . Tempatkan di/home/pi/

Buka /home/pi/.config/lxsession/LXDE-pi/autostartfile

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

Tambahkan baris terakhir:

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

Pastikan Anda telah memberikan path lengkap ke file. Dan kamu sudah selesai. Sekarang reboot untuk melihat perubahannya

sudo reboot

1
Terima kasih banyak. Baru saja menguji ini pada pi saya dan koneksi baik-baik saja! Sekali lagi terima kasih atas waktu Anda. Saya menghargainya.

1
Ini sangat baik untuk berbagi koneksi internet dengan perangkat nirkabel. Namun, saya ingin mengakses perangkat dari laptop lain di jaringan saya dan itu tidak berfungsi. Saya kira itu karena mereka berada di subnet yang berbeda? Ada tips untuk menyiasatinya?
Björn Andersson

1
Ini bekerja dengan sempurna, meskipun di bawah Raspbian Stretch, saya harus secara manual memasukkan konfigurasi WiFi ke / etc / network / interfaces
xfx

1
@xfx, bisakah Anda menunjukkan kode yang Anda tambahkan untuk konfigurasi WiFi?
karl71

1
Saya mengikuti posting Anda dan tautannya dengan hati-hati. Pi saya (baru saja menginstal OS baru), setiap kali saya menambahkan kata "statis", itu bahkan tidak dapat terhubung ke wifi ...
karl71

6

Menjadi tujuan Anda menyediakan akses internet ke perangkat LAN Anda, akan menganggap ganda 'NAT' tidak akan menjadi masalah besar.
Dengan konfigurasi ini Anda akan memberikan akses nirkabel ke perangkat non WiFi yang akan mendapat manfaat dari akses internet.
gambar

Prasyarat

Pastikan Wi-Fi Anda dikonfigurasi dengan benar dan berfungsi. jika ada yang tidak beres, akses Anda ke perangkat eth0akan terbatas atau tidak ada.

Mendirikan

Kami membutuhkan beberapa paket untuk memulai:

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

Antarmuka

sunting file /etc/network/interfacesuntuk mencocokkan yang berikut ini, ini akan membuat eth0 Anda memperbaiki alamat ip (10.10.10.1) dan akan membuat ulang 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

Ubah dhcpkonfigurasi default untuk menjadikannya resmi dan tambahkan jaringan LAN (10.10.10. *), Edit file /etc/dhcp/dhcpd.conf, tambahkan konten berikut:

# 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

Sekarang buat skrip berikut untuk menyiapkan dan memulai jaringan pada setiap reboot. Script akan secara dinamis membuat beberapa aturan 'IPTABLES'. Beri nama /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

Akhirnya

Terakhir, Anda perlu menjalankan skrip pada setiap reboot, tambahkan dua baris berikut sebelum exit 0pada file `/etc/rc.local 'untuk menjalankan skrip yang dibuat sebelumnya.

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

Sekarang, hidupkan ulang perangkat Anda dan jembatan akan berfungsi untuk Anda.

pd: sudodihilangkan karena singkatnya. Gunakan sudo -iEuntuk memiliki sesi sebagairoot


Wow! Terima kasih banyak atas jawaban terperinci! Saya tidak pernah menyadari itu akan menjadi rumit, tetapi saya pikir saya bisa mengatasinya. Sekali lagi terima kasih, saya akan mencobanya dalam beberapa jam dan jika berhasil saya akan menandai Anda sebagai jawabannya. Terima kasih banyak

@GrowlingSolid Seharusnya tidak rumit. Jawabannya telah Anda gunakan network-manageruntuk mengelola jaringan, yang tidak kompatibel dengan dhcpcd, yang merupakan standar untuk Raspbian. Tidak ada yang salah dengan menggunakan manajer alternatif, tetapi Anda harus menonaktifkan dhcpcd(jawabannya melakukan ini secara tidak langsung karena dhcpakan dhcpcdberhenti). Ini juga akan mencegah dukungan WiFi di GUI dari bekerja.
Milliways

1
Saya telah memberi tahu diri sendiri dan sampai pada garis yang benar ini, bukan milik Anda: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')Versi "salah" Anda adalah:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.