Тщательно выбирайте свой IP-план

Тщательно выбирайте свой IP-план

У меня есть несколько плат Raspberry Pi 3 Model B с подключенным к ним внешним адаптером Wi-Fi. Моя цель:

  1. Создайте ячеистую сеть из устройств RSP.
  2. Каждая плата RSP должна иметь собственную точку доступа, к которой могут быть подключены клиенты (мобильные телефоны/ноутбуки).
  3. Клиенты этих точек доступа могут перемещаться между устройствами 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

  1. Настройте свой RPi wlan1(публичныйинтерфейс) для использованиязафиксированныйIP 172.17.xxx.254, где xxxуникален среди всех ваших RP и не равен 0 (см. выше). Сетевая маска — 255.255.255.0.

  2. Настройте свой RPi wlan0(частныйинтерфейс) для использованиязафиксированныйIP 172.17.0.xxx, где xxxто же самое, что и выше. Сетевая маска 255.255.255.0.

  3. На каждом 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-сервера для публичных сетей. Чтобы правильно настроить пользовательские устройства, вам нужно будет настроить его параметры.

  1. Настройте DHCP так, чтобы он обслуживал адреса в диапазоне, адаптированном к сети, от IE 172.17.xxx.1до 172.17.xxx.253.

  2. Добавьте статический маршрут в часть DHCP конфигурации dnsmasq (снова заменив xxxсоответствующим образом):

    dhcp-option=121,16.172.17.0.0,172.17.xxx.254
    

Используя статический маршрут, избегайте перезаписи шлюза по умолчанию ваших клиентов. Таким образом, если они все еще подключены к другой сети (например, ноутбук с подключенным Ethernet), у них не должно возникнуть никаких проблем.

Обязательно протестируйте это с 1 или 2 Pi и 1 или 2 клиентами, прежде чем приступать к настройке.всеваши RP-ы.

Связанный контент