Bloquear a China com iptables

10

Acabei de fazer login em um servidor GitLab e notei que havia 18.974 logins com falha desde a última vez em que verifiquei o servidor - quase 5 dias. Eu verifiquei os IPs e parece que quase todos eles eram da China e tentei obter acesso com SSH e Brute Force. Comecei a bloquear alguns IPs, mas então percebi que é uma enorme perda de tempo e uma idéia melhor seria bloquear todo o país.

Existe alguma maneira de bloquear toda a China ou qualquer outro país com iptables?

Encontrei alguns artigos na internet, mas quase todos são scripts de bash. Eu sou um novato no Linux, então eu realmente não entendo todos esses scripts. Acho o iptables realmente interessante e quero aprender mais sobre isso.

Alguma ideia ? Obrigado!

Caranfil Alegzandru
fonte
4
Eu resolvi o mesmo problema de uma maneira diferente. Fortaleci o SSH no servidor GitLab do meu cliente desativando a autenticação baseada em senha e desafio e permiti apenas o login com chaves SSL. Talvez isso funcione na sua situação? O bloqueio de intervalos de IP pode reduzir o "ruído", mas não oferece proteção real contra a força bruta.
precisa saber é o seguinte
até agora não funcionou. o servidor gitlab ainda está ativo e eu tive 0 invasão. Os acessos ssh são feitos apenas com ssh-keys e eu desabilitei o login root. É só que eu quero aprender iptables tão ruim ..
Caranfil Alegzandru
1
Você também pode mudar seu ssh para uma porta não padrão no seu roteador. Isso reduziu minhas tentativas de ataque de bot ssh de centenas por dia para zero.
Organic Marble

Respostas:

7

O uso do iptables para identificar automaticamente e, posteriormente, bloquear, bandidos do ssh pode ser feito usando o recentmódulo. O seguinte segmento deve vir após a sua ESTABLISHED,RELATEDlinha genérica :

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Agora, o problema recente (no último ano ou dois) com a China é que eles se tornaram muito inteligentes e, muitas vezes, quando são bloqueados de um endereço IP, simplesmente mudam para outro na mesma sub-rede e continuam. Isso corre o risco de ficar sem entradas recentes da tabela padrão (acho que o padrão é 200). Monitoro isso e, em seguida, procuro o segmento IP real e bloqueio permanentemente o segmento inteiro. No meu caso, não me importo com danos colaterais, ou seja, bloquear alguém inocente:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

Onde acima:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

Você pode obter a lista completa de endereços IP para a China ou qualquer país, no formato iptables ou outro aqui . No entanto, a lista é surpreendentemente longa e bastante dinâmica. Eu mesmo decidi não bloquear a lista inteira.

Doug Smythies
fonte
Este ^! Pode ser a melhor resposta que já recebi. Pode ser uma pergunta idiota, mas acho que todas essas regras entram em um script bash, certo? Ainda tenho alguns problemas para entender o iptables, mas acho isso fascinante.
Caranfil Alegzandru
Sim, eu uso um script bash. Alguns, e eu também usei também, usam um método de restauração direta do iptables, que é mais rápido para carregar. Mudei porque incluí alguns comandos não-iptables no mesmo script.
Doug Smythies
12

Bloco China usando ipset

Você não pode adicionar manualmente alguns milhares de endereços IP às suas tabelas de ips, e até fazê-lo automaticamente é uma má idéia, pois pode causar muita carga de CPU (ou pelo menos eu li). Em vez disso, podemos usar o ipset, projetado para esse tipo de coisa. O ipset lida com grandes listas de endereços IP; você apenas cria uma lista e então diz ao iptables para usá-la em uma regra.

Nota; Presumo que a totalidade do seguinte seja feita como raiz. Ajuste de acordo se o seu sistema for baseado no sudo.

apt-get install ipset

Em seguida, escrevi um pequeno script do Bash para fazer todo o trabalho, que você deve entender pelos comentários. Crie um arquivo:

nano /etc/block-china.sh

