15

how to get a list of the connected wifi clients in OpenWrt 10.03?

6 Answers 6

16

You may use the arp-table, or DHCP-leases. Not a perfect solution, maybe it's enough?

List arp-table

arp

List DHCP-leases

cat /tmp/dhcp.leases

... and combined

for ip in $(arp | grep -v IP | awk '{print $1}'); do 
    grep $ip /tmp/dhcp.leases; 
done
4
  • 3
    You have recent leases too, like a powered off laptop and a phone currently on another wifi network.
    – Dereckson
    Aug 4, 2014 at 17:54
  • 1
    I still have empty response cat /tmp/dhcp.leases, while many devices got IP and network settings from WIFI of OpenWRT. Aug 19, 2017 at 18:25
  • This will not work if your router works as a bridge, since it doesn't offer the DHCP itself. Nov 28, 2018 at 9:49
  • 1
    This doesn't list wifi clients. The info it finds is sometimes related, but it doesn't really answer the question.
    – Stefan
    Oct 24, 2022 at 14:33
21

In order to see associated wifi clients, even if they don't have a DHCP Client or have no ip, you have to ask the AP for associated wifi devices:

# MAC80211
iw dev wlan0 station dump

# Universal (Tested with OpenWRT 14.07 and 15.05.X)
# iwinfo must be installed first as it is optional
# opkg update && opkg install iwinfo
iwinfo wlan0/wl0/ath0 assoclist

# using hostapd
ubus call hostapd.wlan0 get_clients

# Proprietary Broadcom (wl)
wl -i wl0 assoclist
 
# Proprietary Atheros (madwifi)
wlanconfig ath0 list sta

This way you will also see the connection speed. For me this is looking like this:

# iwinfo wlan0 assoclist
12:34:56:78:9A:BC  -26 dBm / -95 dBm (SNR 69)  1930 ms ago
RX: 24.0 MBit/s, MCS 0, 20MHz                   3359 Pkts.
TX: 130.0 MBit/s, MCS 14, 20MHz, short GI       1209 Pkts.
3

Instead of cat /tmp/dhcp.leases|wc -l and arp -a, my solution is

opkg update
opkg install arp-scan
arp-scan --interface=br-lan --localnet | grep responded | awk '{print $12}'

It will return the number of devices which connected to OpenWRT by LAN port. Almost real time.

2

How about nmap?

opkg install nmap

Then do a stealth scan of your subnet (likely 192.168.1.0/24)

nmap -sS 192.168.1.0/24

This will list services running on the clients as well. It may also set off alarms if the client has port-scan detecting software (i.e snort) installed so be careful.

1
  • You generate traffic here. If you just want to keep statistics every minute, for example you would be creating traffing, radiation and consumption needlessly. I am thinking about the case where you want to know if your mobile phone is at your place, for a house automation system. You don't want to drain your phone battery for this. Nov 28, 2018 at 9:58
2

To get them directly from hostapd (the daemon that manages the access point):

$ ubus call hostapd.wlan0 get_clients

{
    "freq": 2462,
    "clients": {
        "<mac addr 1>": {
            "auth": true,
            "assoc": true,
            "authorized": true,
            "preauth": false,
            "wds": false,
            "wmm": true,
            "ht": true,
            "vht": false,
            "wps": false,
            "mfp": false,
            "rrm": [
                0,
                0,
                0,
                0,
                0
            ],
            "aid": 1
        }
    }
}

(or replace wlan0 with the interface you are interested in)

0

if you use openwrt on dumb AP you might not have IPs as DHCP is on the router for such purpose I created a bit of script to present the results in this form:

