Подключение к публичному Wi-Fi на Linux

Кофейни, требующие вводить номер телефона для доступа к Wi-Fi, мягко говоря, не вызывают симпатии. На Android такие сети обычно работают “из коробки”, а вот в Linux всё немного сложнее. Чтобы подключиться к открытой сети через wpa_supplicant, понадобится cледующий конфиг /etc/wpa_supplicant/wpa_supplicant-wlp0s20f3.conf:

network={
    ssid="CoffeeShop"
    key_mgmt=NONE
}

У меня установлен атрибут immutable на /etc/resolv.conf, чтобы dhcpcd (и любые другие службы) не подменял мои DNS-серверы своими. При установленном флаге файл нельзя редактировать, перемещать, удалять, переименовывать и вообще как-либо изменять. Перед подключением к кофейной сети этот флаг нужно временно снять, чтобы кофейный роутер смог прописать свои DNS-серверы, перехватить запрос к любому HTTP-сайту и выполнить редирект на страницу аутентификации:

chattr -i /etc/resolv.conf

Запускаем сервис:

systemctl start wpa_supplicant@wlp0s20f3.service

После этого в браузере переходим по адресу http://neverssl.com/. На самом сайте ничего нет — он используется только для выполнения незащищённого HTTP-запроса, который должен быть перехвачен и перенаправлен на страницу аутентификации. После успешной аутентификации можно снова включить wireguard, вернуть свой /etc/resolv.conf и при необходимости установить атрибут immutable.

Переподключение

Всё работало отлично, но в какой-то момент мне понадобилось переподключиться к сети:

systemctl restart wpa_supplicant@wlp0s20f3.service

После этого кофейный интернет перестал работать. Похоже, что это баг в самой системе аутентификации: повторные попытки логина не проходили, и меня постоянно выбрасывало обратно на стартовую страницу. Мне было лень разбираться, почему так происходит и что именно нужно поправить, поэтому я просто сменил MAC-адрес:

macchanger -r wlp0s20f3

Вывод получился примерно такой:

Current MAC:   00:1a:2b:3c:4d:5e (Intel Corporation)
Permanent MAC: 00:1a:2b:3c:4d:5e (Intel Corporation)
New MAC:       02:12:34:56:78:9a (random)

После этого я просто переподключился — интернет снова заработал. Главное — не забыть сохранить старый MAC-адрес, иначе домашний роутер может не пустить, и придётся перенастраивать фильтры/WHITELIST. Чтобы вернуть исходный MAC-адрес:

ip link set wlp0s20f3 address $oldmac

Вот так нехитро приходится взаимодействовать с публичным Wi-Fi, если сидишь на Linux.