
editar:He descubierto que este es un duplicado de¿Por qué ARP Response solo cuando el adaptador de red está en modo promiscuo?.
Utilizo una Raspberry Pi 3B+ con Rasbian Stretch y la configuro con proxy arp siguiendo el tutorial de Debian:Puente de conexiones de red con Proxy ARPpara "puentear" eth0 a wlan0. De acuerdo con esto, es fácil configurar proxy arp con:
rpi3 ~# echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
rpi3 ~# echo 1 > /proc/sys/net/ipv4/ip_forward
rpi3 ~# ip route add 192.168.10.60/32 dev eth0
192.168.10.60
es el cliente en eth0 que debe "conectarse" a wlan0.
Pero no funciona. Tengo que habilitar el modo promiscuo en wlan0 para que funcione, pero no pude encontrar ninguna pista para hacerlo.
rpi3 ~# ip link set wlan0 promisc on
¿Se necesita el modo promiscuo para Stretch
? Si no, ¿cómo puedo evitarlo?
actualizaciones:
Comprobado que rp_filter
está configurado en 0.
hostapd
No está instalado. wlan0
está en modo cliente y administrado por wpa_supplicant
.
Respuesta1
Aparentemente, no es posible conectar tramas de Ethernet entre la conexión inalámbrica en modo cliente y Ethernet. por ejemplo, no funcionará.
Además, tenga cuidado al inyectar tramas de otras fuentes en una infraestructura AP como cliente.
la mayoría de los puntos de acceso (AP) rechazarán tramas que tengan una dirección de origen que no se haya autenticado con el AP.
Respuesta2
Parece ser sólo un problema con el wifi de Raspberry Pi. También una pregunta duplicada.¿Por qué ARP Response solo cuando el adaptador de red está en modo promiscuo?utiliza una frambuesa pi. En ningún otro lugar de ningún tutorial se puede encontrar una nota para habilitar el modo promiscuo para proxy arp. Lo verifiqué en mi computadora portátil donde proxy arp funciona sin modo promiscuo.
Creo que este problema solo puede solucionarlo la FUNDACIÓN RASPBERRY PI y/o su fabricante de controladores de código cerrado. Hasta entonces tendremos que vivir con ello.
Respuesta3
Puente usando ARP-proxy con modo promisc
Es posible "puentear" conexiones de WiFi a LAN (por ejemplo, en una Raspberry Pi Zero W con adaptador microUSB-LAN) teniendo todos los dispositivos en elmisma subred(rango IP) usandoproxy ARPconmodo promisco.
•Esquema:
[Enrutador] <---WiFi---> [RasPi wlan0 <---puente---> eth0] <---Cable LAN---> [Dispositivo cableado, por ejemplo, computadora]
•Consejos:Las soluciones proporcionadas se basan en estas excelentes fuentes.
Fuente #1por Pascal Geiser
Fuente #2por Will Haley
•Hardware/SO utilizado en estos ejemplos:
Raspberry Pi Zero W con adaptador microUSB a LAN
Raspbian Stretch Lite (2019-04-08) + Actualizaciones
Solución n.º 1: proxy ARP a través de INTERFACES (configuración manual)
Nota: Esto depende de si su enrutador WiFi admite la "solución IP Capa 3" (capa de red)
1)Suponiendo que la conexión WiFi de Raspberry Pi al enrutador ya esté configurada y conectada
2)Instalar paquetes
$ sudo apt-get install parprouted dhcp-helper
3)Edite y agregue las siguientes líneas:
Suponiendo
- wlan0¿Es el ID de Raspberry integrado en la tarjeta WiFi?
- eth0es el ID de la tarjeta Ethernet cableada (adaptador microUSB-LAN)
$ sudo nano /etc/network/interfaces
# Clone the dhcp-allocated IP to eth0 so dhcp-helper will relay for the correct subnet
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
pre-up /sbin/ip link set wlan0 promisc on
post-down /sbin/ip link set wlan0 promisc off
post-up /usr/sbin/parprouted eth0 wlan0
post-down /usr/bin/killall /usr/sbin/parprouted
post-up /etc/init.d/dhcp-helper restart
pre-up /sbin/ifup eth0
post-up /sbin/ip addr add $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0
pre-down /sbin/ip addr del $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0
post-down /sbin/ifdown eth0
# Set ethernet interface to "manual" mode
auto eth0
allow-hotplug eth0
iface eth0 inet manual
4)Habilitar el reenvío de paquetes:
$ sudo nano /etc/sysctl.conf
# Find and uncomment this line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
# to -->
net.ipv4.ip_forward=1
5)Configurar DHCP Relay
El asistente DHCP captará las solicitudes y las reenviará al servidor DHCP "real":
$ sudo nano /etc/default/dhcp-helper
# Change eth0 by the name of your wireless interface (e.g. wlan0)
#DHCPHELPER_OPTS="-b eth0"
# to -->
DHCPHELPER_OPTS="-b wlan0"
6)Configurar AVAHI
Habilitar el "modo reflector" permitirá a los clientes explorar todos los servicios conectados al puente:
$ sudo nano /etc/avahi/avahi-daemon.conf
# Find and change the following line
#enable-reflector=no
# to -->
enable-reflector=yes
7)Reinicie RasPi
Después de reiniciar, a través del dispositivo conectado eth0/LAN debería obtener acceso a la misma red del enrutador WiFi.
Nota: La solución de trabajo depende de si su enrutador WiFi admite la "solución IP Capa 3" (capa de red)
$ sudo reboot
Solución n.º 2: proxy ARP a través de SERVICIOS (solución de script automatizada)
Nota: Esto depende de si su enrutador WiFi admite la "solución IP Capa 3" (capa de red)
1)Cree bash-script con estos contenidos:
$ sudo nano bridge.sh
#!/usr/bin/env bash
set -e
[ $EUID -ne 0 ] && echo "run as root" >&2 && exit 1
##########################################################
# You should not need to update anything below this line #
##########################################################
# Credits to Will Haley
# Mainly based on source: https://willhaley.com/blog/raspberry-pi-wifi-ethernet-bridge/#option-1---same-subnet
# Edited on line #52 by Tomtom: path to systemd for parprouted.service
# parprouted - Proxy ARP IP bridging daemon
# dhcp-helper - DHCP/BOOTP relay agent
apt update && apt install -y parprouted dhcp-helper
systemctl stop dhcp-helper
systemctl enable dhcp-helper
# Enable ipv4 forwarding.
sed -i'' s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/ /etc/sysctl.conf
# Service configuration for standard WiFi connection. Connectivity will
# be lost if the username and password are incorrect.
systemctl restart wpa_supplicant.service
# Enable IP forwarding for wlan0 if it's not already enabled.
grep '^option ip-forwarding 1$' /etc/dhcpcd.conf || printf "option ip-forwarding 1\n" >> /etc/dhcpcd.conf
# Disable dhcpcd control of eth0.
grep '^denyinterfaces eth0$' /etc/dhcpcd.conf || printf "denyinterfaces eth0\n" >> /etc/dhcpcd.conf
# Configure dhcp-helper.
cat > /etc/default/dhcp-helper <<EOF
DHCPHELPER_OPTS="-b wlan0"
EOF
# Enable avahi reflector if it's not already enabled.
sed -i'' 's/#enable-reflector=no/enable-reflector=yes/' /etc/avahi/avahi-daemon.conf
grep '^enable-reflector=yes$' /etc/avahi/avahi-daemon.conf || {
printf "something went wrong...\n\n"
printf "Manually set 'enable-reflector=yes in /etc/avahi/avahi-daemon.conf'\n"
}
# I have to admit, I do not understand ARP and IP forwarding enough to explain
# exactly what is happening here. I am building off the work of others. In short
# this is a service to forward traffic from WiFi to Ethernet.
#cat <<'EOF' >/usr/lib/systemd/system/parprouted.service
cat <<'EOF' >/etc/systemd/system/parprouted.service
[Unit]
Description=proxy arp routing service
Documentation=https://raspberrypi.stackexchange.com/q/88954/79866
Requires=sys-subsystem-net-devices-wlan0.device dhcpcd.service
After=sys-subsystem-net-devices-wlan0.device dhcpcd.service
[Service]
Type=forking
# Restart until wlan0 gained carrier
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
# clone the dhcp-allocated IP to eth0 so dhcp-helper will relay for the correct subnet
ExecStartPre=/bin/bash -c '/sbin/ip addr add $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'
ExecStartPre=/sbin/ip link set dev eth0 up
ExecStartPre=/sbin/ip link set wlan0 promisc on
ExecStart=-/usr/sbin/parprouted eth0 wlan0
ExecStopPost=/sbin/ip link set wlan0 promisc off
ExecStopPost=/sbin/ip link set dev eth0 down
ExecStopPost=/bin/bash -c '/sbin/ip addr del $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'
[Install]
WantedBy=wpa_supplicant.service
EOF
systemctl daemon-reload
systemctl enable parprouted
systemctl start parprouted dhcp-helper
2)Ejecute el script bash (verifique el resultado para ver si hay errores):
$ sudo bash bridge.sh
3)Reinicie RasPi
Después de reiniciar a través de eth0/LAN, el dispositivo conectado debería tener acceso a la misma red del enrutador WiFi. Nota: Esto depende de si su enrutador WiFi admite la "solución IP Capa 3"
$ sudo reboot
Notas generales:
- proxy ARPrequiere apoyopor el enrutador WiFi para las capacidades de "Capa IP 3 / Capa de red" (supongo que puedes intentar descubrirlo).
- La solución preferida a través de WDS (el tema no se ha tratado aquí) para proporcionar una solución puente en la misma subred requiere soporte WDS del chip WiFi.yel enrutador WiFi. Puede comprobar si el chip WiFi de su Raspberry Pi es compatible con WDS con
$ iw list
en la secciónModos de interfaz soportados
Wiphy phy0
...
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* WDS
* monitor
* mesh point
...
SiWDSesno listado claramenteaquí, entonces WDS esNo soportadopor el chip WiFi (Raspberry Pi Zero W no es compatible con WDS).