xtables-addons: filtrando pacotes por países

xtables-addons: filtrando pacotes por países
A tarefa de bloquear o tráfego de determinados países parece simples, mas a primeira impressão é enganosa. Hoje, vamos explicar como isso pode ser realizado.

Antecedentes

Os resultados da pesquisa no Google sobre este assunto são desanimadores: a maioria das soluções já está desatualizada e às vezes parece que este tema foi arquivado e esquecido para sempre. Nós, por outro lado, 'vasculhamos' muitos registros antigos e estamos prontos para compartilhar uma versão moderna das instruções.

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

Preparação do sistema operacional

A filtragem será configurada usando a ferramenta iptables, que requer uma extensão para trabalhar com dados GeoIP. Essa extensão pode ser encontrada em xtables-addons. O xtables-addons instala extensões para iptables na forma de módulos independentes do núcleo, eliminando a necessidade de recompilar o núcleo do SO.

No momento da redação deste artigo, a versão atual do xtables-addons é 3.9. No entanto, nos repositórios padrão do Ubuntu 20.04 LTS, só é possível encontrar a versão 3.8, enquanto nos repositórios do Ubuntu 18.04 está disponível a versão 3.0. Para instalar a extensão a partir do gerenciador de pacotes, utilize o seguinte comando:

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

Vale ressaltar que entre a versão 3.9 e o estado atual do projeto existem pequenas, mas importantes diferenças, que vamos discutir mais tarde. Para compilar a partir do código-fonte, precisamos instalar 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

Clonamos o repositório:

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

cd xtables-addons-xtables-addons

O xtables-addons contém diversas extensões, mas estamos interessados apenas em xt_geoip. Se você não quiser adicionar extensões desnecessárias ao sistema, elas podem ser excluídas da compilação. Para isso, é necessário editar o arquivo mconfig. Para todos os módulos desejados, marque y, e todos os desnecessários, marque como n. Compilamos:

./autogen.sh

./configure

make

E instalamos com privilégios de superusuário:

make install

Durante a instalação dos módulos do núcleo, pode ocorrer um erro com a seguinte mensagem:

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

Essa situação ocorre devido à impossibilidade de assinar os módulos do núcleo, pois não há como assinar. Para resolver esse problema, você pode usar alguns comandos:

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

cat < 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 foi compilado e instalado, mas o sistema não o reconhece. Vamos pedir ao sistema para criar um mapa de dependências considerando o novo módulo e, em seguida, carregá-lo:

depmod -a

modprobe xt_geoip

Vamos garantir que o xt_geoip foi carregado no sistema:

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

Além disso, vamos verificar se a extensão foi carregada no iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Estamos satisfeitos e só resta adicionar o nome do módulo em /etc/modules, para que o módulo funcione após a reinicialização do sistema operacional. A partir desse momento, o iptables entende comandos geoip, mas carece de dados para operar. Vamos proceder ao carregamento do banco de dados geoip.

Obtendo o banco de dados GeoIP

Criamos um diretório onde as informações compreensíveis pela extensão iptables serão armazenadas:

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 do fornecedor do banco de dados e do script xt_geoip_dl, que baixa os dados atuais.

A versão do gerenciador de pacotes

O script está localizado em /usr/lib/xtables-addons, mas ao tentar executá-lo, pode-se ver um erro pouco 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 utilizado era o produto GeoLite, atualmente conhecido como GeoLite Legacy, distribuído sob a licença Creative Commons ASA 4.0 pela empresa MaxMind. Com esse produto, ocorreram dois eventos que "quebraram" a compatibilidade com a extensão do iptables.

Primeiro, em janeiro de 2018 foi anunciado , foi anunciado o encerramento do suporte ao produto, e no dia 2 de janeiro de 2019, todos os links para baixar a versão antiga do banco foram removidos do site oficial. Novos usuários são recomendados a usar o produto GeoLite2 ou sua versão paga GeoIP2.

Em segundo lugar, desde dezembro de 2019, a MaxMind declarou anunciou uma mudança significativa no acesso aos seus bancos de dados. Para cumprir a Lei de Proteção ao Consumidor da Califórnia, a empresa MaxMind decidiu "encerrar" a distribuição do GeoLite2 mediante registro.

Como queremos utilizar o produto deles, devemos nos registrar nesta página.

