Skip to Content

Configure a Wi-Fi Client on FreeBSD

If you need a GUI-based Wi-Fi manager for a FreeBSD desktop environment, consider using networkmgr or wifimgr. For console-based servers or IOT devices, the bsdconfig wireless command should allow one to configure a supported wireless device on FreeBSD after installation, but I have never been able to get it to work properly on my devices.

Fortunately, it’s easy to set up Wi-Fi by hand for supported devices following the instructions in the handbook.

First, use sysctl and pciconf to see if the system has detected a wireless device.

$ su
Password:

# uname -a
FreeBSD laptop.ccammack.com 13.0-RELEASE-p4 FreeBSD 13.0-RELEASE-p4

# sysctl net.wlan.devices
net.wlan.devices: iwn0

# pciconf -lv | grep -B3 network
[...]
iwn0@pci0:3:0:0:	class=0x028000 rev=0x34 hdr=0x00 vendor=0x8086 device=0x0085 subvendor=0x8086 subdevice=0x1311
    vendor     = 'Intel Corporation'
    device     = 'Centrino Advanced-N 6205 [Taylor Peak]'
    class      = network

In this case, the system detected an Intel Centrino Advanced-N 6205 Wi-Fi card as wireless device iwn0.

To find out more about available drivers for your wireless hardware, use the apropos and man commands.

# apropos intel | grep wireless
iwm, if_iwm(4) - Intel IEEE 802.11ac wireless network driver
iwn, if_iwn(4) - Intel IEEE 802.11n wireless network driver

# man iwn
[...]

Support for new wireless devices often takes a while on FreeBSD, so if your hardware is not recognized, the easiest solution is to just buy an inexpensive USB Wi-Fi dongle that is already supported. Search the FreeBSD Release Notes for the word wireless to see a list of supported hardware.

Once the system recognizes a wireless device, use either ee or echo >> to add two lines to the bottom of /etc/rc.conf to configure it. Replace iwn0 in the example below with the appropriate driver name given by the sysctl command.

# ee /etc/rc.conf
[...]

# echo 'wlans_iwn0="wlan0"' >> /etc/rc.conf
# echo 'ifconfig_wlan0="WPA SYNCDHCP"' >> /etc/rc.conf

# cat /etc/rc.conf
[...]
wlans_iwn0="wlan0"
ifconfig_wlan0="WPA SYNCDHCP"

Next, use ee or wpa_passphrase >> to add a properly-formatted network configuration block to the file /etc/wpa_supplicant.conf for each Wi-Fi hotspot.

# ee /etc/wpa_supplicant.conf
[...]

# wpa_passphrase "SSID" "WPA2passphrase" >> /etc/wpa_supplicant.conf

# cat /etc/wpa_supplicant.conf
network={
        ssid="SSID"
        #psk="WPA2passphrase"
        psk=8f0022337a28144c1ee2ae9b7f570d978c9c014b9e3b6e7ad3bfaf816d272f60
}

The wpa_supplicant.conf file can contain as many hotspots as needed. The longer psk value (without double-quotes) is just a hash of the commented-out #psk value that contains the raw passphrase.

If you need to change the passphrase for an existing hotspot, you can delete the line with the longer psk hash, uncomment the line with the shorter psk value and change it to the new raw passphrase. The system will recognize either psk format.

Finally, restart the network service and ping to check the connection.

# service netif restart
[...]

# ifconfig
[...]
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 8c:70:5a:bd:39:3c
        inet 192.168.0.101 netmask 0xffffff00 broadcast 192.168.0.255
        groups: wlan
        ssid SSID channel 2 (2417 MHz 11g ht/20) bssid 1c:af:f7:dd:9c:3b
        regdomain FCC country US authmode WPA2/802.11i privacy ON
        deftxkey UNDEF TKIP 3:128-bit txpower 30 bmiss 10 scanvalid 60
        protmode CTS ampdulimit 64k ampdudensity 8 -amsdutx amsdurx shortgi
        -stbc -ldpc -uapsd wme roaming MANUAL
        parent interface: iwn0
        media: IEEE 802.11 Wireless Ethernet MCS mode 11ng
        status: associated
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

# ping google.com
PING google.com (142.250.191.78): 56 data bytes
64 bytes from 142.250.191.78: icmp_seq=0 ttl=117 time=9.805 ms
64 bytes from 142.250.191.78: icmp_seq=1 ttl=117 time=10.081 ms
64 bytes from 142.250.191.78: icmp_seq=2 ttl=117 time=10.059 ms
^C
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 9.805/9.982/10.081/0.125 ms

To connect to a different hotspot in a new location, use ifconfig scan to scan for nearby hotspots and then add the desired SSID to /etc/wpa_supplicant.conf using either ee or wpa_passphrase >> as before.

# ifconfig wlan0 list scan | more
SSID/MESH ID                      BSSID              CHAN RATE    S:N     INT CAPS
[...]
GuestWiFi                         1c:af:f7:dd:9c:3b    2   54M  -66:-95   100 EPS  RSN WPA WME HTCAP ATH WPS
[...]

# wpa_passphrase "GuestWiFi" "WPA2passphrase" >> /etc/wpa_supplicant.conf

# cat /etc/wpa_supplicant.conf
[...]
network={
        ssid="GuestWiFi"
        #psk="WPA2passphrase"
        psk=8f0022337a28144c1ee2ae9b7f570d978c9c014b9e3b6e7ad3bfaf816d272f60
}

# service netif restart
[...]

# ping google.com
[...]

For reference, here are several related command line Wi-Fi scripts (and the original FreeBSD source), but I haven’t studied them enough to see which ones work on FreeBSD or could be adapted work, so I can’t make any recommendations about them.