
Configuring hostapd on Raspberry Pi
The daemon hostapd is a Linux service which enables a “host” computer to become a WiFi Access Point (AP). Thus “host” + “AP” + “d” (for daemon) gives the name hostapd.
I originally learned to set up hostapd from instructions on Pastebin written by user Dryfire117,1 andlater found useful instructions on the Raspberry Pi website.2 The process originally involved building the daemon from source code to get support for the nl80211 driver, but that is now included with the prepackaged version you can install using apt-get. Here are the main steps:
- Install: Install hostapd with the following command
$ sudo apt-get install hostapd
- Configure: Create and edit the configuration file, at /etc/hostapd/hostapd.conf.
For starters, include the following:interface=wlan1 #If this fails, try rt1871xdrv a driver=nl80211 # Name of the new network: best use the hostname ssid=wifipi # Pick a channel not already in use channel=6 # Change to b for older devices? hw_mode=g macaddr_acl=0 auth_algs=3 # Disable this to insure the AP is visible: ignore_broadcast_ssid=0
This creates an open, unsecured access point. Anybody can connect to it without having to give a password. In some cases that is what you want, but in other cases you will want
to turn on WPA for security and add a password. In that case, add the following to the hostapd.conf file:wpa=2 wpa_passphrase="RaspberryWiFi" wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
You should, of course, pick a better password. It has to be at least 8 characters long.
There are many, many other options which can be set in this configuration file, but these are the ones needed in most cases to get up and running. Full documentation of the options can be found in a sample configuration file at https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf
A few things I’ve learned from testing options on the Raspberry pi are that trying to enable the Automated Channel Selection (ACS) algorithm via “channel=0” does not work, and setting “hw_mode=any” does not work.
- Test: Test it manually to make sure the configuration file is okay:
$ sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
If there are errors it will complain and abort. Unfortunately some older wifi devices don’t support all the features necessary to run an access point. This is where you find out if yours will work.If there are no problems it will run and you can see the network SSID on a nearby device. Simply press ^C to stop it. - Enable: Have hostapd start at boot time, by doing the following:
- Set the default location for the configuration file, by editing the file /etc/default/hostapd to add the following line:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
- Enable the service at boot time with the command:
$ sudo update-rc.d hostapd enable
- You can test it now with the command
$ sudo service hostapd start
and/or you can reboot.
- Set the default location for the configuration file, by editing the file /etc/default/hostapd to add the following line:
Once hostapd is enabled and running, the next step is to enable the DHCP service, so that clients joining the network are automatically assigned IP addresses.
References
- “How to: Make a Raspberry Pi Powered Wifi Repeater” by Dryfire117, https://pastebin.com/A4jUp2Nq ↩
- “Setting up a Raspberry Pi as a routed wireless access point,” https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md ↩
Excellent article, very useful.
Big BUT I have been struggling to get a Wifi AP working in Raspbian Buster and Raspi OS folowing the usual instructions like these.
Have you tested these on later OS’s? This is a problem I beleive
I have not yet tested with Buster.
I had a problem that the Wifi never started even after following these instructions. Here is the solution that I found.
https://unix.stackexchange.com/questions/119209/hostapd-will-not-start-via-service-but-will-start-directly
I set /etc/default/hostapd line to spell out the full file name of the hotapd config file
DAEMON_CONF=”/etc/hostapd/hostapd.conf”
This is because of lines in syslog about config file not found
“Jun 18 19:44:00 raspberrypi systemd[1]: Stopped Advanced IEEE 802.11 AP and IEEE 802.1X/WPA/WPA2/EAP Authenticator.
Jun 18 19:44:00 raspberrypi systemd[1]: Starting Advanced IEEE 802.11 AP and IEEE 802.1X/WPA/WPA2/EAP Authenticator…
Jun 18 19:44:00 raspberrypi hostapd[15736]: Configuration file:
Jun 18 19:44:00 raspberrypi hostapd[15736]: Could not open configuration file ” for reading.
Jun 18 19:44:00 raspberrypi hostapd[15736]: Failed to set up interface with
Jun 18 19:44:00 raspberrypi hostapd[15736]: Failed to initialize interface
Jun 18 19:44:00 raspberrypi systemd[1]: hostapd.service: Control process exited, code=exited status=1
Jun 18 19:44:00 raspberrypi systemd[1]: Failed to start Advanced IEEE 802.11 AP and IEEE 802.1X/WPA/WPA2/EAP Authenticator.
Jun 18 19:44:00 raspberrypi systemd[1]: hostapd.service: Unit entered failed state.
Jun 18 19:44:00 raspberrypi systemd[1]: hostapd.service: Failed with result ‘exit-code’.
This is not something that I have ever seen before in any instructions on setting up Hostapd and I certainly didn’t have to do it on my previous setup.
It looks like it’s not getting the name of the config file. The part that says “Could not open configuration file ” for reading.” would have the name between those single quotes. Maybe there is a problem with a closing quote on that line in /etc/default/hostapd?
Thanks for these posts, very helpful. In your first post on network config you set up wlan0 as your AP, but in this post you have wlan1 in your hostapd.conf file as the access point, is that accurate?
Yes, I switched to using wlan0 for the AP because that was more general, and then either eth0 or wlan1 could be the uplink. In the past I’d used the second WiFi for the uplink, but as I went through the instructions again and updated them I also was changing this to use eth0 with cable run through my basement to get coverage for the other end of the house. I think the current instructions are better for both use cases.