Compartir la conexión WiFi de Pi a través del puerto Ethernet

28

Tengo un pi que ejecuta la última versión de raspbian y está conectado a Internet mediante un dongle USB inalámbrico. Lo que me gustaría hacer es compartir la conexión wifi del pi para que cualquier computadora conectada al pi con un cable LAN pueda recibir Internet. Eché un vistazo a Internet, pero parece que no puedo encontrar nada relevante. Estoy familiarizado con este proceso en Windows y Mac OS X, pero hacerlo en pi me ha dejado perplejo.

EDITAR: No sé si esto ayuda a alguien, pero estoy conectado a Internet en mi pi a través de wlan0, pero me gustaría compartir esa conexión a Internet a través de eth0.

MasterScrat
fuente
Conectar sus conexiones WiFi y Ethernet en el Pi y enchufarlo a un enrutador sería más simple. ¿Es esto posible para su aplicación?
tlhIngan
@tlhIngan desafortunadamente no, ves que no tengo acceso a ningún conector de Ethernet y necesito arrancar mi computadora portátil desde PXE, que debe hacerse por Ethernet. También quiero aprender más sobre Linux, y pensé que construir este proyecto me daría un poco más de confianza con Linux. Pensé que esta sería una solución más fácil ya que mi enrutador está en toda mi casa: / De todos modos, gracias por su respuesta.
Encontré este video tutorial exactamente lo que necesita: youtu.be/IAa4tI4JrgI El Raspberry PI comparte Internet que obtiene de wifi al puerto Ethernet.
Mia19
@tlhIngan - ¿Puedes dar más detalles? ¿Crear un puente requeriría un enrutador también? Quiero que mi receptor de audio de red comparta mi WiFi de Pis a través de Ethernet y esté en la misma subred y DHCP que mi enrutador principal.
square_eyes

Respuestas:

40

Para Raspbian Jessie

De este documento :

Utilizaremos el dnsmasqpaquete para este propósito porque es un servidor combinado de DHCP y DNS y también es fácil de configurar.

Si desea algo un poco más 'pesado', puede usar los paquetes isc-dhcp-servery bind9para DHCP y DNS respectivamente, pero para nuestros propósitos, dnsmasqfunciona bien.

sudo apt-get install dnsmasq

Necesitamos configurar interfaces. Asignaremos una dirección IP estática a la eth0que se utilizará como puerta de enlace. Abra el archivo de interfaces.

sudo nano /etc/network/interfaces

Edite la eth0sección así:

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

A continuación, lo configuraremos dnsmasq. El dnsmasqarchivo de configuración enviado contiene mucha información sobre cómo usarlo. Por lo tanto, aconsejaré moverlo y crear uno nuevo.

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

Pegue lo siguiente en el nuevo archivo

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 

Edite el /etc/sysctl.confarchivo para habilitar el reenvío de paquetes

sudo nano /etc/sysctl.conf

Elimine #desde el principio de la línea que contiene net.ipv4.ip_forward=1Esto permitirá el reenvío de paquetes en el próximo reinicio. Pero si quieres probarlo ahora mismo sin reiniciar, hazlo.

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

También necesitamos compartir la conexión a Internet de RPi con los dispositivos conectados a través de Wi-Fi. Configuraremos un NAT entre eth0y 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  

Sin embargo, necesitamos que estas reglas se apliquen cada vez que reiniciamos el Pi, por lo tanto, ejecute sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" para guardar las reglas en el archivo /etc/iptables.ipv4.nat. Ahora necesitamos ejecutar esto después de cada reinicio, así que abra el /etc/rc.localarchivo con sudo nano /etc/rc.localy justo encima de la línea exit 0, agregue la siguiente línea:

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

¡Y eso es todo! Ahora solo reinicie su RPi y podrá acceder a Internet

sudo reboot

Actualizado para Raspbian Stretch

La configuración anterior no funcionará en la versión más nueva de Raspbian. Entonces, he creado un script para esto que lo hace posible con menos dolor.

