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"
}