Segurança e SSL

Bloquear ou permitir o acesso por países

Revisto a 7 min de leitura firewall bloqueio por países

Pode limitar as visitas de determinados países de duas formas: a partir da área de cliente, sem mexer em nenhum ficheiro, ou com regras no .htaccess quando precisa de algo mais concreto, como proteger apenas o acesso de administração ou redirecionar consoante o país.

O país é calculado a partir do IP do visitante. É fiável na maioria dos casos, mas quem usar uma VPN ou um proxy aparecerá com o país desse serviço.

A partir da área de cliente

  1. Aceda à área de cliente e abra o seu serviço de alojamento.
  2. Entre em Firewall e antivírus > Bloqueio geográfico.
  3. Selecione o domínio que pretende proteger.
  4. Escolha o modo:
    • Lista negra: bloqueia os países selecionados e permite os restantes.
    • Lista branca: permite apenas os países selecionados e bloqueia os restantes.
  5. Selecione os países (ou continentes inteiros) e guarde.

O bloqueio aplica-se a todo o domínio. Se usar uma lista branca, verifique que não deixa de fora serviços que se ligam ao seu site a partir de outros países, como gateways de pagamento, webhooks ou monitores de disponibilidade. Para o retirar, volte à mesma secção e remova a configuração.

Com regras no .htaccess

O servidor geolocaliza cada visita e deixa o resultado nas variáveis GEOIP_COUNTRY_CODE (país) e GEOIP_CONTINENT_CODE (continente), que pode usar no .htaccess do domínio. Adicione as regras no início do ficheiro. Se também usar o bloqueio da área de cliente, não edite o bloco entre # BEGIN HostsuarGeoBlock e # END HostsuarGeoBlock: o painel reescreve-o ao guardar.

Os países indicam-se com o seu código ISO 3166-1 alfa-2 de duas letras: ES Espanha, RU Rússia, CN China, US Estados Unidos… Os continentes, com EU Europa, AS Ásia, AF África, NA América do Norte, SA América do Sul e OC Oceânia.

Bloquear vários países

Este exemplo bloqueia a Rússia, a China e a Coreia do Norte e permite os restantes:

GeoIPEnable On
SetEnvIf GEOIP_COUNTRY_CODE RU DenyCountry
SetEnvIf GEOIP_COUNTRY_CODE CN DenyCountry
SetEnvIf GEOIP_COUNTRY_CODE KP DenyCountry
Allow from all
Deny from env=DenyCountry

Adicione uma linha SetEnvIf por cada país que pretenda bloquear.

Permitir apenas alguns países

Ao contrário: permite Espanha e Portugal e bloqueia os restantes:

GeoIPEnable On
SetEnvIf GEOIP_COUNTRY_CODE ES AllowCountry
SetEnvIf GEOIP_COUNTRY_CODE PT AllowCountry
Deny from all
Allow from env=AllowCountry

Para permitir um continente inteiro, use GEOIP_CONTINENT_CODE; por exemplo, apenas a Europa:

GeoIPEnable On
SetEnvIf GEOIP_CONTINENT_CODE EU AllowCountry
Deny from all
Allow from env=AllowCountry

Limitar o acesso ao wp-admin ao seu país

Muitas vezes não quer bloquear o site, mas apenas o acesso de administração. Este exemplo deixa entrar no wp-login.php, no wp-admin e no xmlrpc.php do WordPress unicamente a partir de Espanha; o resto do site continua aberto a todo o mundo:

GeoIPEnable On
RewriteEngine On
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(ES)$
RewriteCond %{REQUEST_URI} ^/(wp-login\.php|wp-admin/|xmlrpc\.php) [NC]
RewriteCond %{REQUEST_URI} !^/wp-admin/admin-ajax\.php [NC]
RewriteRule ^ - [F,L]

A exceção do admin-ajax.php é necessária porque muitos plugins e temas também o usam na parte pública. Para permitir mais de um país, separe-os com |: !^(ES|PT)$. Se viajar, lembre-se de que você também ficará de fora até retirar ou alargar a regra.

Redirecionar consoante o país

Também pode enviar os visitantes de certos países para outra versão do site. Este exemplo redireciona quem chega dos Estados Unidos ou do Canadá:

GeoIPEnable On
RewriteEngine On
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(US|CA)$
RewriteRule ^(.*)$ https://www.otraweb.com/$1 [R=302,L]

Use 302 (temporário) e não 301: os navegadores guardam os redirecionamentos permanentes e um visitante que mude de país continuaria a ser redirecionado. Tenha em conta que a Google rastreia maioritariamente a partir dos Estados Unidos, por isso um redirecionamento por país pode impedi-la de ver o seu site original.

Ler o país do visitante a partir do PHP

Com GeoIPEnable On no início do .htaccess, o seu código PHP recebe a geolocalização em $_SERVER:

<?php

echo $_SERVER['GEOIP_ADDR'];           // IP a partir do qual acede
echo $_SERVER['GEOIP_COUNTRY_CODE'];   // código do país, por exemplo ES
echo $_SERVER['GEOIP_CONTINENT_CODE']; // código do continente, por exemplo EU

Assim pode, por exemplo, pré-selecionar o idioma ou a moeda sem chamar um serviço externo. Se o IP não puder ser localizado, a variável não existe: use $_SERVER['GEOIP_COUNTRY_CODE'] ?? '' para evitar avisos.

Se alguém legítimo deixar de conseguir entrar

  • Verifique o país atribuído ao seu IP com qualquer serviço de geolocalização e compare-o com a sua lista.
  • Numa lista branca, adicionar um país permite-o; numa lista negra, bloqueia-o. Reveja o modo antes de adicionar países.
  • Se o seu site estiver por trás de uma CDN como a Cloudflare, o servidor pode ver o IP da CDN em vez do do visitante. Nesse caso, use o bloqueio por países da própria CDN.
  • Se se bloqueou a si mesmo, retire as regras do .htaccess a partir do gestor de ficheiros do cPanel ou remova o bloqueio na área de cliente.

O bloqueio por países reduz muito o tráfego malicioso automatizado, mas não substitui manter o site atualizado e usar palavras-passe seguras.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.