xtables-addons: filtros de pacotes por país



A tarefa de bloquear o tráfego de certos países parece simples, mas a primeira impressão engana. Hoje vamos contar como isso pode ser implementado.



fundo



Os resultados da pesquisa no Google sobre esse tópico são perturbadores: a maioria das soluções há muito tempo está "podre" e às vezes parece que esse tópico foi arquivado e esquecido para sempre. Examinamos muitos registros antigos e estamos prontos para compartilhar a versão moderna das instruções.

Recomendamos que você leia todo o artigo antes de executar os comandos indicados.

Preparando o sistema operacional



A filtragem será configurada usando o utilitário iptables , que requer uma extensão para trabalhar com dados GeoIP. Essa extensão pode ser encontrada em xtables-addons . xtables-addons instala extensões iptables como módulos de kernel autônomos, portanto, não há necessidade de recompilar o kernel do sistema operacional.



No momento em que este artigo foi escrito, a versão atual de xtables-addons é 3.9. No entanto, apenas 3.8 podem ser encontrados nos repositórios padrão do Ubuntu 20.04 LTS e 3.0 nos repositórios do Ubuntu 18.04. Você pode instalar a extensão do gerenciador de pacotes com o seguinte comando:



apt install xtables-addons-common libtext-csv-xs-perl


Observe que existem pequenas, mas importantes diferenças entre a versão 3.9 e o estado atual do projeto, que discutiremos mais tarde. Para construir a partir dos códigos-fonte, instale todos os pacotes necessários:



apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl


Clone o repositório:



git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons


cd xtables-addons-xtables-addons


xtables-addons contém muitas extensões, mas estamos interessados ​​apenas em xt_geoip . Se você não quiser arrastar extensões desnecessárias para o sistema, pode excluí-las da montagem. Para fazer isso, você precisa editar o arquivo mconfig . Para todos os módulos desejados, coloque y , e todos os desnecessários, defina n . Nós coletamos:



./autogen.sh


./configure


make


E instale com direitos de superusuário:



make install


Durante a instalação dos módulos do kernel, pode aparecer um erro com o seguinte conteúdo:



INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory


Esta situação ocorre devido à impossibilidade de assinar módulos do kernel, uma vez que nada para assinar. Você pode resolver esse problema com alguns comandos:



cd /lib/modules/(uname -r)/build/certs


cat <<EOF > x509.genkey


