Понадобилось дома иметь отдельную WiFi сеть чисто для медиадевайсов и прочей мелочёвки,
которая может стучаться, куда не следует и не стучаться, куда следует. Отдельный роутер покупать или перепрошивать имеющийся как-то слишком просто, а так как у меня валяется горстка USB WiFi адаптеров от китайских до промышленных, решено было поглядеть, насколько реально из обычного Линукс сервера сделать свой «роутер».
И так, система:
Distributor ID: Ubuntu
Description: Ubuntu 24.04.1 LTS
Release: 24.04
Codename: noble
Ядро
6.8.0-45-generic
В качестве сетевого адаптера выступает Archer T3U Plus (AC1300) от TP-Link.
Внутри у него чип RTL8812BU, драйвер в ядро недавно добавили (c 5.8?), учтите это.
Две недели под нагрузкой и «ни единого разрыва». Замеры скорости будут в конце записи (кажется, печально).
Первым делом узнаём список WiFi адаптеров:
iwconfig
Выхлоп примерно такой:
iwconfig
lo no wireless extensions.
enp3s0 no wireless extensions.
wlxb01921cacc79 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=0 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
wlx1c61b4b015ca IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=0 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
Да, у меня 2 идентичных WiFi адаптера, через wlx1c61b4b015ca буду получать, через wlxb01921cacc79 отдавать.
Узнать можно вынув и посмотреть отличия в выводе iwconfig либо по sudo dmesg.
После того, как решил какой для чего адаптер будет использоваться, выясняем, может ли он вообще работать на 5GHz:
iw list
И смотрим раздел «Frequencies» (их будет несколько, один для 2.4GHz, второй для 5GHz, смотрите по частоте).
iw list
Frequencies:Frequencies:
* 5180 MHz [36] (22.0 dBm) (no IR)
* 5200 MHz [40] (22.0 dBm) (no IR)
* 5220 MHz [44] (22.0 dBm) (no IR)
* 5240 MHz [48] (22.0 dBm) (no IR)
* 5260 MHz [52] (22.0 dBm) (no IR, radar detection)
* 5280 MHz [56] (22.0 dBm) (no IR, radar detection)
* 5300 MHz [60] (22.0 dBm) (no IR, radar detection)
* 5320 MHz [64] (22.0 dBm) (no IR, radar detection)
* 5340 MHz [68] (disabled) * 5360 MHz [72] (disabled)
* 5380 MHz [76] (disabled) * 5400 MHz [80] (disabled)
* 5420 MHz [84] (disabled) * 5440 MHz [88] (disabled)
* 5460 MHz [92] (disabled) * 5480 MHz [96] (disabled)
И тут ждёт первая небольшая проблема.
Как видим, напротив возможных каналов прописано либо «disabled» либо стоит флаг «no IR» («No Infrared»), а это означает, что адаптеру запрещено первому начинать вещание (быть точкой доступа).
Происходит это из-за законодательных ограничений на радиочастотные диапазоны в разных странах,
а так как в девайсах зачастую не прописано для какой страны он (точнее стоит 00 — общемировой), то драйвер смотрит на минимально возможные разрешения, от того и получается, что не остаётся доступных каналов.
Но не сильно большая проблема — мы сейчас явно дадим понять драйверу в «какой стране он»:
sudo su
echo "options cfg80211 ieee80211_regdom=US" | sudo tee /etc/modprobe.d/80211-fix.conf
Вот и всё =) Ребут только нужен sudo reboot now.
В iw list теперь должны появится доступные каналы с частотой >5000 MHz.
Возможно, нужно будет ещё в системе прописать дополнительно где мы:
iw reg set US
Вот основная проблема, с которой промучался пол дня в попытках понять, как обойти ограничения CRDA (Central Regulatory Domain Agent) без патчинга драйверов.
Ок, приступаем.
Настраивать сети будем через Netplan (так удобнее),
в роли управляющего будет networkd (да, можно было бы через NetworkManager, но смысла в нём на сервере нет),
WiFi точку доступа поднимать будем через hostapd, раздавать IP адреса будем через dnsmasq
Первым делом ставим необходимые пакеты:
sudo su
apt install
systemd-networkd #-- Отвечает за управление сетевыми интерфейсами и настройку сетевых соединений
hostapd #-- Создаёт точку доступа
dnsmasq #-- Раздаёт IP адреса по DHCP
iptables-persistent #-- Сохраняет и восстанавливает при старте системы настройки ip-tables
iperf3 #-- Для замеров скорости, можно не ставить
Дальше включаем автозапуск сервисов:
systemctl disable NetworkManager #-- Если его у Вас не установлено, то будет сообщение, что не найден - ОК.
systemctl stop NetworkManager #-- Если его у Вас не установлено, то будет сообщение, что не найден - ОК.
systemctl enable systemd-networkd #-- Вместо NetworkManager
systemctl enable hostapd
systemctl enable dnsmasq
Переходим к самим настройкам, для начала Netplan, что бы networkd «поднял» соответствующие интерфейсы:
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: true
wlxb01921cacc79:
dhcp4: false
addresses:
- 192.168.3.1/24
wifis:
wlx1c61b4b015ca:
dhcp4: true
access-points:
"MyHome":
password: "nananana"
ВАЖНО: Файл с разметкой YAML, то есть только пробелы (две штуки) в качестве отступов!
Как уже писал, через адаптер wlx1c61b4b015ca я получаю WiFi, а через wlxb01921cacc79 буду раздавать.
У него явно прописываем адрес и маску — он будет адресом хоста.
Дальше настраиваем саму точку доступа (к сожалению, пока что Netplan не может создавать конфиг файлы для hostapd):
interface=wlxb01921cacc79 #-- Указываем интерфейс, на каком будем поднимать
ssid=MyGlobalWiFi #-- Название поднимаемой WiFi сети
wpa_passphrase=mypassword #-- Пароль поднимаемой WiFi сети
wpa_key_mgmt=WPA-PSK #-- Алгоритм авторизации
wpa=2
auth_algs=1
hw_mode=a #-- 'a' для 5ГГц
channel=44 #-- Канал для вещания (потом можно будет подобрать наиболее "свободный")
#-- Остальное я "игрался" с разными возможностями (vht_capab из iw list).
#ieee80211n=1
#ieee80211ac=1
#ieee80211d=0
#ieee80211h=0
require_vht=1
wmm_enabled=1
ht_capab=[LDPC][HT40+][HT40-][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935]
vht_capab=[MAX-MPDU-11454][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1][HTC-VHT][MAX-A-MPDU-LEN-EXP7]
vht_oper_chwidth=1
macaddr_acl=0
country_code=US
wpa_pairwise=CCMP
rsn_pairwise=CCMP
Возможно, Вам нужно будет погуглить готовые наборы для вашего адаптера, если отличается от моего, но vht_capab вероятно не обязательно явно указывать — возможно будет скорость чуть ниже.
Теперь точка доступа поднята, но нужно, что бы IP адрес автоматически клиентам назначался, для этого настраиваем dnsmasq:
interface=wlxb01921cacc79 #-- Слушаем запросы на адаптере поднимаемой сети
interface=lo #-- Слушаем запросы от локалхоста (наш сервер)
except-interface=wlx1c61b4b015ca #-- Не слушать запросы на этом, т.к. он "входящий" для нас.
#bind-interfaces #-- Закомментировать, т.к. dnsmasq стартует до hostapd
server=8.8.8.8 #-- DNS сервер до нас (к нему будем мы сами ходить за резолвом имён)
dhcp-range=192.168.3.10,192.168.3.250,12h #-- Диапазон IP адресов для клиентов
dhcp-option=1,255.255.255.0 #-- Маска подсети для клиентов
dhcp-option=3,192.168.3.1 #-- Шлюз по умолчанию для клиентов (пока что так же, как в Netplan задали)
dhcp-option=6,192.168.3.1 #-- DNS сервер для клиента (мы сами)
Так как у новой WiFi другая подсеть, то нужно разрешить хождение пакетов между ней и входящей, а так же настроить «маскарад» (NAT) на входящей сети (трансляцию IP адреса, т.е. как будто бы все клиенты в мир будут выходить под одним её IP адресом, короче читайте отдельную запись — долгая история).
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
iptables -t nat -A POSTROUTING -o wlx1c61b4b015ca -j MASQUERADE
netfilter-persistent save #-- Сохраняем правила, т.к. то, что выше написали, будет действовать до перезагрузки.
Нус, осталось только запустить и применить всё.
ВАЖНО: если вы подключены к серверу удалённо, то убедитесь, что если что-то пойдёт не так, у вас останется доступ к консоли сервера (то есть сеть может пропасть совсем, если что-то не так).
sudo su
systemctl start dnsmasq &&
systemctl start systemd-networkd &&
systemctl start hostapd &&
netplan apply #-- Запуск всей движухи
В выхлопе ip a должно стать как-то так:
ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp3s0: mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether d4:3d:7e:38:62:21 brd ff:ff:ff:ff:ff:ff
3: wlxb01921cacc79: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether b0:19:21:ca:cc:79 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.1/24 brd 192.168.3.255 scope global wlxb01921cacc79
valid_lft forever preferred_lft forever
inet6 fe80::b219:21ff:feca:cc79/64 scope link
valid_lft forever preferred_lft forever
4: wlx1c61b4b015ca: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 1c:61:b4:b0:15:ca brd ff:ff:ff:ff:ff:ff
inet 192.168.0.103/24 metric 600 brd 192.168.0.255 scope global dynamic wlx1c61b4b015ca
valid_lft 6120sec preferred_lft 6120sec
inet6 fe80::1e61:b4ff:feb0:15ca/64 scope link
valid_lft forever preferred_lft forever
Как видите, появился IP адрес у WiFi адаптера, значит, можно попробовать подключиться к новой сети =)
Теперь, замерим скорость, для этого используем iperf3, на сервере запускаем его демона (где поднимали WiFi):
iperf3 -s
Подключаемся другим ПК с Линуксом (на него то же поставить iperf3 нужно) к нашей только что поднятой WiFi сети, и запускаем
iperf3 -c 192.168.3.1 #-- Адрес хоста сервера
У меня с этими адаптерами получилось так:
iperf3 -c 192.168.3.1
Connecting to host 192.168.3.1, port 5201
[ 5] local 192.168.3.20 port 45722 connected to 192.168.3.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 3.27 MBytes 27.4 Mbits/sec 4 69.3 KBytes
[ 5] 1.00-2.00 sec 2.92 MBytes 24.5 Mbits/sec 1 72.1 KBytes
[ 5] 2.00-3.00 sec 2.98 MBytes 25.0 Mbits/sec 0 97.6 KBytes
[ 5] 3.00-4.00 sec 3.11 MBytes 26.1 Mbits/sec 0 119 KBytes
[ 5] 4.00-5.00 sec 3.11 MBytes 26.1 Mbits/sec 0 139 KBytes
[ 5] 5.00-6.00 sec 3.11 MBytes 26.1 Mbits/sec 0 154 KBytes
[ 5] 6.00-7.00 sec 3.36 MBytes 28.1 Mbits/sec 0 170 KBytes
[ 5] 7.00-8.00 sec 3.17 MBytes 26.6 Mbits/sec 0 184 KBytes
[ 5] 8.00-9.00 sec 3.60 MBytes 30.2 Mbits/sec 0 197 KBytes
[ 5] 9.00-10.00 sec 3.29 MBytes 27.6 Mbits/sec 0 211 KBytes
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 31.9 MBytes 26.8 Mbits/sec 5 sender
[ 5] 0.00-10.04 sec 31.0 MBytes 25.9 Mbits/sec receiver
Что-то как-то невоодушевляет для 5GHz =( Если удастся получить что-то лучше, обновлю запись.
ВАЖНО: Есть альтернативный драйвер: https://github.com/morrownr/88x2bu-20210702 на нём скорость выше, ставиться легко в пару команд, но с ним у меня два одинаковых адаптера не захотели работать одновременно — только первый, поэтому не могу сказать по стабильности.
ВАЖНО: Не подключайте адаптеры к фронтальной панели — могут глючить под нагрузкой, т.е. только к задней. Работают как с USB 2.0 так и с USB 3.0.
ВАЖНО: Через Netplan и рендер в NetworkManager то же работает (только учтите, что тогда в конфиг Dnsmasq нужно интерфейс, с которого раздача будет, добавить в except , т.к. Netplan поднимет новый процесс Dnsmasq с отдельными настройками специально для него) НО у меня не все устройства смогли к этой сети подключится (просто не видели), а некоторые подключались, но писали ошибку неизвестную (видимо не хватает настроек, которые прописаны в hostapd, но побыстраляну я не нашёл, как вообще прописать. Как минимум, канал, наверное, нужно).
Вот как-то так =)