Совместное использование Wi-Fi соединения Pi через порт Ethernet

28

У меня есть пи под управлением последней версии raspbian, и он подключен к Интернету с помощью беспроводного USB-ключа. То, что я хотел бы сделать, это поделиться Wi-Fi-соединением pi, чтобы любой компьютер, подключенный к pi с помощью кабеля LAN, мог получать Интернет. Я посмотрел в Интернете, но я не могу найти что-то актуальное. Я знаком с этим процессом на Windows и Mac OS X, но выполнение этого на pi только поставило меня в тупик.

РЕДАКТИРОВАТЬ: Я не знаю, помогает ли это кому-либо, но я подключен к Интернету на моем пи через wlan0, но я хотел бы поделиться этим подключением к Интернету через eth0.

MasterScrat
источник
Соединить ваши соединения 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

Для распби Джесси

Из этого документа :

Мы будем использовать 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
Я внимательно следил за вашим постом и ссылкой. Мой Pi (только что установил новую ОС), всякий раз, когда я добавляю «статическое» слово, он даже не может подключиться к Wi-Fi ...
karl71
6

Ваша цель - обеспечить доступ в Интернет к вашим устройствам локальной сети, будет предполагать, что двойной «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