
редактировать:Я обнаружил, что это дубликатПочему ARP-ответ выполняется только тогда, когда сетевой адаптер находится в неразборчивом режиме?.
Я использую Raspberry Pi 3B+ с Raspberry Stretch и настраиваю его с помощью proxy arp, следуя руководству от Debian:Объединение сетевых подключений с помощью Proxy ARPдля "моста" eth0 к wlan0. Согласно этому, легко настроить proxy arp с помощью:
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
клиент на eth0, который должен быть «подключен» к wlan0.
Но это не работает. Мне нужно включить неразборчивый режим на wlan0, чтобы это заработало, но не удалось найти никаких подсказок, как это сделать.
rpi3 ~# ip link set wlan0 promisc on
Нужен ли режим неразборчивых отношений для Stretch
? Если нет, то как его избежать?
обновления:
Проверил, что rp_filter
установлено значение 0.
hostapd
не установлен. wlan0
находится в режиме клиента и управляется wpa_supplicant
.
решение1
По-видимому, невозможно организовать мост Ethernet-кадры между беспроводной сетью в клиентском режиме и Ethernet. Например, это не будет работать.
Кроме того, будьте осторожны при внедрении кадров из других источников в инфраструктуру точки доступа в качестве клиента.
большинство точек доступа (AP) отклоняют кадры, адрес источника которых не прошел аутентификацию на AP.
решение2
Кажется, проблема только в Wi-Fi от Raspberry Pi. Также дубликат вопросаПочему ARP-ответ выполняется только тогда, когда сетевой адаптер находится в неразборчивом режиме?использует Raspberry Pi. Нигде больше в руководстве не найти примечания о включении неразборчивого режима для proxy arp. Я проверил это на своем ноутбуке, где proxy arp работает без неразборчивого режима.
Я думаю, что эта проблема может быть решена только RASPBERRY PI FOUNDATION и/или производителем его драйвера с закрытым исходным кодом. До тех пор нам придется с этим жить.
решение3
Мост с использованием ARP-прокси в режиме promisc
Можно создать «мост» между соединениями WiFi-LAN (например, на Raspberry Pi Zero W с адаптером microUSB-LAN), подключив все устройства кта же подсеть(IP-диапазон) с использованиемARP-проксисрежим promisc.
•Схема:
[Маршрутизатор] <---WiFi---> [RasPi wlan0 <---мост---> eth0] <---кабель LAN---> [Проводное устройство, например компьютер]
•Подсказки:Предоставленные решения основаны на этих превосходных источниках
Источник №1Паскаль Гейзер
Источник №2Уилл Хейли
•Аппаратное обеспечение/ОС, используемые в этих примерах:
Raspberry Pi Zero W с адаптером microUSB-LAN
Raspbian Stretch Lite (2019-04-08) + обновления
Решение №1 - ARP-прокси через ИНТЕРФЕЙСЫ (ручная настройка)
Примечание: это зависит от того, поддерживает ли ваш WiFi-маршрутизатор «решение IP Layer 3» (сетевой уровень).
1)Предположим, что WiFi-подключение Raspberry Pi к маршрутизатору уже настроено и подключено.
2)Установить пакеты
$ sudo apt-get install parprouted dhcp-helper
3)Отредактируйте и добавьте следующие строки:
Предположим,
- wlan0это идентификатор встроенной карты WiFi Raspberry
- eth0это идентификатор проводной сетевой карты (адаптер 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)Включить пересылку пакетов:
$ 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.
DHCP-помощник будет перехватывать запросы и пересылать их на «реальный» DHCP-сервер:
$ 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)Настройка AVAHI
Включение «рефлекторного режима» позволит клиентам просматривать все службы, подключенные к мосту:
$ sudo nano /etc/avahi/avahi-daemon.conf
# Find and change the following line
#enable-reflector=no
# to -->
enable-reflector=yes
7)Перезагрузите RasPi
После перезагрузки через eth0 / LAN подключенное устройство должно получить доступ к той же сети WiFi-маршрутизатора.
Примечание: рабочее решение зависит от того, поддерживает ли ваш WiFi-маршрутизатор "решение IP Layer 3" (сетевой уровень)
$ sudo reboot
Решение №2 - ARP-прокси через SERVICES (автоматизированное скриптовое решение)
Примечание: это зависит от того, поддерживает ли ваш WiFi-маршрутизатор «решение IP Layer 3» (сетевой уровень).
1)Создайте bash-скрипт со следующим содержимым:
$ 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)Выполните bash-скрипт (проверьте вывод на наличие ошибок):
$ sudo bash bridge.sh
3)Перезагрузите RasPi
После перезагрузки через eth0 / LAN подключенное устройство должно получить доступ к той же сети WiFi-маршрутизатора. Примечание: это зависит от того, поддерживает ли ваш WiFi-маршрутизатор "решение IP Layer 3"
$ sudo reboot
Главные примечания:
- ARP-прокситребуется поддержкамаршрутизатором WiFi для возможностей «IP Layer 3 / Network layer» (думаю, вы можете просто попробовать и выяснить).
- Предпочтительное решение через WDS (тема здесь не рассматривалась) для предоставления мостового решения в той же подсети требует поддержки WDS чипом WiFiиWiFi-роутер. Вы можете проверить WiFi-чип вашего Raspberry Pi на поддержку WDS с помощью
$ iw list
в разделеПоддерживаемые режимы интерфейса
Wiphy phy0
...
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* WDS
* monitor
* mesh point
...
ЕслиВДСявляетсяне указано отдельноздесь, тогда WDS естьне поддерживаетсяс помощью чипа WiFi (Raspberry Pi Zero W не поддерживает WDS).