The goal of this post is to harden your WordPress dashboard by preventing logins from countries where you know you will never be connecting. Since brute-force login attempts may still originate from an allowed country, it would be wise to combine this with other tools like fail2ban or one of the numerous plug-ins that add login rate-limiting restrictions to WordPress.
This example targets Nginx on CentOS 7 using PHP 7 from the Remi repo. Settings may vary depending on your exact setup, so watch out for differences from your config, and back up your /etc/nginx first!
First make sure you keep an up-to-date GeoIP database by running a script like the example below via a nightly cron job.
#!/bin/bash /bin/curl https://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz -o /tmp/GeoIP.dat.gz /bin/gunzip -c /tmp/GeoIP.dat.gz > /etc/nginx/GeoIP.dat /bin/rm -f /tmp/GeoIP.dat.gz
Make sure the GeoIP module is installed:
yum install nginx-mod-http-geoip
Make sure the module is loaded in /etc/nginx/nginx.conf:
load_module modules/ngx_http_geoip_module.so;
Inside of http { } in nginx.conf, add this, modifying country and default as desired:
geoip_country /etc/nginx/GeoIP.dat; map $geoip_country_code $allowed_country { default no; US yes; }
And finally add the necessary location statement in your virtual host’s server { }. In this example I’m using PHP 7.1 from the Remi repo, so your configuration may vary.
location ~ ^/(wp-admin|wp-login.php) { try_files $uri $uri/ /index.php?$args; # try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/php71-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; index index.html index.htm index.php; if ($allowed_country = no) { return 444; } }