Настройка точки доступа на встраиваемом устройстве на базе Ubuntu 22.04

Вопрос или проблема

Я пытаюсь настроить хотспот на встроенном устройстве на базе Ubuntu 22.04. У меня возникают проблемы с подключением клиентов к интернету через хотспот. Я потратил много времени, пытаясь настроить хотспот с помощью nmcli, но ничего не получилось, поэтому я настраиваю все вручную.

На встроенном устройстве у меня есть WiFi-карта на интерфейсе wlan0 и отдельный сотовый модем на интерфейсе wwan0. С помощью hostapd мне удалось создать хотспот на wlan0, к которому я могу подключиться с моего Macbook. Для предоставления DHCP на хотспот и DNS для всей локальной системы я использую dnsmasq на встроенном устройстве. Со временем я хочу использовать ufw в качестве фаервола, но на данный момент я отключил ufw и вручную настраиваю правила маршрутизации с помощью iptables.

wlan0 имеет статический IP-адрес 10.42.0.1

Мой файл /etc/hostapd/hostapd.conf содержит следующее:

interface=wlan0
driver=nl80211
ssid=testHotspot
hw_mode=g
channel=6
wmm_enabled=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=testpass
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

Мой файл /etc/dnsmasq.conf содержит следующее:

port=53

listen-address=127.0.0.1
listen-address=10.42.0.1
bind-dynamic
dhcp-range=10.42.0.40,10.42.0.200,255.255.255.0,24h
dhcp-option=3,10.42.0.1 #default gateway
dhcp-option=6,10.42.0.1 #tell clients to look to us for dns
dhcp-authoritative

server=8.8.8.8@wwan0
server=8.8.4.4@wwan0
no-resolv
no-poll
no-hosts

log-debug
log-queries
log-dhcp

В идеале моя настройка dnsmasq кешировала бы результаты DNS и переадресовывала бы все, что не закешировано, на DNS-серверы через сотовое соединение. Я отключил системные службы systemd-resolved и ics-dhcp-server, потому что хотел управлять всей моей конфигурацией DNS в одном месте с помощью dnsmasq, но буду рад их повторно включить, если это поможет. lsof -i :53 возвращает:

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dnsmasq 3726 dnsmasq    6u  IPv4  69863      0t0  UDP 10.42.0.1:domain 
dnsmasq 3726 dnsmasq    7u  IPv4  69864      0t0  TCP 10.42.0.1:domain (LISTEN)
dnsmasq 3726 dnsmasq    8u  IPv4  69865      0t0  UDP localhost:domain 
dnsmasq 3726 dnsmasq    9u  IPv4  69866      0t0  TCP localhost:domain (LISTEN)

Я использовал скрипт, чтобы попытаться выяснить мои правила iptables. В настоящее время я запускаю скрипт каждый раз при перезагрузке. Я сохраню правила (или, что еще лучше, добавлю их в ufw) после того как все будет настроено. Я собрал их из различных источников, так что здесь, вероятно, есть некоторые проблемы. Stackoverflow не разрешает мне опубликовать ни скрипт, ни вывод iptables -L -v -n, но у меня есть политики по умолчанию для INPUT, FORWARD и OUTPUT, установленные на ACCEPT, и несколько правил, которые, как я считаю, не работают, чтобы попытаться явно открыть порты 53, 67 и 68.

У меня также есть правило MASQUERADE, которое, похоже, не работает.

Что касается пересылки, то у меня оба параметра net.ipv4.ip_forward=1 и net.ipv6.conf.all.forwarding=1 в /etc/sysctl.conf.

Сотовое соединение управляется через NetworkManager. Профиль соединения находится в /etc/NetworkManager/system-connections/t-mobile и содержит следующее:

[connection]
id=t-mobile
uuid=<uuid placeholder>
type=gsm
interface-name=cdc-wdm0
timestamp=1741621543

[gsm]
apn=iot.T-mobile.com
number=*99#

[ipv4]
method=auto

[ipv6]
addr-gen-mode=stable-privacy
method=auto

Я удалил плагин dnsmasq в NetworkManager в пользу системного экземпляра dnsmasq. Мой файл /etc/NetworkManager/NetworkManager.conf содержит следующее:

