Featured image of post Geoloc that IP

Geoloc that IP

Directly in your terminal

Context

You’re investigating an incident, a bug, what have you, and you’re dealing with lots of IP addresses. You’d like a way to find out where is that IP address from so you can get a rough idea of who’s who.

A whole host of websites allow you to geolocate IP addresses (iplocation.net for instance). But that’s not fast enough, and probably won’t scale if you need to batch process IPs.

Bash function FTW

This bash function goes in your .bashrc file, and fetches all the geolocation you need for a given IP address.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function freegeoip () {
  # Get result from freegeoip API
  local FGIP_RES=$(curl --request GET --url https://freegeoip.live/json/$1 header 'accept: application/json' --header 'content-type: application/json' -s)

  local LAT=$(echo $FGIP_RES | jq .latitude)
  local LON=$(echo $FGIP_RES | jq .longitude)

  echo $FGIP_RES | jq

  # Get approximate location from GPS coordinates
  curl --request GET --url "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=$LAT&lon=$LON" --header 'accept: application/json' --header 'content-type: application/json' -s | jq .address
}

Function requires curl & jq.

Usage

To find your own IP address & location, simply run freegeoip.

To locate another address, pass it as an argument. For example freegeoip 1.1.1.1 returns 👇.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "ip": "1.1.1.1",
  "country_code": "AU",
  "country_name": "Australia",
  "region_code": "",
  "region_name": "",
  "city": "",
  "zip_code": "",
  "time_zone": "Australia/Sydney",
  "latitude": -33.494,
  "longitude": 143.2104,
  "metro_code": 0
}
{
  "road": "Gol Gol Road",
  "municipality": "Wentworth Shire Council",
  "county": "Balranald Shire Council",
  "state": "New South Wales",
  "country": "Australia",
  "country_code": "au"
}