Acontece que não preciso reinventar completamente o volante para obter algum tipo de suporte ao GeoIP misturado com o IPTables. O uso do IPSet com uma cópia do banco de dados GeoIP Country da MaxMind no formato CSV - além de uma regra simples de IPTables - é tudo o que você precisa para colocar isso em prática no Ubuntu 12.04.5 (LTS).
Uma nota lateral, mas alguns tutoriais on-line que explicam um procedimento como este recomendam o uso de arquivos de zona do país baseados na Web, como os que vêm do site da IPDeny:
http://www.ipdeny.com/ipblocks/data/countries/cn.zone
Embora isso funcione tecnicamente, não gosto da ideia de ter que confiar tanto nos dados de um site externo como esse. E se eu quiser criar um processo de script automatizado para gerenciar isso e o site do IPDeny cair ou for hackeado? Cujos IPs estariam bloqueando.
É por isso que estou preferindo usar o banco de dados de Países GeoIP da MaxMind no formato CSV em meus servidores. Eu sempre posso buscar uma nova cópia desse banco de dados se precisar de atualizações e, mesmo que o site deles esteja inativo, eu sempre tenho uma cópia do banco de dados em meus servidores. E como esse banco de dados contém todos os países do mundo, sempre posso adicionar mais países facilmente ao conjunto de IPs usando as duas letras do país Código do país ISO 3166-1 .
De qualquer forma, aqui estão os passos que eu dei para fazer isso com o IPSet e o banco de dados do país da MaxMind GeoIP.
1. Instalar o IPSet.
Primeiro, instale o IPSet assim.
sudo aptitude install ipset
Uma vez instalado, crie um BANNED_RANGES
IP configurado assim:
sudo ipset create BANNED_RANGES hash:net
2. Obtenha uma cópia do banco de dados do País da MaxMind GeoIP no formato CSV.
A próxima chave para isso é obter uma cópia do banco de dados do País da MaxMind GeoIP no formato CSV instalado no servidor. Meus passos são os seguintes:
curl -O -L http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Agora, descompacte o arquivo:
unzip -o -q -d . GeoIPCountryCSV.zip
3. Filtre e importe uma configuração IPSet específica do país como esta.
Agora usaremos o Awk para filtrar os intervalos de IP específicos da China em um arquivo de configuração do IPSet:
awk -F "," -v COUNTRY_CODE=CN -v IPSET_TABLE=BANNED_RANGES} '$5 ~ COUNTRY_CODE { gsub(/"/, "", $1); gsub(/"/, "", $2); print "add "IPSET_TABLE" "$1"-"$2; }' /usr/local/share/GeoIP/GeoIPCountryWhois.csv >> ipset.BANNED_RANGES.conf
Isso criará um arquivo de configuração IPSet chamado ipset.BANNED_RANGES.conf
, que pode ser importado para o IPSet assim:
sudo ipset restore < ipset.BANNED_RANGES.conf
E você pode verificar os itens nesse conjunto com este comando:
sudo ipset -l BANNED_RANGES | more
4. Torne o IPTables ciente do IPSet.
Agora, a etapa final que reúne tudo isso é inserir uma regra simples no IPTables assim:
sudo iptables -I INPUT -p tcp -m set --match-set BANNED_RANGES src -j REJECT
Uma vez feito isso, o IPTables agora sabe que todos os endereços IP ou intervalos adicionados ao BANNED_RANGES
conjunto serão simplesmente rejeitados por meio de REJECT
.
Se você quiser se livrar dessa regra mais tarde, pode executar este comando:
sudo iptables -D INPUT -p tcp -m set --match-set BANNED_RANGES src -j REJECT
Mas para mim isso é um pouco confuso. Uma maneira mais limpa de lidar com um caso como este é apenas liberar todos os dados IP do conjunto BANNED_RANGES
da seguinte forma:
sudo ipset flush BANNED_RANGES
Ao fazer isso, você pode ter essa regra do IPTables em vigor e não precisar fazer nada além de liberar os dados de BANNED_RANGES
. Torna mais fácil / mais fácil atualizar os endereços ou intervalos se você quiser adicionar ou remover endereços IP ou intervalos desse conjunto.