root@r7800home:/etc/config/scripts# ./show_wifi_clients.sh 
host        host_IP     interface   MAC         SSID        channel width   unit    TX  unit    Station_MAC     RX_lev  unit    TX_rate unit    RX_rate unit
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm F2:03:35:6D:0E:A3   -78 dBm 866.7   MBit/s  650.0   MBit/s
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm 4C:53:FD:E3:94:80   -77 dBm 433.3   MBit/s  390.0   MBit/s
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm 00:F3:61:27:36:8E   -76 dBm 866.7   MBit/s  585.0   MBit/s
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm 5E:3E:E9:A5:C4:8B   -81 dBm 780.0   MBit/s  24.0    MBit/s
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm C4:91:0C:B3:C5:00   -86 dBm 433.3   MBit/s  24.0    MBit/s
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm 40:26:19:B4:69:08   -82 dBm 433.3   MBit/s  24.0    MBit/s
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm 10:B5:88:6F:97:D6   -85 dBm 650.0   MBit/s  24.0    MBit/s
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm 3C:A6:F6:33:05:DA   -88 dBm 780.0   MBit/s  24.0    MBit/s
r7800home   192.168.10.42   phy0-ap0    b0:b9:8a:4d:87:fa   monkeys-home    36  80  MHz 23.00   dBm 48:26:2C:96:D7:95   -91 dBm 650.0   MBit/s  24.0    MBit/s
r7800home   192.168.10.42   phy0-ap1    b2:b9:8a:4d:87:fa   monkeys-vf  36  80  MHz 23.00   dBm 4C:77:CB:EF:D2:F1   -70 dBm 866.7   MBit/s  866.7   MBit/s
r7800home   192.168.10.42   phy1-ap0    b0:b9:8a:4d:87:fb   monkeys-iot-30  1   20  MHz 30.00   dBm 2A:FF:01:01:01:27   -59 dBm 1.0 MBit/s  6.0 MBit/s
r7800home   192.168.10.42   phy1-ap0    b0:b9:8a:4d:87:fb   monkeys-iot-30  1   20  MHz 30.00   dBm 9C:9C:1F:8C:BE:D2   -67 dBm 1.0 MBit/s  48.0    MBit/s
r7800home   192.168.10.42   phy1-ap0    b0:b9:8a:4d:87:fb   monkeys-iot-30  1   20  MHz 30.00   dBm 10:CE:02:96:9F:65   -55 dBm 54.0    MBit/s  72.2    MBit/s
r7800home   192.168.10.42   phy1-ap0    b0:b9:8a:4d:87:fb   monkeys-iot-30  1   20  MHz 30.00   dBm 5C:C3:36:2D:F9:D5   -64 dBm 54.0    MBit/s  117.0   MBit/s
r7800home   192.168.10.42   phy1-ap2    b6:b9:8a:4d:87:fb   monkeys-home    1   20  MHz 30.00   dBm 44:91:60:78:34:74   -56 dBm 144.4   MBit/s  24.0    MBit/s

script is kind of simple and based on the orginal from openwrt.org forum:

# cat show_wifi_clients.sh 
#!/bin/sh

echo -e "host\t\thost_IP\t\tinterface\tMAC\t\t\tSSID\t\tchannel\twidth\tunit\tTX\tunit\tStation_MAC\t\tRX_lev\tunit\tTX_rate\tunit\tRX_rate\tunit"
host=`cat /proc/sys/kernel/hostname`
ip=`ip route get 1.2.3.4 | awk '{print $7}'`
for interface in `iwinfo | grep ESSID | cut -f 1 -s -d" "`
do
  maclist=`iwinfo $interface assoclist | grep dBm | cut -f 1 -s -d" "`
  ssid=`iw $interface info | grep ssid |  cut -f 2 -s -d" "`
  channel=`iw $interface info | grep channel |  cut -f 2 -s -d" "`
  width=`iw $interface info | grep channel |  cut -f 6 -s -d" "`
  apmac=`iw $interface info | grep addr |  cut -f 2 -s -d" "`
  txpower=`iw $interface info | grep txpower |  cut -f 2 -s -d" "`
  for mac in $maclist
  do
    signal=`iw dev $interface station get ${mac} | grep signal: | grep -v ack |  awk -F ' ' '{print $2}'`
    txbitrate=`iw dev $interface station get ${mac} |grep "tx bitrate" |  awk -F ' ' '{print $3}'`
    txbitrateunit=`iw dev $interface station get ${mac} |grep "tx bitrate" |  awk -F ' ' '{print $4}'`
    rxbitrate=`iw dev $interface station get ${mac} |grep "rx bitrate" |  awk -F ' ' '{print $3}'`
    rxbitrateunit=`iw dev $interface station get ${mac} |grep "rx bitrate" |  awk -F ' ' '{print $4}'`
    echo -e "$host\t$ip\t$interface\t$apmac\t$ssid\t$channel\t$width\tMHz\t$txpower\tdBm\t$mac\t$signal\tdBm\t$txbitrate\t$txbitrateunit\t$rxbitrate\t$rxbitrateunit"
  done
done
New contributor
Zygfryd Homonto is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .