Если мы напишем в Google что-то вроде «hostapd ubuntu», мы получим туеву хучу статей по настройке программной точке доступа Wi-Fi. Однако, в подавляющем большинстве этих статей авторы зачем-то настраивают ещё и бридж, устанавливая пакет bridge-utilities дописывая в настройки «bridge=br0». Ну так вот, этого делать не нужно: достаточно указать WLAN-интерфейсу (у меня это wlan0) статический адрес и перенастроить на него iptables с dnsmasq.

А вот тут вскрывается багофича то ли Ubuntu, то ли systemd. Дело в том, что прописанный в автозапуск hostapd поднимает себя (и wlan0) раньше, чем это успевает сделать systemd. В итоге network.service падает с ошибкой поднятия wlan0, говоря, что устройство уже существует, и валит за собой другие соединения, о чём я писал ранее. Очевидным решением этой проблемы стало отключение автоподнятия wlan0 и управление интерфейсом прямо из скрипта init.d. Но и тут не всё так гладко, как хотелось бы!

Не буду литературно расписывать, скажу просто: вместо ifconfig используйте ifup и ifdown:

# bring the interface up
/sbin/ifup wlan0

# shut the interface down
/sbin/ifdown wlan0

По непонятным причинам ifconfig неправильно поднимает интефрейс, а именно — игнорирует наличие настроенного статического адреса в /etc/network/interfaces.