how to get a list of the connected wifi clients in OpenWrt 10.03?
6 Answers
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
-
3You have recent leases too, like a powered off laptop and a phone currently on another wifi network. Commented Aug 4, 2014 at 17:54
-
1I still have empty response cat /tmp/dhcp.leases, while many devices got IP and network settings from WIFI of OpenWRT. Commented 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. Commented Nov 28, 2018 at 9:49
-
1This doesn't list wifi clients. The info it finds is sometimes related, but it doesn't really answer the question.– StefanCommented Oct 24, 2022 at 14:33
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.
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.
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.
-
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. Commented Nov 28, 2018 at 9:58
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)
If you use OpenWRT on a dumb AP, you might not have IPs as the DHCP server is on the router.
For this purpose I created a small 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
The script is kind of simple and based on the original from the 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