
У меня есть несколько плат Raspberry Pi 3 Model B с подключенным к ним внешним адаптером Wi-Fi. Моя цель:
- Создайте ячеистую сеть из устройств RSP.
- Каждая плата RSP должна иметь собственную точку доступа, к которой могут быть подключены клиенты (мобильные телефоны/ноутбуки).
- Клиенты этих точек доступа могут перемещаться между устройствами RSP разного диапазона и при этом иметь возможность общаться друг с другом независимо от того, к какой точке доступа они подключены (как будто они подключены к одной сети).
Для исправления ошибки №1: я использовал batman-adv на внутреннем интерфейсе Wi-Fi (wlan0) RSP3, и теперь все устройства могут пинговать друг друга через свои виртуальные интерфейсы bat0.
Для #2: я использовал внешний адаптер Wi-Fi (wlan1) и с помощью hostapd и dnsmasq я могу запустить AP (один и тот же ssid и канал на всех AP) на каждой из плат RSP. Я также подключил несколько мобильных устройств к разным AP.
Моя главная проблема, которая меня блокирует, — это задача №3:
Чтобы решить эту проблему, я попытался создать мост между интерфейсами wlan0 и wlan1 с помощью инструмента bridge-utils. Но в RSP оба интерфейса не поддерживают модуль WDS. Поэтому до сих пор я не могу создать единую сеть для всех клиентов. Я также попытался использовать переадресацию IP между wlan0 и wlan1, но не могу пинговать подключенных клиентов с других устройств RSP.
Существует ли другой подход (кроме WDS) для создания единой сети для всех подключенных клиентов?
решение1
Чтобы все это заработало, нужно доработать несколько вещей.
Во-первых, не следует размещать все точки доступа wlan1 RPI на одном и том же канале, поскольку это приведет к возникновению значительных помех между ними.
Вам также не нужно использовать WDS. Смотритеэто объяснениедля получения дополнительной информации об этом. Просто убедитесь, что у каждой точки доступа одинаковый SSID, тип безопасности WiFi и одинаковый пароль.
У вас правильная идея, что вам нужно создать мост между wlan0 и wlan1 на каждом RPI. Я не знаком с bridge-utils, но, вероятно, будет лучше просто следовать инструкциям по созданию моста в документации batman-advздесь.
Еще одно замечание: вам, вероятно, не нужно запускать dnsmasq для служб DHCP. Ваши клиенты могли бы просто использовать свои автоматически назначенные локальные IPv6-адреса для связи друг с другом по этой беспроводной локальной сети.
РЕДАКТИРОВАТЬ:Моя ошибка. Похоже, что создание настоящего моста с использованием WLAN на RPI3 не поддерживается. Похоже, что есть потенциальный обходной путь с использованием NATздесь. Это также возможно, если подключить два внешних адаптера WiFi, поддерживающих мостовые соединения.
решение2
Вы ничего не сказали о конфигурации IP, а именно конфигурация IP и нужна для решения проблемы №3.
Тщательно выбирайте свой IP-план
Вся ваша сеть будет иметь "общую схему IP". Например, многие сети используют 192.168.*.*
.
Вы можете использоватьлюбое частное пространство IP, как в IPv4, так и в IPv6. Убедитесь, что он не будет конфликтовать с другими сетями ваших пользователей.или RPisможет быть связано с.
Например, предположим, что мы будем использовать глобальную сеть 172.17.*.*
. Обратите внимание, что адреса «все нули» ( 172.17.*.0
) и «все единицы» ( 172.17.*.255
) зарезервированы (т.е. не могут быть использованы) в сети и всех ее подразделениях.
Нам придется разделить эту большую сеть на более мелкие сети, которые каждый RPi будет использовать независимо. Одна из подсетей будет использоваться для связи между RPi, для этого мы оставим ее 172.17.0.*
себе. Мы могли бы использовать другой номер, но использование 0 упрощает настройку Pis с помощью скрипта.
«Публичная» часть сети будет использовать IP-адреса, 172.17.xxx.*
где xxx
уникален для каждого RPi. Опять же, чтобы упростить скрипт, мы начинаем с 1 и увеличиваем.
RPi нужен IP вобасетей. Для публичной сети лучше всего использовать .254
, поэтому будет 172.17.xxx.254
. Но что насчет центральной сети? RPi будет использоваться в качестве шлюза к сети 172.17.xxx.*
другими RPi. Было бы логично сопоставить IP-адрес с ретранслируемой сетью: мы будем использовать 172.17.0.xxx
.
Настройте Pis
Настройте свой RPi
wlan1
(публичныйинтерфейс) для использованиязафиксированныйIP172.17.xxx.254
, гдеxxx
уникален среди всех ваших RP и не равен 0 (см. выше). Сетевая маска —255.255.255.0
.Настройте свой RPi
wlan0
(частныйинтерфейс) для использованиязафиксированныйIP172.17.0.xxx
, гдеxxx
то же самое, что и выше. Сетевая маска255.255.255.0
.На каждом RPi запустите следующий скрипт, заменив его
$END
на количество используемых вами RPi:echo 1 > /proc/sys/net/ipv4/ip_forward for i in $(seq 1 $END); do route add -net 172.17.$i.0 netmask 255.255.255.0 gw 172.17.0.$i; done iptables -A FORWARD -s 172.17.0.0/16 -d 172.17.0.0/16 -j ACCEPT
TL;DR, мы делаем следующее: мы выбираем большую сеть, здесь 172.17.0.0/16
. Мы подразделяем ее на 255 меньших сетей: 172.17.xxx.0/24
. Мы оставляем 0
для себя, а все остальные числа даем пользователям. Затем мы говорим RPi передавать пакеты, направленные на другие компьютеры, на соответствующий «шлюз» RPi.
Сообщите устройствам пользователей, чтобы они смотрели в нужном месте
Я предполагаю, что вы используете dnsmasq в качестве DHCP-сервера для публичных сетей. Чтобы правильно настроить пользовательские устройства, вам нужно будет настроить его параметры.
Настройте DHCP так, чтобы он обслуживал адреса в диапазоне, адаптированном к сети, от IE
172.17.xxx.1
до172.17.xxx.253
.Добавьте статический маршрут в часть DHCP конфигурации dnsmasq (снова заменив
xxx
соответствующим образом):dhcp-option=121,16.172.17.0.0,172.17.xxx.254
Используя статический маршрут, избегайте перезаписи шлюза по умолчанию ваших клиентов. Таким образом, если они все еще подключены к другой сети (например, ноутбук с подключенным Ethernet), у них не должно возникнуть никаких проблем.
Обязательно протестируйте это с 1 или 2 Pi и 1 или 2 клиентами, прежде чем приступать к настройке.всеваши RP-ы.