Conéctese a la red WiFi utilizando esta guía.

Descargue el script desde aquí . Colocarlo en/home/pi/

Abrir /home/pi/.config/lxsession/LXDE-pi/autostartarchivo

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

Agrega la última línea:

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

Asegúrese de haber proporcionado la ruta completa al archivo. Y tu estas listo. Ahora reinicie para ver los cambios

sudo reboot
Arpit Agarwal
fuente
1
Muchas gracias. ¡Acabo de probar esto en mi pi y la conexión estaba bien! Nuevamente gracias por tu tiempo. Lo aprecio.
1
Esto es excelente para compartir conexión a Internet con un dispositivo inalámbrico. Sin embargo, quiero acceder al dispositivo desde otra computadora portátil en mi red y eso no funciona. ¿Supongo que es porque están en subredes diferentes? ¿Algún consejo para evitarlo?
Björn Andersson
1
Funcionó perfectamente, aunque bajo Raspbian Stretch, tuve que incluir manualmente la configuración WiFi en / etc / network / interfaces
xfx
1
@xfx, ¿podría mostrar el código que agregó para la configuración de WiFi?
karl71
1
Seguí tu publicación y el enlace cuidadosamente. Mi Pi (acaba de hacer una nueva instalación del sistema operativo), cada vez que agrego la palabra "estática", ni siquiera se puede conectar al wifi ...
karl71
6

Siendo su propósito proporcionar acceso a Internet a sus dispositivos LAN, asumirá que el doble 'NAT' no será un gran problema.
Con esta configuración, proporcionará acceso inalámbrico a dispositivos no WiFi que se beneficiarán del acceso a Internet.
dibujo

Requisito previo

Asegúrese de que su Wi-Fi esté configurado y funcionando correctamente. Si algo sale mal, su acceso al dispositivo eth0será limitado o inexistente.

Preparar

Necesitamos un par de paquetes para comenzar:

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

Interfaces

edite el archivo /etc/network/interfacespara que coincida con lo siguiente, esto establecerá su eth0 una dirección IP fija (10.10.10.1) y se volverá a crear 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

Modifique la dhcpconfiguración predeterminada para que sea autoritativa y agregue la red LAN (10.10.10. *), Edite el archivo /etc/dhcp/dhcpd.conf, agregue el siguiente contenido:

# 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

Ahora cree el siguiente script para configurar e iniciar la red en cada reinicio. El script creará dinámicamente algunas reglas 'IPTABLES'. Nómbralo /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

Finalmente

Finalmente, debe ejecutar el script en cada reinicio, agregue las dos líneas siguientes antes exit 0del archivo `/etc/rc.local 'para ejecutar el script creado anteriormente.

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

Ahora, simplemente reinicie su dispositivo y el puente funcionará para usted.

pd: sudose omitió por brevedad. Use sudo -iEpara tener una sesión comoroot

fcm
fuente
¡Guauu! ¡Muchas gracias por una respuesta tan detallada! Nunca me di cuenta de que sería tan complicado, pero creo que puedo abordarlo. De nuevo, gracias, lo probaré en un par de horas y, si funciona, te marcaré como la respuesta. Muchas gracias
@GrowlingSolid No debería ser tan complicado. La respuesta tiene que usar network-managerpara administrar redes, lo cual es incompatible con dhcpcd, que es el valor predeterminado para Raspbian. No hay nada de malo en usar un administrador alternativo, pero debe deshabilitarlo dhcpcd(la respuesta lo hace indirectamente, ya que dhcphará dhcpcdque se detenga). También evitará que funcione el soporte WiFi en la GUI.
Milliways
1
Me informé y llegué a esta línea correcta en lugar de la suya: INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' | awk -F ":" '/1/ {print $2}')Su versión "falsa" fue:INET_ADDRESS=$(ifconfig $INET_IFACE |grep "inet addr" |awk '{print $2}' |awk -F$
Luke_R