[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=true

[device]
wifi.scan-rand-mac-address=no
wifi.backend=wpa_supplicant

[keyfile]
unmanaged-devices=interface-name:wlan0

Я пробовал несколько комбинаций команд iptables и конфигураций dnsmasq. То, что я наблюдаю с моей текущей настройкой, это то, что при подключении к хотспоту DNS-запросы будут перехвачены и переадресованы, но не будут получены ответы. Я думал, что это означает, что мои правила iptables не допускают возврата DNS, поэтому я пробовал множество различных правил для открытия этих портов, но ни одно из них не работало. Запуск journalctl --unit dnsmasq -f во время подключения показывает запросы и перенаправления, но без ответов, но вывод выглядит как спам для stack overflow.

Интересный поворот в этой ситуации заключается в том, что если мой MacBook подключен к Ethernet-соединению при соединении с хотспотом, то MacBook будет перенаправлять свои DNS-запросы через порт Ethernet, и я смогу успешно выйти в интернет через хотспот. В этой настройке MacBook получает IP-адрес 10.42.0.107 от хотспота, и когда я запускаю ping -S 10.42.0.107 google.com, это успешно. Я вижу эти запросы ping, проходящие через сотовое соединение на встроенном устройстве, используя tcpdump -nn -i wwan0. Как только я отключаю Ethernet от MacBook, он начинает маршрутизировать DNS через хотспот, и я теряю возможность пинговать интернет как с MacBook, так и с встроенного устройства.

Я подумал, что это может указывать на проблему с моими маршрутами, но маршруты не меняются на протяжении всего процесса, и они кажутся мне правильными. Запуск route -n дает:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         <cellular ip>   0.0.0.0         UG    700    0        0 wwan0
0.0.0.0         192.168.55.100  0.0.0.0         UG    32766  0        0 l4tbr0
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 wg0
10.42.0.0       0.0.0.0         255.255.255.0   U     0      0        0 wlan0
<cellular ip>   0.0.0.0         255.255.255.248 U     700    0        0 wwan0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 l4tbr0
192.168.55.0    0.0.0.0         255.255.255.0   U     0      0        0 l4tbr0

Что я делаю не так? Спасибо заранее!

Ответ или решение

Настройка точки доступа на встраиваемом устройстве с Ubuntu 22.04 требует тщательного подхода, особенно когда дело касается обеспечения доступа клиентам к интернету. Рассмотрим ситуацию пошагово и выявим возможные проблемы и их решения.

Теория

Конфигурация точки доступа состоит из нескольких ключевых компонентов: настроек hostapd для создания точки доступа Wi-Fi, настроек dnsmasq для предоставления DHCP и DNS, а также маршрутизации через iptables. Ваше устройство имеет две карты: Wi-Fi (wlan0) для точки доступа и модем сотовой связи (wwan0) для выхода в интернет.

  1. Hostapd:

    • Он управляет настройками точки доступа Wi-Fi. Ваша конфигурация выглядит корректно для создания базовой точки доступа.
  2. Dnsmasq:

    • Он обеспечивает распределение IP-адресов и DNS-запросы. Основная задача – настроить кэширование DNS и перенаправление неразрешённых запросов на внешние DNS через соединение wwan0.
  3. Маршрутизация и iptables:

    • Для обеспечения передачи трафика из сети wlan0 в интернет через wwan0, важно правильно настроить правила маршрутизации и iptables.

Пример

Вы столкнулись с проблемой, когда DNS-запросы от клиентов не получают ответа. Много усилий было направлено на конфигурацию iptables, но возникает необходимость в более детальном подходе. Ваши текущие настройки, вероятно, имеют следующие узкие места:

  • DNS-запросы доходят до dnsmasq, но возвращаемая информация не направляется обратно клиентам.
  • Маршрутизация должна быть проверена, чтобы убедиться, что трафик правильно проходит обратно к клиентам через точку доступа.

Применение

  1. Проверка конфигурации Dnsmasq:

    • Убедитесь, что dnsmasq действительно запущен и работает корректно. Используйте journalctl --unit dnsmasq -f, чтобы просмотреть, какие запросы идут и какие возвращаются.
    • Параметры no-resolv и no-poll могут быть причиной, почему внутренние DNS-запросы не обрабатываются корректно. Попробуйте удалить эти параметры и проверить поведение.
  2. Iptables и маршрутизация:

    • Убедитесь, что NAT-переходы настроены правильно. Используйте правила, подобные следующим:
      iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
      iptables -A FORWARD -i wlan0 -o wwan0 -j ACCEPT
      iptables -A FORWARD -i wwan0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    • Проверьте активность параметров ip_forward. Если вы их меняли в sysctl.conf, убедитесь, что они применяются без ошибок.
  3. Конфигурация NetworkManager:

    • Убедитесь, что NetworkManager корректно управляет вашими соединениями. В конфигурационном файле NetworkManager.conf, возможно, необходимо убрать unmanaged-devices, чтобы wlan0 также можно было эффективно управлять через NetworkManager, особенно если впоследствии планируется использование ufw.
  4. Отладка:

    • Используйте команды, такие как ping -I wlan0 <some_ip>, чтобы проверить, проходится ли трафик. Если соединение работает с подключенным Ethernet, и при отключении перестаёт работать, возможно, проблема в приоритете маршрутизации и DNS. Команда ip route будет полезна для диагностики.
  5. Обновление Ubuntu и пакетов:

    • Проверьте, обновлён ли ваш dnsmasq, iptables, и прочие пакеты. Обновления могут исправить неочевидные ошибки.
  6. Диагностика через tcpdump:

    • tcpdump -nn -i wlan0 и tcpdump -nn -i wwan0 помогут вам увидеть, как идут пакеты. Это может прояснить, «где теряются» DNS-запросы.

Подводя итог, вам потребуется поэтапно проверять каждую из составляющих вашей конфигурации и удостовериться в правильной маршрутизации трафика, учёте особенностей взаимодействия с NetworkManager, а также правильной настройке Dnsmasq для обратной пересылки запросов. Внимательная диагностика, конфигурация iptables и кэш DNS помогут устранить проблемы с доступностью интернета для клиентов точки доступа.

Оцените материал
Добавить комментарий

Капча загружается...