Я бегло посмотрел, и кажется, что ядро отвергнет путь, который не начинается с '/', так что там невозможно передать ноль. Если только я не смотрю не в то место, это то, что заставляет:
В ядро/аудит_watch.c: audit_to_watch():
if (path[0] != '/' || path[len-1] == '/' ||
krule->listnr != AUDIT_FILTER_EXIT ||
op != Audit_equal ||
krule->inode_f || krule->watch || krule->tree)
return -EINVAL;
Возможно, стоит подать сообщение об ошибке/запрос против этого
.
Решение, которое я нашел, состояло в том, чтобы настроить мой dnsmasq, чтобы он продолжал разрешать все до 192.168.30.1, но иметь некоторые исключения для тестовых серверов портала авторизации:
10.45.12.1 clients3.google.com
10.45.12.1 clients.l.google.com
10.45.12.1 connectivitycheck.android.com
10.45.12.1 connectivitycheck.gstatic.com
10.45.12.1 play.googleapis.com
Обычно, если кто-то пытается разрешить вышеуказанные домены с помощью нашего DNS-сервера, он получает ответ 10.45.12.1.
10.45.12.1 — это случайный IP-адрес, который никому не принадлежит. Только это не должно быть 192.168.30.1.
Список доменов взят из здесь .
После этого, как только вы подключитесь к WiFi RPi, откроется страница браузера, показывающая мой сайт.
Это решение, но не совсем ответ на вопрос, почему это происходит. Если кто-нибудь может объяснить это, я был бы признателен.
Редактировать:
С помощью этого решения, если я несколько раз подключаюсь и отключаюсь от WiFi на устройстве, иногда Android открывает страницу входа, а иногда нет. Для тех, кто делает что-то подобное, в конце концов, для лучшего решения,Я пошел с этим:
Это работает для Android, OS X и Windows. У меня нет устройства iOS, чтобы проверить это. Согласно этому , устройствам iOS может потребоваться дополнительная работа.
Мне все еще любопытно, зачем это вообще было нужно, и почему преобразование всего в 192.168.30.1 не сработало.
Я потратил много времени, пытаясь понять это, и, наконец, сделал это. Вы можете увидеть код здесьhttps://github.com/tretos53/Captive-Portal
Это комбинация доменов, указывающих на общедоступные IP-адреса, iptables и перенаправления nginx.
Этому может быть много разных причин, в том числе производитель аппаратного обеспечения вашего телефона. В настоящее время я создал свою библиотеку Captive Portal для ОС Mongoose, отвечающую на все запросы DNS с IP-адресом устройства, и у меня нет проблем с устройствами, кроме устройств Samsung, которые, похоже, требуют ответа 200 с текстом.
Вот стек библиотеки :https://github.com/tripflex/captive-portal-wifi-stack
В частности, вот обработка Captive Portal, а также сведения об используемых мной конечных точках и сведения о том, как это обрабатывается в README:
https://github.com/tripflex/captive-portal
Вы увидите, что одно решение, которое я использовал для устройств Samsung, заключается в возврате 200 со сгенерированными HTML-файлами с использованием метатега обновления:
https://github.com/tripflex/captive-portal#cportalredirect_file-setting
<html>
<head>
<title>Redirecting to Captive Portal</title>
<meta http-equiv='refresh' content='0; url=PORTAL_URL'>
</head>
<body>
<p>Please wait, refreshing. If page does not refresh, click <a href='PORTAL_URL'>here</a> to login.</p>
</body>
</html>
Но на самом деле главное было настроить обработку конечных точек для каждого конкретного устройства:
https://github.com/tripflex/captive-portal#known-endpoints
/mobile/status.php
Android 8.0 (Samsung s9+)/generate_204
Андроид /gen_204
Андроид /ncsi.txt
Окна /hotspot-detect.html
iOS/OS X /hotspotdetect.html
iOS/OSX /library/test/success.html
iOS /success.txt
ОС X /kindle-wifi/wifiredirect.html
Kindle при запросе с помощью com.android.captiveportallogin /kindle-wifi/wifistub.html
Kindle перед запросом с окном входа в авторизованный портал (, возможно, для обнаружения?)