
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 . 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-perlVale 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-perlClonamos o repositório:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addonsO 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./configuremakeE instalamos com privilégios de superusuário:
make installDurante 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 directoryEssa 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/certscat < 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
EOFopenssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pemO 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 -amodprobe xt_geoipVamos garantir que o xt_geoip foi carregado no sistema:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tablesAlém disso, vamos verificar se a extensão foi carregada no iptables:
# cat /proc/net/ip_tables_matches
geoip
icmpEstamos 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_geoipNo 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 pela empresa . Com esse produto, ocorreram dois eventos que "quebraram" a compatibilidade com a extensão do iptables.
Primeiro, em janeiro de 2018 , 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 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.

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.

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.gztar xvf NetAddr-IP-4.079.tar.gzcd NetAddr-IP-4.079perl Makefile.PLmakemake installEm 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.gitcd GeoLite2xtablesecho YOUR_LICENSE_KEY='123ertyui123' > geolite2.licenseExecutamos 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.csvA 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:
- editar 20_convert_geolite2;
- editar xt_geoip_build.
No primeiro caso, reduzimos 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 não considera seus scripts prontos para produção e recomenda 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 . 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_buildApó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 DROPOs 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.
Apenas usuários registrados podem participar da pesquisa. , 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
