Redirect or block traffic based on country geographical location using Apache mod_geoip

In this config you will learn how to block or redirect web traffic based on the visitor’s country geographical location using Apache’s geoip mod.

Apache mod_geoip installation

Assuming that you already have Apache webserver installed and running we start by the installation of mod_geoip:

UBUNTU/DEBIAN
# apt-get install libapache2-mod-geoip
CENTOS/REDHAT/FEDORA ( epel enabled only )
# yum install mod_geoip.x86_64

Confirm that geoip and rewrite module is enabled:

# apache2ctl -M | grep -E "geoip|rewrite"
geoip_module (shared)
rewrite_module (shared)

If the above command does not produce any output or only single mod is listed enable missing module with the following linux command:

# a2enmod geoip rewrite
Enabling module geoip.
Enabling module rewrite.

To activate the new configuration, you need to run:

# service apache2 restart

and restart Apache webserver to apply the changes:

# service apache2 restart

Redirect traffic based on the country geographical location

Now that we have mod_geoip enabled we can edit a relevant site’s configuration file located in /etc/apache2/sites-available/ or corresponding .htaccess file to redirect traffic based on geographical location. In the example below we are going to redirect all incoming traffic from China and India to new URL http://example.com:

RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(CN|IN)$
RewriteRule ^(.*)$ http://example.com/$1 [L]

Please note that if you insert the above configuration into site’s configuration file you well be required to restart your apache webserver to apply changes:

# service apache2 reload

Block traffic based on the country geographical location

If you decide to block incoming traffic based on the country geographical location you can do so by editing a relevant site’s configuration file located in /etc/apache2/sites-available/. The below mod_geoip configuration will block China and India countries:

<Location />
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE IN BlockCountry
Deny from env=BlockCountry
</Location>

Apache reload is required to apply the above changes. Alternatively the the above you can also insert the following lines into your corresponding .htaccess file:

SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE IN BlockCountry
Deny from env=BlockCountry

Appendix

ISO 3166 Country Codes

List of ISO 3166 Country Codes to be used with GeoIP apache module:

