Bridge mit ARP-Proxy im Promisc-Modus

Bridge mit ARP-Proxy im Promisc-Modus

bearbeiten:Ich habe festgestellt, dass dies ein Duplikat ist vonWarum erfolgt die ARP-Antwort nur, wenn der Netzwerkadapter sich im Promiscuous-Modus befindet?.


Ich verwende einen Raspberry Pi 3B+ mit Rasbian Stretch und habe ihn mit Proxy-ARP gemäß dem Tutorial von Debian eingerichtet:Überbrücken von Netzwerkverbindungen mit Proxy ARPum eth0 mit wlan0 zu „überbrücken“. Demnach ist es einfach, Proxy-ARP einzurichten mit:

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.60ist der Client auf eth0, der mit wlan0 „überbrückt“ werden soll.

Aber es funktioniert nicht. Ich muss den Promiscuous-Modus auf wlan0 aktivieren, damit es funktioniert, konnte aber keine Hinweise dazu finden.

rpi3 ~# ip link set wlan0 promisc on

Ist der Promiscuous-Modus dafür erforderlich Stretch? Wenn nicht, wie kann ich ihn vermeiden?

Aktualisierung:
Überprüft, ob rp_filterauf 0 gesetzt ist.
hostapdist nicht installiert. wlan0befindet sich im Client-Modus und wird verwaltet von wpa_supplicant.

Antwort1

Anscheinend ist es nicht möglich, Ethernet-Frames zwischen Wireless im Client-Modus und Ethernet zu überbrücken. Es funktioniert beispielsweise nicht.

Seien Sie außerdem vorsichtig, wenn Sie als Client Frames aus anderen Quellen in eine AP-Infrastruktur einfügen.

Die meisten Access Points (APs) lehnen Frames ab, deren Quelladresse nicht beim AP authentifiziert wurde.

Antwort2

Es scheint nur ein Problem mit dem WLAN von Raspberry Pi zu sein. Auch eine doppelte FrageWarum erfolgt die ARP-Antwort nur, wenn der Netzwerkadapter sich im Promiscuous-Modus befindet?verwendet einen Raspberry Pi. Nirgendwo sonst in einem Tutorial findet sich ein Hinweis, den Promiscuous-Modus für Proxy-ARP zu aktivieren. Ich habe es auf meinem Laptop überprüft, wo Proxy-ARP ohne Promiscuous-Modus funktioniert.

Ich denke, dieses Problem kann nur von der RASPBERRY PI FOUNDATION und/oder ihrem Closed-Source-Treiberhersteller behoben werden. Bis dahin müssen wir damit leben.

Antwort3

Bridge mit ARP-Proxy im Promisc-Modus

Es ist möglich, Verbindungen von WiFi zu LAN zu "überbrücken" (z. B. auf einem Raspberry Pi Zero W mit MicroUSB-LAN-Adapter), wobei alle Geräte auf demgleiches Subnetz(IP-Bereich) mitARP-ProxymitPromisc-Modus.

Planen:
[Router] <---WLAN---> [RasPi wlan0 <---Bridge---> eth0] <---LAN-Kabel---> [Kabelgebundenes Gerät, zB Computer]

Hinweise:Die bereitgestellten Lösungen basieren auf diesen hervorragenden Quellen
Quelle Nr. 1von Pascal Geiser
Quelle #2von Will Haley

In diesen Beispielen verwendete Hardware/Betriebssystem:
Raspberry Pi Zero W mit MicroUSB-zu-LAN-Adapter
Raspbian Stretch Lite (08.04.2019) + Updates




Lösung Nr. 1 – ARP-Proxy über SCHNITTSTELLEN (manuelle Konfiguration)

Hinweis: Dies hängt davon ab, ob Ihr WLAN-Router die „IP Layer 3-Lösung“ (Netzwerkschicht) unterstützt.

1)Vorausgesetzt, die WLAN-Verbindung von Raspberry Pi zum Router ist bereits eingerichtet und verbunden

2)Pakete installieren

$ sudo apt-get install parprouted dhcp-helper

3)Bearbeiten und fügen Sie die folgenden Zeilen hinzu

:

  • wlan0ist die ID der in Raspberry integrierten WiFi-Karte
  • eth0ist die ID der kabelgebundenen Ethernet-Karte (MicroUSB-LAN-Adapter)
$ 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)Paketweiterleitung aktivieren:

$ 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)DHCP-Relay konfigurieren

Der DHCP-Helfer fängt Anfragen ab und leitet sie an den „echten“ DHCP-Server weiter:

$ 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)Konfigurieren Sie AVAHI.

Durch Aktivieren des „Reflektormodus“ können Clients alle mit der Bridge verbundenen Dienste durchsuchen:

$ sudo nano /etc/avahi/avahi-daemon.conf
# Find and change the following line
#enable-reflector=no
# to -->
enable-reflector=yes

7)RasPi neu starten

Nach dem Neustart sollte das über eth0/LAN verbundene Gerät Zugriff auf dasselbe Netzwerk wie der WLAN-Router erhalten.
Hinweis: Eine funktionierende Lösung hängt davon ab, ob Ihr WLAN-Router die „IP Layer 3-Lösung“ (Netzwerkschicht) unterstützt.

$ sudo reboot



Lösung Nr. 2 – ARP-Proxy über SERVICES (automatisierte Skriptlösung)

Hinweis: Dies hängt davon ab, ob Ihr WLAN-Router die „IP Layer 3-Lösung“ (Netzwerkschicht) unterstützt.

1)Erstellen Sie ein Bash-Skript mit diesem Inhalt:

$ 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)Führen Sie das Bash-Skript aus (überprüfen Sie die Ausgabe auf Fehler):

$ sudo bash bridge.sh

3)RasPi neu starten

Nach dem Neustart über eth0 / LAN sollte das angeschlossene Gerät Zugriff auf dasselbe Netzwerk wie der WLAN-Router haben. Hinweis: Dies hängt davon ab, ob Ihr WLAN-Router die „IP Layer 3-Lösung“ unterstützt.

$ sudo reboot



Allgemeine Hinweise:

  • ARP-Proxybraucht Unterstützungvom WLAN-Router auf „IP Layer 3 / Network layer“-Fähigkeiten (das kann man wohl einfach ausprobieren und herausfinden).
  • Bevorzugte Lösung über WDS (Thema wurde hier nicht behandelt) zur Bereitstellung einer Bridge-Lösung im gleichen Subnetz erfordert WDS-Unterstützung des WiFi-ChipsUndden WiFi-Router. Sie können den WiFi-Chip Ihres Raspberry Pi auf WDS-Unterstützung prüfen mit
$ iw list

im AbschnittUnterstützte Schnittstellenmodi

Wiphy phy0
...
    Supported interface modes:
         * IBSS
         * managed
         * AP
         * AP/VLAN
         * WDS
         * monitor
         * mesh point
...

WennWDSIstnicht eindeutig aufgeführthier ist WDSnicht unterstütztdurch den WiFi-Chip (Raspberry Pi Zero W unterstützt kein WDS).

verwandte Informationen