One of the things that bothered me for quite some time with my Pi-Hole was that using it with Google Wifi (first gen), it wouldn’t automatically detect device hostnames. I’d done a lot of googling and never could get it to work even after a lot of different trials with multiple settings.
Eventually I gave up and instead wrote a command that would use nmap
to help fill in the gaps, and output to /etc/pihole/custom.list
:
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
echo -n "Looking up MAC and IPs"
for ip in "192.168.1.0" "192.168.2.0" "192.168.3.0"; do
echo -n .
nmap -sP "$ip"/20 > "$ip"-nmap.txt
done
echo
cat 192.168.?.0-nmap.txt \
| sed '/^Starting Nmap/ d' \
| sed '/^Host is up/ d' \
| sed '/^Stats:/ d' \
| sed '/^Ping Scan Timing:/ d' \
| sed '/^Nmap done:/ d' \
| sed -z 's/\nMAC/,MAC/g' \
| sed -e 's/Nmap scan report for //g' \
| sed -e 's/MAC Address: //g' \
| sed -e 's/ (/,(/g' \
| grep -Ev $'^[0-9.]+$' \
| sort -u > ip-mac-mapping.csv
rm /etc/pihole/custom.list 2> /dev/null
while IFS=, read -r col1 col2 col3
do
col3="${col3//[\(\)]/}"
col3="${col3//[^[:alnum:]]/-}"
case "$col2" in
"24:05:88:XX:XX:XX")
col3="Google-Wifi"
;;
"B0:19:C6:XX:XX:XX")
col3="Derricks-iPhone"
;;
"CC:44:63:XX:XX:XX")
col3="iPad-Pro"
;;
"C8:D0:83:XX:XX:XX")
col3="Apple-TV-Den"
;;
"50:32:37:XX:XX:XX")
col3="Apple-TV-Bedroom"
;;
"DC:A6:32:XX:XX:XX")
col3="Ubuntu-Server"
;;
"38:F9:D3:XX:XX:XX")
col3="Derrick-MBP"
;;
*)
echo -n
;;
esac
case "$col1" in
"192.168.1.1")
col3="Google-Wifi"
;;
*)
echo -n
;;
esac
echo "$col1 $col3 # $col2"
echo "$col1 $col3" >> /etc/pihole/custom.list
done < ip-mac-mapping.csv
Code language: PHP (php)
This will attempt to grab some info about all the devices on your network via nmap
, but also allow you to manually override that per IP or per MAC. I have of course stripped out some devices and semi-anonymized my MACs in the above example.
The nmap
can be pretty slow, especially if you’re running this on a first gen Raspberry Pi like I am.