Google has explained here on how to verify if the given IP belongs to Googlebot. So instead of hard-coding all the IPs which might change eventually, Google has suggested doing a DNS lookup using host command on Linux. The steps suggested in the article are:
- reverse DNS lookup using the IP to get domain name
- check if the domain name contains googlebot.com or google.com. The types of bots and their names can be found here.
- forward DNS lookup using the domain name obtained in step 1 to get the IP and verify that this IP is same as the IP you initially started with.
2. Implementation Approach
And I wanted to check if the IPs ( I had around 45) belonged to google bot. One option was to run host for each of the IPs, as suggested in the above steps, but this was practically not possible and if possible it would be time-consuming. So I came up with a simple shell script to do this job.
- reverse DNS lookup to get the domain name
#hostName is the complete domain name hostName = host $line | cut -d" " -f 5
So a sample response of host command would be 246.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-246.googlebot.com. And we can extract the domain name using the cut command as shown above. This gives us hostName = crawl-66-249-66-246.googlebot.com.
- forward DNS lookup to get the IP
hostIp=host $hostName | cut -d" " -f 4
A sample response to the host command, in this case, would be: crawl-66-249-66-246.googlebot.com has address 126.96.36.199. And we extract the IP using the cut command shown above which gives us the hostIp = 188.8.131.52.
- verify the domain name to contain googlebot and the IP obtained in step 2 is same as the IP we started with in step 1
if [ $line == $hostIp ] && [ $domainName == "googlebot.com" ] then echo "Googlebot: $hostIp -> $hostName" fi
3. Complete Shell Script
Let the IPs be in the file googlebots, for example, let us add these IPs:
184.108.40.206 220.127.116.11 18.104.22.168
The shell script is given below:
#!/bin/sh file="googlebots" while read -r line do hostName=`host $line | cut -d" " -f 5` domainName=`echo $hostName | cut -d"." -f2,3` #echo $domainName #echo "$hostName" hostIp=`host $hostName | cut -d" " -f 4` #echo "$hostIp" if [ $line == $hostIp ] && [ $domainName == "googlebot.com" ] then echo "Googlebot: $hostIp -> $hostName" fi done < "$file"