xtables-addons: filtrando pacotes por países
Após isso, um e-mail será enviado solicitando a criação de uma senha. Agora que criamos a conta, precisamos gerar uma chave de licença. No painel pessoal, encontramos o item Minhas Chaves de Licença, e, em seguida, clicamos no botão Gerar nova Chave de Licença.

Durante a criação da chave, será feita apenas uma pergunta: vamos usar esta chave no programa GeoIP Update? Respondemos negativamente e clicamos no botão Confirmar. Uma janela pop-up mostrará a chave. Salve esta chave em um lugar seguro, pois após fechar a janela pop-up, você não poderá visualizar a chave completamente novamente.

xtables-addons: filtrando pacotes por países
Temos a opção de baixar os bancos de dados GeoLite2 manualmente, mas seu formato não é compatível com o formato que o script xt_geoip_build espera. Aqui, os scripts GeoLite2xtables entram em cena. Para fazer os scripts funcionarem, instalamos 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

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

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY='123ertyui123' > geolite2.license

Executamos 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

A MaxMind impõe um limite de 2000 downloads por dia e, com um grande número de servidores, sugere armazenar o update em um servidor proxy.

Note que o arquivo de saída deve obrigatoriamente ser chamado dbip-country-lite.csv. Infelizmente, 20_convert_geolite2 gera um arquivo não ideal. O script 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 em string);
  • fim do intervalo de endereços (representação em string);
  • início do intervalo de endereços (representação numérica);
  • fim do intervalo de endereços (representação numérica);
  • código do país;
  • nome do país.

Essa incompatibilidade é crítica e pode ser corrigida de duas maneiras:

  1. editar 20_convert_geolite2;
  2. editar xt_geoip_build.

No primeiro caso, reduzimos printf para o formato necessário, e no segundo, modificamos a atribuição da variável $cc para $row->[4]. Após isso, podemos realizar a compilação:

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

. . .
 2239 intervalos IPv4 para ZA
  348 intervalos IPv6 para ZA
   56 intervalos IPv4 para ZM
   12 intervalos IPv6 para ZM
   56 intervalos IPv4 para ZW
   15 intervalos IPv6 para ZW

É importante notar que o autor GeoLite2xtables não considera seus scripts prontos para produção e recomenda monitorar pela criação de scripts originais xt_geoip_*. Portanto, vamos passar para a montagem a partir do código-fonte, onde esses scripts já estão atualizados.

Versão a partir do código-fonte

Na instalação a partir do código-fonte, os scripts xt_geoip_* estão localizados no diretório /usr/local/libexec/xtables-addons. Nesta versão do script, é utilizado um banco de dados IP to Country Lite. A licença é a Licença de Atribuição Creative Commons, e dos dados disponíveis, aqueles três colunas necessárias. Vamos baixar e montar 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 estará pronto para funcionar.

Usamos geoip no iptables

Módulo xt_geoip adiciona apenas duas opções:

opções de correspondência geoip:
[!] --src-cc, --source-country country[,country...]
	Corresponde a pacotes vindos do(s) país(es) especificado(s)
[!] --dst-cc, --destination-country country[,country...]
	Corresponde a pacotes indo para o(s) país(es) especificado(s)

NOTA: O país é inserido pelo seu código ISO3166.

Os métodos para a formação de regras para iptables, em geral, permanecem inalterados. Para usar as opções de módulos adicionais, é necessário 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 são 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 pelo xt_geoip_build são usados apenas na criação de regras, mas não são considerados na filtragem. Assim, para atualizar corretamente o banco de dados geoip, é necessário primeiro atualizar os arquivos iv* e, em seguida, recriar todas as regras que usam geoip no iptables.

Conclusão

A filtragem de pacotes com base na origem dos países é uma estratégia um tanto esquecida com o tempo. Apesar disso, as ferramentas de software para tal filtragem estão se desenvolvendo e, talvez em breve, novas versões do xt_geoip com novos provedores de dados geoip apareçam nos gerenciadores de pacotes, o que tornará a vida dos administradores de sistema muito mais fácil.

xtables-addons: filtrando pacotes por países

Apenas usuários registrados podem participar da pesquisa. Entre, por favor.

Você já teve que usar filtragem por países?

  • 59,1%Sim13

  • 40,9%Não9

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

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster