You should largely disregard DNS for identifying the original of an IP address. DNS names can be set up anywhere and there is significant overhead with performing a DNS resolution on inbound IPs which will eventually plug up your server.
What you should do is find a database of IP blocks located to each country and filter the entire blocks.I suppose you could contact ISPs to do the filtering for you but you will not get in touch with every ISP and over time the rules will be 'lost' or new ISPs will start up in the country. Here is what I do to filter IP addresses:
sk:~/fw# grep ^block\. ips.block
block.se:217.210.0.0/255.255.0.0
block.se:217.215.0.0/255.255.0.0
block.se:217.211.0.0/255.255.0.0
block.nz:203.114.0.0/255.255.0.0
block.pl:83.31.0.0/255.255.0.0
block.jp:210.251.0.0/255.255.0.0
block.jp:60.36.0.0/255.255.0.0
block:64.231.106.0/255.255.255.0
block.tr:81.215.0.0/255.255.0.0
block.mx:200.76.0.0/255.255.0.0
block.peri:200.106.0.0/255.255.0.0
block.ch:80.218.0.0/255.255.0.0
block.it:212.171.0.0/255.255.0.0
block.de:217.85.0.0/255.255.0.0
The ip2nation database should give you a comprehensive list of IP blocks belonging to each country.