Instructions on how to setup a WAP on Ubuntu Server 18.04


I am what is known in the business as a "professional moron". Take anything I write here with a huge grain of salt. If something breaks, it probably also broke for me so please don't come complaining because I'll probably be busy trying to fix it. If you have questions, I can look at them with great intensity, but I cannot promise you answers. If you have remarks about what I'm doing and/or tips on how to make it better, I will probably read them and reply with a "Thanks! 👍". Either way, send me an e-mail if you want to tell me something. My address should be somewhere on this page, have fun finding it.

The setup

The goal

What I did

Ubuntu Server 18.04 comes with netplan by default now, which is a bit annoying because most tutorials I found either expected ifupdown do be installed or explicitly told me to replace netplan (something I did and then undid).

Either way, you can still do this using netplan. But I'm getting ahead of myself, let's find out what interfaces we have first. You can use the following command for that:

ip addr show

Here's an abridged version of what it outputs for me:

sff@panfried:~$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether e8:9d:87:5e:11:2a brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether 88:53:2e:27:16:63 brd ff:ff:ff:ff:ff:ff

From what I gather, some part of systemd gives these funky names to your interfaces. They used to be called ethX, wlanX, ... before but it doesn't really matter. My wired interface is called enp4s0, my wireless interface is called wlp3s0. Make sure to write yours down somewhere. Or just remember them, if you have good memory.

So, my approach for solving this conundrum is bridging the two interfaces together. Well, that ended up being my approach, first I did some weird stuff with iptables but that just gave me a headache. Either way, it boils down to adding a bridge interface that... bridges the two other interfaces. From what I gathered, the purpose of a bridge is to create a single network from multiple segments/interfaces, as opposed to setting up two networks (one via the wired interface, another via the wireless interface) and routing requests from one to the other.

Either way, you can create a bridge using netplan. First I disabled the cloud-init Ubuntu comes with out-of-the-box. Just follow the instructions in /etc/netplan/50-cloud-init.yaml. I'm not sure you need to do this, but I did it just in case. Afterwards, add a file /etc/netplan/10-network.yaml (you can also give it another name, it's okay) with the following contents:

sff@panfried:~$ cat /etc/netplan/10-network.yaml 
  version: 2
  renderer: networkd
    enp4s0: # Set this to your own wired interface
      dhcp4: no
    wlp3s0: # Set this to your own wireless interface
      dhcp4: no
    br0: # You don't need to call it br0 by the way
      interfaces: [enp4s0, wlp3s0]
      addresses: [] # A static IP I chose, you can pick one yourself. But also, I'd prefer if the IP wasn't static, but I'm not sure how to do it.
      gateway4: # IP of my router
        addresses: [] # Since my router also does the DNS, IP of my router

You can enable it by running

sudo netplan apply

Now we need to add the actuall access point. I used hostapd for that. Install it as follows:

sudo apt install hostapd

Let's edit some configuration files first. In /etc/defalt/hostapd edit the following line:

#DAEMON_CONF="" <--- it looks like this by default, change it

Now, we add the configuration of hostapd itself. Create /etc/hostapd/hostapd.conf and place the following in it:

interface=wlp3s0 # Set this to your own wireless interface
bridge=br0 # Set this to your own bridge interface

# Hardware mode, see: for mroe info

# Limit the frequencies used to those allowed in the country
# Set the country
country_code=BE # Set this to your own country
# 802.11n support
# QoS support

# Accept all MAC addresses
# Shared Key Authentication
# Don't broadcast SSID


Enable hostapd and start:

sudo systemctl enable hostapd
sudo systemctl start hostapd

And that's it! It should be working now.