xtables-addons: filtrar pacotes por país

xtables-addons: filtrar pacotes por país
A tarefa de bloquear o tráfego de determinados países parece simples, mas as primeiras impressões podem enganar. Hoje vamos contar como isso pode ser implementado.

Pré-história

Os resultados de uma pesquisa no Google sobre este tema são decepcionantes: a maioria das soluções estão “podres” há muito tempo e às vezes parece que este tema foi arquivado e esquecido para sempre. Examinamos muitos registros antigos e estamos prontos para compartilhar uma versão moderna das instruções.

Recomendamos que você leia o artigo inteiro antes de executar esses comandos.

Preparação do sistema operacional

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

No momento em que este artigo foi escrito, a versão atual do xtables-addons era 3.9. No entanto, apenas 20.04 pode ser encontrado nos repositórios padrão do Ubuntu 3.8 LTS e 18.04 nos repositórios do Ubuntu 3.0. 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 diferenças pequenas, mas importantes, entre a versão 3.9 e o estado atual do projeto, que discutiremos mais tarde. Para construir a partir do código-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 não quiser arrastar extensões desnecessárias para o sistema, você pode excluí-las da compilação. Para fazer isso você precisa editar o arquivo mconfig. Para todos os módulos desejados, instale ye marque todos os desnecessários 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 ocorrer um erro semelhante ao seguinte:

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 surge devido à impossibilidade de assinar módulos do kernel, pois 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 do kernel compilado está instalado, mas o sistema não o detecta. Vamos pedir ao sistema para criar um mapa de dependências levando em consideração o novo módulo e depois carregá-lo:

depmod -a

modprobe xt_geoip

Vamos ter certeza de que xt_geoip está 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

Estamos felizes com tudo e só falta adicionar o nome do módulo ao / etc / modulespara que o módulo funcione após reiniciar o sistema operacional. De agora em diante, o iptables entende os comandos geoip, mas não possui dados suficientes para trabalhar. Vamos começar a carregar o banco de dados geoip.

Obtendo o banco de dados GeoIP

Criamos um diretório no qual serão armazenadas informações compreensíveis para a extensão iptables:

mkdir /usr/share/xt_geoip

No início do artigo mencionamos que existem diferenças entre a versão do código-fonte e a versão do gerenciador de pacotes. A diferença mais notável é a mudança no fornecedor do banco de dados e no script xt_geoip_dl, que baixa os dados mais recentes.

Versão do gerenciador de pacotes

O script está localizado no caminho /usr/lib/xtables-addons, mas ao tentar executá-lo, 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 produto GeoLite, agora conhecido como GeoLite Legacy, distribuído sob licença, era usado como banco de dados Creative Commons ASA 4.0 por empresa MaxMind. Dois eventos aconteceram com este produto ao mesmo tempo que “quebraram” a compatibilidade com a extensão iptables.

Em primeiro lugar, em janeiro de 2018 anunciou sobre o encerramento do suporte ao produto, e em 2019 de janeiro de 2, todos os links para download da versão antiga do banco de dados foram removidos do site oficial. Recomenda-se que novos usuários usem o produto GeoLite2 ou sua versão paga GeoIPXNUMX.

Em segundo lugar, desde dezembro de 2019 MaxMind dito sobre uma mudança significativa no acesso às suas bases de dados. Para cumprir a Lei de Privacidade do Consumidor da Califórnia, a MaxMind decidiu “cobrir” a distribuição do GeoLite2 com registro.

Como queremos utilizar o produto deles, iremos nos cadastrar nesta página.

xtables-addons: filtrar pacotes por país
Você receberá um e-mail solicitando que você defina uma senha. Agora que criamos uma conta, precisamos criar uma chave de licença. Na sua conta pessoal encontramos o item Minhas chaves de licençae clique no botão Gerar nova chave de licença.

Ao criar uma chave, nos será feita apenas uma pergunta: usaremos esta chave no programa GeoIP Update? Respondemos negativamente e apertamos o botão Confirmar. A chave será exibida em uma janela pop-up. Salve esta chave em um local seguro, pois depois de fechar a janela pop-up, você não poderá mais visualizar a chave inteira.

xtables-addons: filtrar pacotes por país
Temos a possibilidade de baixar os bancos de dados GeoLite2 manualmente, mas seu formato não é compatível com o formato esperado pelo script xt_geoip_build. É aqui que os scripts GeoLite2xtables vêm em socorro. Para executar scripts, instale o módulo perl NetAddr::IP:

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

A seguir, clonamos o repositório com scripts e gravamos a chave de licença obtida anteriormente em um arquivo:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Vamos executar 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 2000 downloads por dia e, com um grande número de servidores, oferece cache da atualização em um servidor proxy.

Observe que o arquivo de saída deve ser chamado dbip-country-lite.csv... Infelizmente, 20_convert_geolite2 não produz um arquivo perfeito. Roteiro xt_geoip_build espera três colunas:

  • 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 do intervalo de endereços (representação de string);
  • fim do intervalo de endereços (representação de string);
  • início da faixa de endereços (representação numérica);
  • fim do intervalo de endereços (representação numérica);
  • código do país;
  • o nome do país.

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

  1. reinado 20_convert_geolite2;
  2. reinado xt_geoip_build.

No primeiro caso reduzimos printf para o formato desejado, e no segundo - alteramos a atribuição à variável $ cc em $linha->[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 Tabelas GeoLite2x não considera seus roteiros prontos para produção e oferece seguir para o desenvolvimento de scripts xt_geoip_* originais. Portanto, vamos passar à montagem dos códigos-fonte, nos quais esses scripts já foram atualizados.

Versão de origem

Ao instalar a partir de scripts de código-fonte xt_geoip_* estão localizados no catálogo /usr/local/libexec/xtables-addons. Esta versão do script usa um banco de dados IP para País Lite. A licença é Creative Commons Attribution License, e a partir dos dados disponíveis existem as três colunas muito necessárias. Baixe e monte 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 no iptables

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.

Os métodos de criação de regras para iptables, em geral, permanecem inalterados. Para usar chaves 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 que não sejam dos EUA em todas as interfaces:

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

Os arquivos criados por xt_geoip_build são usados ​​apenas na criação de regras, mas não são levados em consideração na filtragem. Assim, para atualizar corretamente o banco de dados geoip, você deve primeiro atualizar os arquivos iv*, e depois recriar todas as regras que utilizam geoip no iptables.

Conclusão

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

xtables-addons: filtrar pacotes por país

Apenas usuários registrados podem participar da pesquisa. Entrarpor favor

Você já usou a filtragem por país?

  • 59,1%sim13

  • 40,9%No9

22 usuários votaram. 3 usuários se abstiveram.

Fonte: habr.com

Adicionar um comentário