[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Modules

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF


openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem


O módulo compilado do kernel está instalado, mas o sistema não o detecta. Vamos pedir ao sistema para criar um mapa de dependência baseado no novo módulo e, em seguida, carregá-lo:



depmod -a


modprobe xt_geoip


Certifique-se de que xt_geoip esteja carregado no sistema:



# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables


Além disso, certifique-se de que a extensão esteja carregada no iptables:



# cat /proc/net/ip_tables_matches 
geoip
icmp


Tudo nos convém e tudo o que resta é adicionar o nome do módulo em / etc / modules para que o módulo funcione após reiniciar o SO. Neste ponto, o iptables entende os comandos geoip, mas não possui os dados para trabalhar. Vamos começar a carregar o banco de dados geoip.



Obter banco de dados GeoIP



Crie um diretório que armazenará informações para a extensão iptables:



mkdir /usr/share/xt_geoip


No início deste artigo, mencionamos que existem diferenças entre a versão fonte e a versão do gerenciador de pacotes. A diferença mais notável é a mudança do provedor de banco de dados e o script xt_geoip_dl , que baixa os dados reais.



Versão do gerenciador de pacotes



O script encontra-se no caminho / usr / lib / xtables-addons, no entanto, ao tentar iniciar, você verá um erro não muito informativo:



# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.


Anteriormente, o banco de dados usava o produto GeoLite, agora conhecido como GeoLite Legacy, distribuído sob a licença Creative Commons ASA 4.0 da MaxMind . Com este produto, ocorreram dois eventos ao mesmo tempo, que "quebraram" a compatibilidade com a extensão para iptables.



Primeiramente, em janeiro de 2018, foi anunciado o fim do suporte ao produto e, em 2 de janeiro de 2019, todos os links para download da versão antiga do banco de dados foram retirados do site oficial. Novos usuários são aconselhados a usar o produto GeoLite2 ou sua versão paga GeoIP2.



Em segundo lugar, desde dezembro de 2019, a MaxMind anunciousobre uma mudança significativa no acesso aos seus bancos de dados. Para cumprir a lei de proteção ao consumidor da Califórnia, a MaxMind decidiu “encobrir” a distribuição do GeoLite2 por meio de registro.



Uma vez que queremos usar o seu produto, iremos nos registrar nesta página.





Depois disso, será enviada uma mensagem para o correio com um pedido de definição de uma palavra-passe. Agora que criamos uma conta, precisamos criar uma chave de licença. Em sua conta pessoal, encontre o item Minhas Chaves de Licença e clique no botão Gerar nova Chave de Licença .



Ao criar uma chave, nos será feita apenas uma pergunta: vamos usar esta chave no programa de atualização GeoIP? Respondemos negativamente e clicamos no botão Confirmar . A chave será exibida em uma janela pop-up. Guarde esta chave em um local seguro, pois após fechar a janela pop-up você não poderá mais ver a chave completa.





Temos a capacidade de baixar bancos de dados GeoLite2 manualmente, mas seu formato não é compatível com o formato esperado pelo script xt_geoip_build. É aqui que entram os scripts GeoLite2xtables. Para que os scripts funcionem, instale o módulo NetAddr :: IP perl:



wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz


tar xvf NetAddr-IP-4.079.tar.gz


cd NetAddr-IP-4.079


perl Makefile.PL


make


make install


Em seguida, clonamos o repositório com scripts e gravamos a chave de licença obtida anteriormente no arquivo:



git clone https://github.com/mschmitt/GeoLite2xtables.git


cd GeoLite2xtables


echo YOUR_LICENSE_KEY=\’123ertyui123\' > geolite2.license


Lançamos os scripts:



#   GeoLite2
./00_download_geolite2
#     (  )
./10_download_countryinfo
#  GeoLite2    GeoLite Legacy 
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv
MaxMind impõe um limite de 2.000 downloads por dia e, com um grande número de servidores, oferece para armazenar em cache a atualização em um servidor proxy.
Observe que o arquivo de saída deve ter o nome dbip-country-lite.csv . Infelizmente, 20_convert_geolite2 não produz um arquivo perfeito. O script xt_geoip_build espera três colunas:



  • o início do intervalo de endereços;
  • fim do intervalo de endereços;
  • código do país em iso-3166-alpha2.


E o arquivo de saída contém seis colunas:



  • início da faixa de endereço (representação de string);
  • fim do intervalo de endereços (representação de string);
  • início da faixa de endereço (numérico);
  • fim do intervalo de endereços (numérico);
  • código do país;
  • o nome do país.


Essa discrepância é crítica e pode ser corrigida de duas maneiras:



  1. editar 20_convert_geolite2 ;
  2. editar xt_geoip_build .


No primeiro caso, encurtamos printf para o formato desejado e, no segundo, alteramos a atribuição da variável $ cc para $ row -> [4] . Depois disso, você pode construir:



/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip


. . .
 2239 IPv4 ranges for ZA
  348 IPv6 ranges for ZA
   56 IPv4 ranges for ZM
   12 IPv6 ranges for ZM
   56 IPv4 ranges for ZW
   15 IPv6 ranges for ZW


Observe que o autor de GeoLite2xtables não considera seus scripts como prontos para produção e sugere que você siga o desenvolvimento dos scripts xt_geoip_ * originais. Portanto, vamos prosseguir para a construção do código-fonte, no qual esses scripts já foram atualizados.



Versão fonte



Ao instalar a partir do código-fonte, os scripts xt_geoip_ * estão localizados no diretório / usr / local / libexec / xtables-addons . Esta versão do script usa o banco de dados IP to Country Lite . Licença - Licença de atribuição Creative Commons e, a partir dos dados disponíveis, essas são as três colunas mais necessárias. Baixe e colete o banco de dados:



cd /usr/share/xt_geoip/


/usr/local/libexec/xtables-addons/xt_geoip_dl


/usr/local/libexec/xtables-addons/xt_geoip_build


Após essas etapas, o iptables está pronto para funcionar.



Usando geoip em iptables



O módulo xt_geoip adiciona apenas duas chaves:



geoip match options:
[!] --src-cc, --source-country country[,country...]
	Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
	Match packet going to (one of) the specified country(ies)

NOTE: The country is inputed by its ISO3166 code.


A forma como as regras de iptables são formadas permanece praticamente inalterada. Para usar opções de módulos adicionais, você deve especificar explicitamente o nome do módulo com a opção -m. Por exemplo, uma regra para bloquear conexões TCP de entrada na porta 443 de fora dos EUA em todas as interfaces:



iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP


Os arquivos gerados por xt_geoip_build são usados ​​apenas ao criar regras, mas não são considerados para filtragem. Portanto, para atualizar o banco de dados geoip corretamente, você deve primeiro atualizar os arquivos iv * e, em seguida, recriar todas as regras que usam geoip em iptables.

Conclusão



Filtrar pacotes por país é uma estratégia um tanto esquecida. Apesar disso, ferramentas de software para essa filtragem estão sendo desenvolvidas e, talvez, em breve uma nova versão do xt_geoip com um novo provedor de dados geoip aparecerá nos gerenciadores de pacotes, o que simplificará muito a vida dos administradores de sistema.






All Articles