Saudações,
Conversando com um cliente estes dias, ele me perguntou: É possível limitar um site ou parte do site de forma que somente IPs do Brasil possam ter acesso?
Imediatamente a minha resposta foi SIM!
Pois... nada que um pouco de configuração não resolva se temos a CIDR do Brasil.
Obtendo a CIDR delegada para o Brasil
Alguns anos atras eu já havia feito algo parecido com um servidor ProFTPD. Eu limitei o acesso a porta 21 somente para IPs do Brasil.
Contudo, a lista de blocos que eu tenho estava desatualizada. E, a rede IPv4 passou por uma realocação, por causa do esgotamento de IPs, e eu precisava de uma lista nova.
Mas, não há nem uma dificuldade em se atualizar, pois, a Lacnic fornece uma lista completa dos blocos em ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest.
A lista acima contem todas as CIDR alocadas para a America Latina. Ela segue o formato RIR Statistics Exchange Format.
Este arquivo RIR de estatística segue, em suas linhas de registro, o seguinte formato:
registry|cc|type|start|value|date|status[|extensions...] ( veja seção 3.3 Record format )
Por exemplo:
lacnic|AR|ipv4|24.232.0.0|65536|19970602|allocated
lacnic|CL|ipv4|45.4.0.0|1024|20170224|allocated
lacnic|BR|ipv4|45.4.4.0|1024|20170221|allocated
...
No site da Lacnic é possível baixar a versão estendida com a lista CIDR IPv6! Para atender o meu cliente eu precisei somente do IPv4.
Extraindo os blocos e suas mascaras de rede
Feito o download e compreendido o formato do arquivo, ficou fácil obter a máscara de bits de cada bloco. Eu fiz isto usando o seguinte script Shell em Bash...
#!/bin/bash # BLOCOS DA AMERICA LATINA AL="delegated-lacnic-latest.txt"; if [ ! -f ${AL} ] then echo ""; echo "Como usar este script:"; echo ""; echo "Baixe a lista de delegacao em:"; echo "ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest"; echo ""; echo "Salve-a no mesmo diretorio deste script"; echo "com o nome delegated-lacnic-latest.txt."; echo ""; echo "Por fim execute o script $(basename ${0})."; echo ""; exit 0; fi; # NUMERO DE SUB REDES E SUA NOTACAO CIDR declare -A NH; NH=( [2147483648]=1 [1073741824]=2 [536870912]=3 [268435456]=4 [134217728]=5 [67108864]=6 [33554432]=7 [16777216]=8 [8388608]=9 [4194304]=10 [2097152]=11 [1048576]=12 [524288]=13 [262144]=14 [131072]=15 [65536]=16 [32768]=17 [16384]=18 [8192]=19 [4096]=20 [2048]=21 [1024]=22 [512]=23 [256]=24 [128]=25 [64]=26 [32]=27 [16]=28 [8]=29 [4]=30 [2]=31 [1]=32 ); # LISTA SOMENTE CIDR DO BRASIL BR=$(awk -F"|" '$2 ~ /BR/ && $3 ~ /ipv4/ {print $4":"$5}' ${AL}); # PROCESSA ITENS for I in ${BR} do # BLOCO IP BI=$(echo ${I} | cut -d: -f1); # NUMEROD DE SUB REDES SR=$(echo ${I} | cut -d: -f2); # BLOCO COM NETMASK echo "${BI}/${NH[${SR}]}"; done; exit 0;
Ficou bem simples com uma array associativa não?
Executado o script, eu obtive uma saída tipo:
45.4.4.0/22
45.4.8.0/22
45.4.12.0/22
...
"Meio caminho andado". Agora eu precisava fazer, em um VPS, nas diretivas do Apache, a jogada do Allow/Deny.
A configuração ficou parecida com:
...
order allow,deny
allow from 45.4.4.0/22
allow from 45.4.8.0/22
allow from 45.4.12.0/22
...
Ah! Lembrando que as diretivas Allow/Deny estão obsoletas e serão removidas do Apache futuramente. Se desejar, e a sua versão do Apache for compatível, use a diretiva Require.
Bem, é isto... um service apache2 restart depois, e uma tentativa de acesso via Opera VPN, o navegador web retornou um belo Forbidden.
Forbidden usando VPN |
Agora é com você! A lista pode ser usada no Firewall, no .htaccess, em seu site PHP, em um servidor proxy, em seus scripts, etc. Seja criativo!
Paz a todos!
0 comentários:
Postar um comentário