A1 - "Anonymous Proxy"
A2 - "Satellite Provider"
O1 - "Other Country"
AD - "Andorra"
AE - "United Arab Emirates"
AF - "Afghanistan"
AG - "Antigua and Barbuda"
AI - "Anguilla"
AL - "Albania"
AM - "Armenia"
AO - "Angola"
AP - "Asia/Pacific Region"
AQ - "Antarctica"
AR - "Argentina"
AS - "American Samoa"
AT - "Austria"
AU - "Australia"
AW - "Aruba"
AX - "Aland Islands"
AZ - "Azerbaijan"
BA - "Bosnia and Herzegovina"
BB - "Barbados"
BD - "Bangladesh"
BE - "Belgium"
BF - "Burkina Faso"
BG - "Bulgaria"
BH - "Bahrain"
BI - "Burundi"
BJ - "Benin"
BL - "Saint Bartelemey"
BM - "Bermuda"
BN - "Brunei Darussalam"
BO - "Bolivia"
BQ - "Bonaire -  Saint Eustatius and Saba"
BR - "Brazil"
BS - "Bahamas"
BT - "Bhutan"
BV - "Bouvet Island"
BW - "Botswana"
BY - "Belarus"
BZ - "Belize"
CA - "Canada"
CC - "Cocos (Keeling) Islands"
CD - "Congo -  The Democratic Republic of the"
CF - "Central African Republic"
CG - "Congo"
CH - "Switzerland"
CI - "Cote d'Ivoire"
CK - "Cook Islands"
CL - "Chile"
CM - "Cameroon"
CN - "China"
CO - "Colombia"
CR - "Costa Rica"
CU - "Cuba"
CV - "Cape Verde"
CW - "Curacao"
CX - "Christmas Island"
CY - "Cyprus"
CZ - "Czech Republic"
DE - "Germany"
DJ - "Djibouti"
DK - "Denmark"
DM - "Dominica"
DO - "Dominican Republic"
DZ - "Algeria"
EC - "Ecuador"
EE - "Estonia"
EG - "Egypt"
EH - "Western Sahara"
ER - "Eritrea"
ES - "Spain"
ET - "Ethiopia"
EU - "Europe"
FI - "Finland"
FJ - "Fiji"
FK - "Falkland Islands (Malvinas)"
FM - "Micronesia -  Federated States of"
FO - "Faroe Islands"
FR - "France"
GA - "Gabon"
GB - "United Kingdom"
GD - "Grenada"
GE - "Georgia"
GF - "French Guiana"
GG - "Guernsey"
GH - "Ghana"
GI - "Gibraltar"
GL - "Greenland"
GM - "Gambia"
GN - "Guinea"
GP - "Guadeloupe"
GQ - "Equatorial Guinea"
GR - "Greece"
GS - "South Georgia and the South Sandwich Islands"
GT - "Guatemala"
GU - "Guam"
GW - "Guinea-Bissau"
GY - "Guyana"
HK - "Hong Kong"
HM - "Heard Island and McDonald Islands"
HN - "Honduras"
HR - "Croatia"
HT - "Haiti"
HU - "Hungary"
ID - "Indonesia"
IE - "Ireland"
IL - "Israel"
IM - "Isle of Man"
IN - "India"
IO - "British Indian Ocean Territory"
IQ - "Iraq"
IR - "Iran -  Islamic Republic of"
IS - "Iceland"
IT - "Italy"
JE - "Jersey"
JM - "Jamaica"
JO - "Jordan"
JP - "Japan"
KE - "Kenya"
KG - "Kyrgyzstan"
KH - "Cambodia"
KI - "Kiribati"
KM - "Comoros"
KN - "Saint Kitts and Nevis"
KP - "Korea -  Democratic People's Republic of"
KR - "Korea -  Republic of"
KW - "Kuwait"
KY - "Cayman Islands"
KZ - "Kazakhstan"
LA - "Lao People's Democratic Republic"
LB - "Lebanon"
LC - "Saint Lucia"
LI - "Liechtenstein"
LK - "Sri Lanka"
LR - "Liberia"
LS - "Lesotho"
LT - "Lithuania"
LU - "Luxembourg"
LV - "Latvia"
LY - "Libyan Arab Jamahiriya"
MA - "Morocco"
MC - "Monaco"
MD - "Moldova -  Republic of"
ME - "Montenegro"
MF - "Saint Martin"
MG - "Madagascar"
MH - "Marshall Islands"
MK - "Macedonia"
ML - "Mali"
MM - "Myanmar"
MN - "Mongolia"
MO - "Macao"
MP - "Northern Mariana Islands"
MQ - "Martinique"
MR - "Mauritania"
MS - "Montserrat"
MT - "Malta"
MU - "Mauritius"
MV - "Maldives"
MW - "Malawi"
MX - "Mexico"
MY - "Malaysia"
MZ - "Mozambique"
NA - "Namibia"
NC - "New Caledonia"
NE - "Niger"
NF - "Norfolk Island"
NG - "Nigeria"
NI - "Nicaragua"
NL - "Netherlands"
NO - "Norway"
NP - "Nepal"
NR - "Nauru"
NU - "Niue"
NZ - "New Zealand"
OM - "Oman"
PA - "Panama"
PE - "Peru"
PF - "French Polynesia"
PG - "Papua New Guinea"
PH - "Philippines"
PK - "Pakistan"
PL - "Poland"
PM - "Saint Pierre and Miquelon"
PN - "Pitcairn"
PR - "Puerto Rico"
PS - "Palestinian Territory"
PT - "Portugal"
PW - "Palau"
PY - "Paraguay"
QA - "Qatar"
RE - "Reunion"
RO - "Romania"
RS - "Serbia"
RU - "Russian Federation"
RW - "Rwanda"
SA - "Saudi Arabia"
SB - "Solomon Islands"
SC - "Seychelles"
SD - "Sudan"
SE - "Sweden"
SG - "Singapore"
SH - "Saint Helena"
SI - "Slovenia"
SJ - "Svalbard and Jan Mayen"
SK - "Slovakia"
SL - "Sierra Leone"
SM - "San Marino"
SN - "Senegal"
SO - "Somalia"
SR - "Suriname"
SS - "South Sudan"
ST - "Sao Tome and Principe"
SV - "El Salvador"
SX - "Sint Maarten"
SY - "Syrian Arab Republic"
SZ - "Swaziland"
TC - "Turks and Caicos Islands"
TD - "Chad"
TF - "French Southern Territories"
TG - "Togo"
TH - "Thailand"
TJ - "Tajikistan"
TK - "Tokelau"
TL - "Timor-Leste"
TM - "Turkmenistan"
TN - "Tunisia"
TO - "Tonga"
TR - "Turkey"
TT - "Trinidad and Tobago"
TV - "Tuvalu"
TW - "Taiwan"
TZ - "Tanzania -  United Republic of"
UA - "Ukraine"
UG - "Uganda"
UM - "United States Minor Outlying Islands"
US - "United States"
UY - "Uruguay"
UZ - "Uzbekistan"
VA - "Holy See (Vatican City State)"
VC - "Saint Vincent and the Grenadines"
VE - "Venezuela"
VG - "Virgin Islands -  British"
VI - "Virgin Islands -  U.S."
VN - "Vietnam"
VU - "Vanuatu"
WF - "Wallis and Futuna"
WS - "Samoa"
YE - "Yemen"
YT - "Mayotte"
ZA - "South Africa"
ZM - "Zambia"
ZW - "Zimbabwe"