Лучший вариант из бесплатных сервисов, что я находил:
ip-api.com.
Так то подобных много, но очень часто у них неактуальная база и кривой API.
Пример:
<script>function showCity(o){
alert(o.country+' - '+o.city)
}</script>
<script src="http://ip-api.com/json/?fields=country,city&callback=showCity"></script>