![](https://habrastorage.org/getpro/habr/post_images/967/b65/9d2/967b659d291d3021a9a93f68b4b305b2.jpg)
- Выбор комплектующих
- Запуск сетевых интерфейсов
- Установка точки доступа 802.11ac (5 ГГц)
- Настройка виртуального SSID с помощью hostapd
Последние десять лет я покупал дешёвое сетевое оборудование и ставил на него DD-WRT, чтобы вернуть «функции» ценой более $500, удалённые из ядра Linux, на котором основаны стоковые прошивки.
Несмотря на нестабильные сборки, неисправленные ошибки и споры, DD-WRT всё равно предпочтительнее стоковых прошивок. Но сейчас достойные комплектующие дешевле, чем когда-либо, а DIY-сообщество поголовно перешло на Linux (я смотрю на вас, м-р Raspberry), так почему бы не собрать собственный беспроводной маршрутизатор раз и навсегда?
Выбор комплектующих
Первым делом нужно определиться с платформой: x86 или ARM? Не буду подробно обсуждать ключевые различия, но вкратце: у первой лучше производительность, а вторая дешевле и энергоэффективнее. Платы Raspberry Pi (и аналоги) чрезвычайно дёшевы и, вероятно, мощнее большинства беспроводных коммерческих маршрутизаторов, но платформы x86 широко распространены и имеют преимущество за счёт стандартизированных форм-факторов и портов расширения.
Конечно, самая важная деталь — это чипсет. Сегодня стандартами де-факто являются 802.11n (2,4 ГГц) и 802.11ac (5 ГГц), но подобрать драйверы под Linux — та ещё задачка, тем более с поддержкой режима AP (точка доступа). Короче, если не хотите проблем, то выбирайте чипсеты Atheros. Драйверы ath9k и ath10k хорошо поддерживаются, вы легко найдёте их с интерфейсами USB и/или mini-PCIe.
Хотя бы один контроллер сетевого интерфейса (NIC) — необходимый минимум, а RAM и накопитель выбирайте на свой вкус.
Список материалов
Принеся в жертву цену и энергопотребление, я выбрал x86-платформу ради модульной, относительно мощной конфигурации, доступной для апгрейда.
Если вам не нужен ARM, то и вентилятор не обязателен.
- Gigabyte GA-J1900N-D3V (J1900 четырёхъядерный 2 ГГц Celeron, два NIC)
- Airetos AEX-QCA9880-NX (двухдиапазонный 802.11ac, MIMO)
- 4 ГБ RAM (DDR3-LP, 1333 МГц, 1,35 В)
- Удлинитель mPCIe
- Корпус MX500 mini-ITX
- Три двухдиапазонных антенны 6dBi RP-SMA + кабель RP-SMA
- PicoPSU-90
- Запасной HDD 2.5”
Корпус просторный, с двумя подготовленными отверстиями для штепсельной вилки AC/DC. Установка материнской платы, RAM и Pico-PSU прошла гладко:
![](https://habrastorage.org/getpro/habr/post_images/7ad/455/84b/7ad45584b277d11fa3f1a7b119759ebc.jpg)
Железячное порно
Самым сложным оказалась установка mini-PCIe WiFi, потому что плата поддерживает только карты половинного размера: здесь на помощь пришёл удлинитель mPCIe. Я взял кабель FFC на 20 см (входит в комплект) для подключения обеих сторон адаптера и закрепил mini-PCIe на шасси с помощью двустороннего скотча.
![](https://habrastorage.org/getpro/habr/post_images/db1/c7a/8f7/db1c7a8f756c70176d86ce9441d5cf7a.jpg)
![](https://habrastorage.org/getpro/habr/post_images/5bb/b09/5c7/5bbb095c759ac5cd9be3cf316070ab22.jpg)
![](https://habrastorage.org/getpro/habr/post_images/3a4/e91/9b8/3a4e919b817344fdc03d98bb1e9d001f.jpg)
Расширитель mini-PCIe
К счастью, корпус поставляется с тремя предварительно вырезанными отверстиями для антенн. Вот окончательный результат:
![](https://habrastorage.org/getpro/habr/post_images/967/b65/9d2/967b659d291d3021a9a93f68b4b305b2.jpg)
![](https://habrastorage.org/getpro/habr/post_images/c3d/82d/a98/c3d82da9842de641d8d3a4dec3cfe517.jpg)
Программное обеспечение
Понятно, что ставим Linux. В зависимости от оборудования, это может быть оптимизированный дистрибутив вроде Raspbian (для Raspberry Pi) или любой другой дистрибутив Linux, который вам нравится. Поскольку я много лет использую Ubuntu, то выбрал Ubuntu Server 18.04 LTS, с которым мне привычнее работать и которому обеспечена долгосрочная поддержки.
В дальнейшем статья предполагает, что вы используете дистрибутив на базе Debian.
Если установка прошла нормально и вы зашли в консоль, определим имена интерфейсов:
$ ip -br a | awk '{print $1}'
lo
enp1s0
enp2s0
wlp5s0
На материнской плате два встроенных NIC: это
enp1s0
и enp2s0
. Беспроводная карта отображается как wlp5s0
и поддерживает режим AP, как и предполагалось:$ iw list
...
Supported interface modes:
* managed
* AP
* AP/VLAN
* monitor
* mesh point
Теперь можем обрисовать, что нам нужно: первый NIC поставим как WAN-порт, а второй соединим с беспроводным интерфейсом:
![](https://habrastorage.org/getpro/habr/post_images/5e6/f00/dd4/5e6f00dd4994b5dc252d70dda1d325ec.png)
Сеть
Если у вас Ubuntu 18.04, то немедленно избавимся от
netplan
, чтобы вернуться к поддержке /etc/network/interfaces:$ sudo apt-get install ifupdown bridge-utils
$ sudo systemctl stop networkd-dispatcher
$ sudo systemctl disable networkd-dispatcher
$ sudo systemctl mask networkd-dispatcher
$ sudo apt-get purge nplan netplan.io
В качестве DHCP/DNS-сервера выберем dnsmasq:
$ sudo apt-get install dnsmasq
Так как мы будем запускать и настраивать процесс
dnsmasq
через хук post-up
, не забудьте отключить демон при загрузке:$ sudo sed -i "s/^ENABLED=1$/ENABLED=0/g" /etc/default/dnsmasq
Напишем предварительную конфигурацию сетевых интерфейсов в соответствии с диаграммой, включая минимальную настройку
dnsmasq
:$ cat /etc/network/interfaces
# Loopback
auto lo
iface lo inet loopback
# WAN interface
auto enp1s0
iface enp1s0 inet dhcp
# Bridge (LAN)
auto br0
iface br0 inet static
address 192.168.1.1
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
bridge_ports enp2s0
post-up /usr/sbin/dnsmasq \
--pid-file=/var/run/dnsmasq.$IFACE.pid \
--dhcp-leasefile=/var/lib/misc/dnsmasq.$IFACE.leases \
--conf-file=/dev/null \
--interface=$IFACE --except-interface=lo \
--bind-interfaces \
--dhcp-range=192.168.1.10,192.168.1.150,24h
pre-down cat /var/run/dnsmasq.$IFACE.pid | xargs kill
Документация
/etc/network/interfaces
здесьКак вы могли заметить по секции
post-up
, dnsmasq стартует, как только поднимается мост. Его настройка выполняется только аргументами командной строки (--conf-file=/dev/null
), и процесс остановится при отключении интерфейса.В поле
bridge_ports
специально не указан интерфейс wlp5s0
, потому что hostapd
добавит его к мосту автоматически (brctl может отказаться делать это, прежде чем запущен hostapd для изменения режима интерфейса).См. документацию по
dnsmasq
. Теперь можно перезапустить сеть (
sudo service networking restart
) или просто перезагрузиться, чтобы проверить правильность настройки конфигурации сети.Обратите внимание: хотя мы в данный момент можем получить DHCP от
enp2s0
, но у нас не будет ни беспроводной связи (позже подробнее об этом), ни доступа в интернет (см. ниже).Маршрутизация
На этом этапе нужно маршрутизировать пакеты между интерфейсами LAN (
enp2s0
) и WAN (enp1s0
) и включить трансляцию сетевых адресов.Включить переадресацию пакетов легко:
$ sudo sysctl -w net.ipv4.ip_forward=1
$ echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
Последняя команда гарантирует, что конфигурация сохранится до следующей перезагрузки.
Трансляция сетевых адресов — другое дело, обычно придётся разбираться (или, скорее, бороться) с
iptables
. К счастью, каменный век давно закончился, и ребята из FireHol приложили немало усилий, добавив необходимый уровень абстракции:$ sudo apt-get install firehol
FireHOL — это язык для защищённого файрвола с сохранением состояния, его конфигурация легко понятна и доступна. Больше не надо писать операторы
iptables
: конфигурационный файл сам транслируется в операторы iptables
и применяется как надо. Никакого демона в фоновом режиме.Включение трансляции сетевых адресов для интерфейсов локальной сети с добавлением минимальных правил файрвола делается элементарно:
$ cat /etc/firehol/firehol.conf
version 6
# Accept all client traffic on WAN
interface enp1s0 wan
client all accept
# Accept all traffic on LAN
interface br0 lan
server all accept
client all accept
# Route packets between LAN and WAN
router lan2wan inface br0 outface enp1s0
masquerade
route all accept
FireHOL написан людьми для людей, документация здесь.
Можете проверить настройки, вручную запустив
firehol
(sudo firehol start
) и подключив ноутбук к порту LAN: теперь вы сможете выйти интернет, если подключен порт WAN.Перед перезагрузкой не забудьте отредактировать
/etc/default/firehol
, чтобы разрешить запуск FireHol при загрузке:$ sudo sed -i -E "s/^START_FIREHOL=.+$/START_FIREHOL=YES/g" /etc/default/firehol
Не буду вдаваться в детали всего синтаксиса
firehol
, конфигурационный файл сам себя объясняет, рекомендую обратиться к документации в случае более сложной настройки. Если вам действительно интересно, что firehol
сотворил с iptables
, просто введите sudo firehol status
в командной строке. Беспроводная точка доступа
Очевидно, управлять точкой доступа будем с помощью hostapd:
$ sudo apt-get install hostapd
Ниже вы найдёте минимальный и почти не требующий пояснений файл конфигурации 802.11 n/2.4 Ghz/WPA2-AES:
$ cat /etc/hostapd/hostapd-simple.conf
#### Interface configuration ####
interface=wlp5s0
bridge=br0
driver=nl80211
##### IEEE 802.11 related configuration #####
ssid=iCanHearYouHavingSex
hw_mode=g
channel=1
auth_algs=1
wmm_enabled=1
##### IEEE 802.11n related configuration #####
ieee80211n=1
##### WPA/IEEE 802.11i configuration #####
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=YouCantGuess
Документацию
hostpad.conf
см. в /usr/share/doc/hostapd/examples/hostapd.conf
.Описанную конфигурацию можно протестировать вручную:
$ sudo hostapd /etc/hostapd/hostapd-simple.conf
Если всё идёт хорошо, появится беспроводное подключение. Если вы удовлетворены результатом, не забудьте изменить конфигурацию, чтобы запустить
hostapd
сразу как поднимется интерфейс (как показано ниже).Вот ваш окончательный
/etc/network/interfaces:
$ cat /etc/network/interfaces
# Loopback
auto lo
iface lo inet loopback
# WAN interface
auto enp1s0
iface enp1s0 inet dhcp
# Bridge (LAN)
auto br0
iface br0 inet static
address 192.168.1.1
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
bridge_ports enp2s0
post-up /usr/sbin/hostapd \
-P /var/run/hostapd.$IFACE.pid \
-B /etc/hostapd/hostapd-simple.conf
post-up /usr/sbin/dnsmasq \
--pid-file=/var/run/dnsmasq.$IFACE.pid \
--dhcp-leasefile=/var/lib/misc/dnsmasq.$IFACE.leases \
--conf-file=/dev/null \
--interface=$IFACE --except-interface=lo \
--bind-interfaces \
--dhcp-range=192.168.1.10,192.168.1.150,24h
pre-down cat /var/run/dnsmasq.$IFACE.pid | xargs kill
pre-down cat /var/run/hostapd.$IFACE.pid | xargs kill
Установка точки доступа 802.11ac (5 ГГц)
Пассивное сканирование
Согласно документации Airetos AEX-QCA9880-NX, чипсет поддерживает 802.11ac, так что мы можем уйти из переполненных каналов 2,4 ГГц в райские 5 ГГц.
Посмотрим, какие частоты поддерживаются:
$ iw list
...
Frequencies:
* 2412 MHz [1] (20.0 dBm)
* 2417 MHz [2] (20.0 dBm)
* 2422 MHz [3] (20.0 dBm)
* 2427 MHz [4] (20.0 dBm)
* 2432 MHz [5] (20.0 dBm)
* 2437 MHz [6] (20.0 dBm)
* 2442 MHz [7] (20.0 dBm)
* 2447 MHz [8] (20.0 dBm)
* 2452 MHz [9] (20.0 dBm)
* 2457 MHz [10] (20.0 dBm)
* 2462 MHz [11] (20.0 dBm)
* 2467 MHz [12] (disabled)
* 2472 MHz [13] (disabled)
* 2484 MHz [14] (disabled)
...
Frequencies:
* 5180 MHz [36] (17.0 dBm) (no IR)
* 5200 MHz [40] (17.0 dBm) (no IR)
* 5220 MHz [44] (17.0 dBm) (no IR)
* 5240 MHz [48] (17.0 dBm) (no IR)
* 5260 MHz [52] (23.0 dBm) (no IR, radar detection)
* 5280 MHz [56] (23.0 dBm) (no IR, radar detection)
* 5300 MHz [60] (23.0 dBm) (no IR, radar detection)
* 5320 MHz [64] (23.0 dBm) (no IR, radar detection)
* 5500 MHz [100] (23.0 dBm) (no IR, radar detection)
* 5520 MHz [104] (23.0 dBm) (no IR, radar detection)
* 5540 MHz [108] (23.0 dBm) (no IR, radar detection)
* 5560 MHz [112] (23.0 dBm) (no IR, radar detection)
* 5580 MHz [116] (23.0 dBm) (no IR, radar detection)
* 5600 MHz [120] (23.0 dBm) (no IR, radar detection)
* 5620 MHz [124] (23.0 dBm) (no IR, radar detection)
* 5640 MHz [128] (23.0 dBm) (no IR, radar detection)
* 5660 MHz [132] (23.0 dBm) (no IR, radar detection)
* 5680 MHz [136] (23.0 dBm) (no IR, radar detection)
* 5700 MHz [140] (23.0 dBm) (no IR, radar detection)
* 5720 MHz [144] (23.0 dBm) (no IR, radar detection)
* 5745 MHz [149] (30.0 dBm) (no IR)
* 5765 MHz [153] (30.0 dBm) (no IR)
* 5785 MHz [157] (30.0 dBm) (no IR)
* 5805 MHz [161] (30.0 dBm) (no IR)
* 5825 MHz [165] (30.0 dBm) (no IR)
...
В приведённом списке видим, что чипсет поддерживает каналы 1−14 (2,4 ГГц) и каналы 36−165 (5 ГГц), но вы заметили флаг
no IR
?Флаг
no IR
обозначает no-initiating-radiation (то есть пассивное сканирование). Это значит, что данный режим запрещён в случае, когда устройство первым инициирует излучение (включая маяки). Другими словами, нельзя запускать точку доступа на этих каналах!![](https://habrastorage.org/getpro/habr/post_images/03f/743/e75/03f743e7505714ae9864dcce2b5b4964.gif)
Нормативные требования
Вышеописанная ситуация объясняется нормативными требованиями Linux, которые регулируют использование радиочастотного спектра в зависимости от страны.
Но погодите!
Я живу в США, а по ссылке написано, что я имею право инициировать излучение на каналах 36-48, так в чём дело? Посмотрим, какой домен регулирования используется в данный момент:
$ iw reg get
country 00: DFS-UNSET
(2402 - 2472 @ 40), (N/A, 20), (N/A)
(2457 - 2482 @ 40), (N/A, 20), (N/A), NO-IR
(2474 - 2494 @ 20), (N/A, 20), (N/A), NO-OFDM, NO-IR
(5170 - 5250 @ 80), (N/A, 20), (N/A), NO-IR
(5250 - 5330 @ 80), (N/A, 20), (0 ms), DFS, NO-IR
(5490 - 5730 @ 160), (N/A, 20), (0 ms), DFS, NO-IR
(5735 - 5835 @ 80), (N/A, 20), (N/A), NO-IR
(57240 - 63720 @ 2160), (N/A, 0), (N/A)
Выдача показывает, что сейчас активен мировой домен (или не установлен), то есть минимальные значения, разрешённые в каждой стране.
К сожалению, вручную установить домен
sudo iw reg set
не получится, потому что домен зашит в EEPROM:$ dmesg | grep EEPROM
[ 12.123068] ath: EEPROM regdomain: 0x6c
![](https://habrastorage.org/getpro/habr/post_images/5de/5a9/ae2/5de5a9ae216cf2c3f2f9416b4ffa54bc.gif)
Патч!
К счастью, нормативные требования обрабатываются на уровне драйвера, так что их можно легко изменить: находим патч в исходниках Open-WRT.
Прежде всего, не забудьте подключить репозиторий исходного кода из
/etc/apt/sources.list
:$ cat /etc/apt/sources.list
...
deb-src http://us.archive.ubuntu.com/ubuntu/ bionic main restricted
...
Затем подготовьте окружение, установив необходимые зависимости:
$ sudo apt-get install build-essential fakeroot
$ sudo apt-get build-dep linux
Скачайте источники своего ядра:
$ apt-get source linux
Поскольку оригинальный патч Open-WRT нельзя применить «как есть» к дереву ядра Ubuntu из-за тонких различий в системе сборки, пришлось его исправить:
$ VERSION=$(uname -r)
$ cd linux-${VERSION%%-*}
$ wget -O - https://gist.github.com/renaudcerrato/02de8b2e8dc013bc71326defd2ef062c/raw/a2db325e520e6442c8c12f7599d64ac1b7596a3e/402-ath_regd_optional.patch | patch -p1 -b
Всё готово для сборки:
$ fakeroot debian/rules clean
$ fakeroot debian/rules binary-generic
Если проблем нет, то теперь можно установить исправленное ядро поверх предыдущего:
$ cd ..
$ sudo dpkg -i linux*.deb
Перезагрузка, и вуаля:
$ sudo iw reg set US
$ iw list
...
Frequencies:
* 5180 MHz [36] (17.0 dBm)
* 5200 MHz [40] (17.0 dBm)
* 5220 MHz [44] (17.0 dBm)
* 5240 MHz [48] (17.0 dBm)
* 5260 MHz [52] (23.0 dBm) (radar detection)
* 5280 MHz [56] (23.0 dBm) (radar detection)
* 5300 MHz [60] (23.0 dBm) (radar detection)
* 5320 MHz [64] (23.0 dBm) (radar detection)
* 5500 MHz [100] (23.0 dBm) (radar detection)
* 5520 MHz [104] (23.0 dBm) (radar detection)
* 5540 MHz [108] (23.0 dBm) (radar detection)
* 5560 MHz [112] (23.0 dBm) (radar detection)
* 5580 MHz [116] (23.0 dBm) (radar detection)
* 5600 MHz [120] (23.0 dBm) (radar detection)
* 5620 MHz [124] (23.0 dBm) (radar detection)
* 5640 MHz [128] (23.0 dBm) (radar detection)
* 5660 MHz [132] (23.0 dBm) (radar detection)
* 5680 MHz [136] (23.0 dBm) (radar detection)
* 5700 MHz [140] (23.0 dBm) (radar detection)
* 5720 MHz [144] (23.0 dBm) (radar detection)
* 5745 MHz [149] (30.0 dBm)
* 5765 MHz [153] (30.0 dBm)
* 5785 MHz [157] (30.0 dBm)
* 5805 MHz [161] (30.0 dBm)
* 5825 MHz [165] (30.0 dBm)
...
Во избежание автоматического обновления может потребоваться закрепить версию ядра Linux.
Конфигурация
Новый файл конфигурации
hostapd
будет довольно простым: hw_mode=a
включает диапазоны 5 ГГц, а ieee80211ac=1
включает 802.11ac (VHT). Опция ieee80211d=1
с указанием country_code=US
определяет нормативный домен, под которым мы работаем.Чтобы максимально использовать пропускную способность,
ht_capab
и vht_capab
должны отражать возможности оборудования:$ iw list
...
Band 1:
Capabilities: 0x19e3
RX LDPC
HT20/HT40
Static SM Power Save
RX HT20 SGI
RX HT40 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 7935 bytes
DSSS/CCK HT40
...
Band 2:
VHT Capabilities (0x338001b2):
Max MPDU length: 11454
Supported Channel Width: neither 160 nor 80+80
RX LDPC
short GI (80 MHz)
TX STBC
RX antenna pattern consistency
TX antenna pattern consistency
С учётом этого вот окончательный
hostapd.conf
:$ cat /etc/hostapd/hostapd.conf
#### Interface configuration ####
interface=wlp5s0
bridge=br0
driver=nl80211
##### IEEE 802.11 related configuration #####
ssid=iCanHearYouHavingSex
hw_mode=a
channel=0
auth_algs=1
wmm_enabled=1
country_code=US
ieee80211d=1
ieee80211h=0
##### IEEE 802.11n related configuration #####
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-20][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CK-40][LDPC][MAX-AMSDU-7935]
##### IEEE 802.11ac related configuration #####
ieee80211ac=1
vht_capab=[MAX-MPDU-11454][RXLDPC][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1][MAX-A-MPDU-LEN-EXP7][TX-ANTENNA-PATTERN][RX-ANTENNA-PATTERN]
vht_oper_chwidth=1
##### WPA/IEEE 802.11i configuration #####
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=YouCantGuess
Документацию
hostpad.conf
см. в /usr/share/doc/hostapd/examples/hostapd.conf
.На этом этапе беспроводной маршрутизатор полностью работоспособен, и если нужна более сложная настройка, то вы можете теперь погрузиться в конфигурационные файлы.
Настройка виртуального SSID с помощью hostapd
Независимо от того, хотите вы настроить гостевую точку доступа или выделенную беспроводную сеть для своего VPN, в какой-то момент придётся настроить виртуальный SSID.
Диаграмма
Исходя из текущей конфигурации, вот обновлённая диаграмма, что мы хотим получить. Предполагая, что
wlp5s0
является физическим беспроводным интерфейсом, виртуальный SSID будет работать на виртуальном интерфейсе wlan0
, используя собственную подсеть 192.168.2.0/24
:![](https://habrastorage.org/getpro/habr/post_images/096/450/32b/09645032b28e7310ad93b2109efb0860.png)
Подготовка
Прежде всего проверим, что ваше беспроводное устройство поддерживает несколько SSID:
$ iw list
...
valid interface combinations:
* #{ AP, mesh point } <= 8,
total <= 8, #channels <= 1, STA/AP BI must match
...
Как видим, чипсет поддерживает до восьми точек доступа на одном канале. Это означает, что можно настроить до семи виртуальных SSID, и все они будут работать на одном канале.
Сетевой интерфейс
Согласно документации в hostapd.conf, существует строгая связь между MAC-адресом физического интерфейса и BSSID виртуальных интерфейсов:
hostapd will generate a BSSID mask based on the BSSIDs that are configured. hostapd will verify that dev_addr & MASK == dev_addr. If this is not the case, the MAC address of the radio must be changed before starting hostapd. If a BSSID is configured for every secondary BSS, this limitation is not applied at hostapd and other masks may be used if the driver supports them (e.g., swap the locally administered bit)
BSSIDs are assigned in order to each BSS, unless an explicit BSSID is specified using the 'bssid' parameter.
If an explicit BSSID is specified, it must be chosen such that it:
— results in a valid MASK that covers it and the dev_addr
— is not the same as the MAC address of the radio
— is not the same as any other explicitly specified BSSID
Чтобы выполнить эти требования и позволить
hostapd
автоматически назначать BSSID виртуального интерфейса(ов), обновим MAC-адрес физического беспроводного интерфейса, обнулив четыре наименее значимых бита. Этого хватит на 15 виртуальных BSSID — намного больше, чем необходимо.Сначала определим текущий MAC-адрес:
$ ip addr show wlp5s0 | grep link | awk '{print $2}'
44:c3:06:00:03:eb
Если очистить четыре последних бита и установить бит U/L, получится MAC-адрес
46:c3:06:00:03:e0
.Теперь обновим конфигурацию, чтобы установить правильный MAC-адрес прямо перед загрузкой интерфейса, а также объявить виртуальный беспроводной интерфейс в соответствии с нашей диаграммой:
$ cat /etc/network/interfaces
...
# Physical Wireless
auto wlp5s0
iface wlp5s0 inet manual
pre-up ip link set dev wlp5s0 address 46:c3:06:00:03:e0
# Virtual Wireless
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.2.1
network 192.168.2.0
netmask 255.255.255.0
broadcast 192.168.2.255
post-up /usr/sbin/dnsmasq \
--pid-file=/var/run/dnsmasq-wlan0.pid \
--conf-file=/dev/null \
--interface=wlan0 --except-interface=lo \
--bind-interfaces \
--dhcp-range=192.168.2.10,192.168.2.150,24h
post-down cat /var/run/dnsmasq-wlan0.pid | xargs kill
...
Отлично. Я использую
dnsmasq
как DHCP-сервер — не стесняйтесь заменить на то, что вам нравится. Обратите внимание, что для корректной работы виртуального интерфейса требуется allow-hotplug
.Конфигурация точки доступа
Теперь самое простое: добавим виртуальный SSID к текущей конфигурации
hostapd
. Просто добавьте это в конец существующего файла hostapd.conf
:$ cat /etc/hostapd/hostapd.conf
...
### Virtual SSID(s) ###
bss=wlan0
ssid=MyVirtualSSID
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=you_cant_guess
В приведённом примере я применил шифрование WPA2, но тут доступно большинство опций радиоинтерфейса (например,
channel
). Можно добавить больше виртуальных SSID, просто дописав строчки в конфигурационном файле, согласно объявленным и правильно настроенным виртуальным интерфейсам.Теперь перезагрузимся — и видим свой новый SSID вместе с новым беспроводным интерфейсом (обратите внимание на MAC-адрес):
$ ip addr show wlan0 | grep link | awk '{print $2}'
46:c3:06:00:03:e1
Вот и всё, ребята!