Aqui está o que você deseja colar:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

Salve o arquivo. Torne executável:

chmod +x /etc/block-china.sh

Isso ainda não fez nada, mas ocorrerá em um minuto quando executarmos o script. Primeiro, precisamos adicionar uma regra no iptables que se refira a essa nova lista de ipsets que o script acima define:

nano /etc/iptables.firewall.rules

Adicione a seguinte linha:

-A INPUT -p tcp -m set --match-set china src -j DROP

Salve o arquivo. Para ficar claro, minhas iptables.firewall.rules agora estão assim:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

No momento, nada mudou com o servidor porque nenhuma nova regra foi aplicada; para fazer isso, execute o script block-china.sh:

/etc/block-china.sh

Isso deve mostrar alguma saída, pois extrai uma nova lista de IPs baseados em chinês e, depois de alguns segundos, ele será concluído e o levará de volta ao prompt de comando.

Para testar se funcionou, execute:

iptables -L

Agora você deve ver uma nova regra bloqueando a China - a saída deve ficar assim:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Quase pronto! Isso funciona e continuará a funcionar nas reinicializações. Mas, os endereços IP mudam e essa lista ficará obsoleta ao longo do tempo. Se você deseja obter e aplicar uma lista atualizada de IPs, basta executar o script block-china.sh novamente.

Também podemos configurar a máquina para fazer isso automaticamente através de um trabalho cron:

crontab -e

Adicione uma linha como esta:

* 5 * * * /etc/block-china.sh

Isso executará o /etc/block-china.sh às 5h todos os dias. O usuário que está executando o script precisará ser root ou ter privilégios de root.

fonte

Surjit Sidhu
fonte
Por que limitá-lo apenas ao protocolo TCP? Parece funcionar sem especificar o protocolo. Sugira a utilização das listas agregadas mais recentes, pois são muito mais curtas:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies
Não há nada aqui que restaure o ipset após a reinicialização.
Doug Smythies
4

Você pode instalar algo como fail2ban para bloquear os ips que tentam fazer login no servidor e falham.

Kyle H
fonte
Eu também poderia usar o firewall csf e bloquear todos os países que eu quero dos arquivos de configuração. O fato é que eu realmente quero usar o iptables para que eu possa aprender mais sobre isso.
Caranfil Alegzandru
Você precisaria ver quais países têm quais blocos de endereços IP atribuídos a eles para descobrir quem bloquear. Não tenho certeza se seria super preciso ou não. Você pode usar o iptables -L para mostrar as regras atuais do iptables, o iptables-save para mostrar quais comandos foram executados para criar essas regras, depois criar suas próprias regras e testar usando máquinas de teste para aprender sobre isso. Foi assim que eu aprendi.
Kyle H
0

Você pode usar o módulo geoip para iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Depois que nosso sistema for atualizado e as dependências instaladas, agora instalaremos o xtables-addons em nossa máquina. Para fazer isso, baixaremos o tarball mais recente do site oficial do projeto xtables-addons usando o wget. Depois de baixado, extrairemos o tarball, compilaremos e instalaremos em nossa máquina.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

Em seguida, executaremos um módulo chamado xt_geoip que vem com a extensão xtables-addons que baixa o banco de dados GeoIP do MaxMind e o converte em um formato binário reconhecido por xt_geoip. Uma vez baixado, vamos construí-lo e movê-los para o xt_geoipcaminho necessário, ou seja /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Aqui está a sintaxe básica para usar o iptables com o módulo geoip, a fim de bloquear o tráfego originado ou destinado a um país. Aqui, precisamos usar o código ISO3166 de duas letras no lugar do país, por exemplo, EUA para Estados Unidos, IE para Irlanda, IN para Índia, CN para China e assim por diante.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]
Markus Lenger
fonte
0

Você usa a Lista de firewalls do IP2Location para gerar tabelas de ip para a China.

O arquivo está no seguinte formato. Execute-o no shell e você deverá bloquear todos os endereços IP da China.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Michael C.
fonte