Existe alguma outra maneira de obter o IPTables para filtrar endereços IP baseados em geolocalização no Ubuntu 12.0.4.5 (LTS)?

0

Assim, alguns dos servidores que eu gerencio estão sendo atingidos pelo tráfego da China, quando os próprios sites não teriam nenhum apelo para ninguém na China. Para piorar as coisas, muitos hacks indesejados de força bruta e tentativas de DDoS estão vindo da China também. Então, embora eu tenha instalado o Fail2Ban para bloquear parte desse tráfego, eu realmente gostaria apenas de desligar todo e qualquer tráfego da China - por enquanto - para manter esses servidores funcionando de forma estável e feliz.

Eu li sobre como ativar o suporte ao GeoIP para o IPTables e tentei seguir as soluções como a apresentada aqui , mas não parece funcionar em meus servidores Ubuntu 12.04.5 (LTS), não importa qual conselho eu pareça seguir.

Uma escolha que eu tenho é a de morder a bala e apenas atualizar esses servidores para o Ubuntu 14.04, mas isso abre uma lata inteira de worms. Passado qualquer problema que estou tendo com a obtenção de filtragem GeoIP em funcionamento, esses servidores são sólidos e executam muito bem. Um upgrade para o 14.04 apenas jogaria o espectro de instabilidade potencial neles misturado, e eu não tenho tempo para isso; A decisão foi tomada para ficar em 12.04, já que é estável e bem suportado até 2017, então eu vou atravessar a ponte quando chegar a ela.

Existe alguma maneira de eu conseguir que o IPTables no Ubuntu 12.04 seja filtrado com base na localização geográfica sem ter que passar por muitos arcos de instalação do pacote do sistema?

    
por JakeGould 07.11.2015 / 18:30

1 resposta

1

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.

    
por 07.11.2015 / 19:03