Спільний доступ Wi-Fi Pi через порт Ethernet


28

У мене пі, що працює з останньою версією raspbian, і він підключений до Інтернету за допомогою бездротового USB-ключа. Що я хотів би зробити, - це поділитися підключенням Wi-Fi до пі, щоб будь-який комп'ютер, підключений до pi за допомогою LAN-кабелю, міг приймати Інтернет. Я роздивився Інтернет, але, здається, не знайшов нічого актуального. Я знайомий з цим процесом в Windows та Mac OS X, але це робиться на пі, щойно мене заспокоїло.

EDIT: Я не знаю, чи це допомагає комусь, але я підключений до Інтернету на моєму pi через wlan0, але я хотів би поділитися цим підключенням до Інтернету через eth0.


З'єднання WiFi та Ethernet-з'єднань на Pi та підключення його до маршрутизатора було б простіше. Чи можливо це для вашої заявки?
tlhIngan

@tlhIngan, на жаль, ви не бачите, що я не маю доступу до жодних Ethernet-розеток, і мені потрібно завантажувати свій ноутбук з PXE, що має зробити Ethernet. Також я хочу дізнатися більше про Linux, і я думав, що створення цього проекту надасть мені трохи більшої впевненості в Linux. Я подумав, що це буде простішим рішенням, оскільки мій маршрутизатор проходить весь мій дім: / У будь-якому випадку, дякую за вашу відповідь.

Я знайшов це підручник відео саме те, що вам потрібно: youtu.be/IAa4tI4JrgI Raspberry PI ділиться Інтернетом, який він отримує від wifi до порту Ethernet.
Mia19

@tlhIngan - Чи можете ви докладно? Чи буде для створення мосту потрібен і маршрутизатор? Я хочу, щоб мій мережевий аудіоприймач ділив мій Pis WiFi через Ethernet і був у тій самій підмережі та 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 Stretch

Наведена вище конфігурація не працюватиме в новій версії 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
Велике спасибі. Просто випробував це на моєму пі, і з'єднання було нормальним! Ще раз дякую за ваш час. Я ціную це.

1
Це чудово для спільного доступу до Інтернету з бездротовим пристроєм. Однак я хочу отримати доступ до пристрою з іншого ноутбука в моїй мережі, і це не працює. Я думаю, це тому, що вони знаходяться в різних підмережах? Якась порада, щоб обійти його?
Бьорн Андерссон

1
Це працювало чудово, хоча під час Raspbian Stretch мені довелося вручну включати конфігурацію WiFi в / etc / network / interfaces
xfx

1
@xfx, ви можете, будь ласка, показати код, який ви додали для конфігурації WiFi?
karl71

1
Я уважно стежив за вашою публікацією та посиланням. Мій Пі (я тільки що встановив свіжу ОС), коли я додаю "статичне" слово, він навіть не в змозі підключитися до wifi ...
karl71

6

З огляду на те, що ваша мета забезпечити доступ до Інтернету до ваших пристроїв локальної мережі, припустимо, що подвійний "NAT" не буде великою проблемою.
За допомогою цієї конфігурації ви забезпечите бездротовий доступ до пристроїв, що не підтримують WiFi, які отримають перевагу від доступу до Інтернету.
малюнок

Необхідна умова

Переконайтесь, що ваш Wi-Fi правильно налаштований та працює. якщо щось піде погано, ваш доступ до пристрою eth0буде обмежений або не існує.

Налаштування

Для початку нам потрібно кілька пакунків:

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

Інтерфейси

відредагуйте файл /etc/network/interfacesвідповідно до наступного, це встановить вашу eth0 a fix 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до зупинки). Це також заважатиме підтримці Wi-Fi у графічному інтерфейсі працювати.
Міллівей

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.