AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1144095
Accepted
Zippy1970
Zippy1970
Asked: 2023-09-20 20:21:17 +0800 CST2023-09-20 20:21:17 +0800 CST 2023-09-20 20:21:17 +0800 CST

Bloqueio de tráfego de países específicos. Como matar a conexão existente?

  • 772

Usando Linux Debian Bookworm.

Problema

Quero bloquear todas as conexões de entrada do meu servidor provenientes de países específicos.

Editar

Como alguém apontou nos comentários, eu realmente não deveria fazer isso com o iptables, pois isso paralisará meu servidor quando a lista de endereços IP que ele bloqueia crescer para um tamanho incontrolável (como milhares de endereços IP). Em vez disso, devo usar ipset(para bloquear intervalos inteiros). O problema é que depende das listas que preciso baixar regularmente. Quero algo que configurei uma vez (de preferência).

Então, como posso interromper conexões de países específicos? O tráfego (e por vezes ataques de força bruta) proveniente da China e da Rússia está a ficar fora de controlo. Eles colocam meu servidor de joelhos regularmente. Eles não aderem ao arquivo robots.txt e rastreiam o site de forma muito agressiva (com centenas, às vezes milhares de conexões simultaneamente). Eu realmente preciso parar com isso. Minha estimativa é que mais de 90% de todo o tráfego que meu servidor gerencia é malicioso/malformado.

Editar 2

Encontrei alguns tutoriais online ( como este ) sobre como fazer isso, mas parece que esses tutoriais são bem antigos. Além disso, requer download e compilação/instalação de alguns módulos. Estou preocupado que isso possa falhar no futuro (ao atualizar/atualizar outros pacotes ou até mesmo a distribuição) ou possa se tornar um risco de segurança no futuro. Eu mantenho meu servidor atualizado e atualizado (executando apt-get update / apt-get upgrade / apt-get dist-upgrade regularmente).

mensagem original

Encontrei um script on-line que (em poucas palavras) obtém uma lista de endereços IP de conexões estabelecidas a cada segundo e depois usa o geoiplookup para obter o país do endereço IP. Se o país estiver na lista de países que você deseja bloquear, ele adiciona o endereço IP ao filtro do firewall usando iptables. Fiz algumas pequenas alterações no script (tornando-o mais legível e porque não estava interessado neste script me enviando um e-mail toda vez que bloqueava um endereço IP). Este script é executado a cada minuto através do crontab:

#!/bin/bash
# Script found on lautenbacher.io"

end=$((SECONDS+55))

while [ $SECONDS -lt $end ]; do
  echo $SECONDS
  netstat -ant | egrep ':.*ESTABLISHED' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c > testcc.txt
  sed 's/^[ t]*//' -i testcc.txt
  sed '/^$/d' -i testcc.txt

  while read c d; do

    if [[ $c > "0" ]]; then
      bGF1dGVuYmFjaGVyLmlv=$(geoiplookup $d | awk -v ip="$d" '{FS=" "} {if($4 == "RU," || $4 == "CN," || $4 == "BLR,") {print 1}}')

      if [[ $bGF1dGVuYmFjaGVyLmlv = "1" ]]; then
        echo "running geolookup"
        echo checking ip $d
        geoiplookup $d

        isCloudflare=0
        # The original script made an exception for CLOUDFLARE. I don't want that exception
        # bGF1dGVuYmFjaGVyLmlX=$(whois $d)
        # if [[ "$bGF1dGVuYmFjaGVyLmlX" == *"CLOUDFLARE "* ]]; then
        #  isCloudflare=1
        #  echo Cloudflare detected
        # fi

        if [[ "$isCloudflare" != 1 ]]; then
          echo try to add ip $d to blocklist
          sudo iptables -I INPUT -s $d -j DROP
          ### I would like to sever the connection here ###
        fi

      fi

    fi
  done < testcc.txt

  sleep 1
    :
done

Aliás, não tenho ideia de por que o autor do script usa nomes de variáveis ​​tão estranhos ("bGF1dGVuYmFjaGVyLmlv").

De qualquer forma, o problema é que sempre que encontra uma conexão com um endereço IP de um país banido, ele executa

sudo iptables -I INPUT -s $d -j DROP

no endereço IP. Tudo bem, mas a maioria dessas conexões é um tanto persistente, o que significa que um segundo depois o mesmo endereço IP é encontrado e adicionado novamente usando iptables. Não tenho certeza do que acontece (isso cria regras duplicadas?), mas gostaria de interromper imediatamente a conexão após o endereço IP ser adicionado ao iptables.

Resumindo: como posso eliminar todas as conexões com um endereço IP?

linux
  • 1 1 respostas
  • 74 Views

1 respostas

  • Voted
  1. Best Answer
    A.B
    2023-09-21T16:57:39+08:002023-09-21T16:57:39+08:00

    Há vários anos, o kernel do Linux tem uma API para eliminar à força os soquetes IP existentes, independentemente do seu estado. Isso pode ser feito com o sscomando e sua sintaxe de filtro:

    -K,--kill

    Tentativas de fechar soquetes à força. Esta opção exibe os soquetes que foram fechados com sucesso e ignora silenciosamente os soquetes que o kernel não suporta o fechamento. Suporta apenas soquetes IPv4 e IPv6.

    Você pode substituir:

    ### I would like to sever the connection here ###
    

    com:

    ss --kill -n dst = "$d"
    

    O filtro ( dst = ...) é necessário porque o comando eliminará qualquer soquete que seja exibido. Sem filtro isso seria mais do que pedido. O processo local pode receber um erro raro em seu soquete, como ECONNABORTED. O nó remoto provavelmente será notificado com um TCP RST, a menos que uma regra OUTPUT também seja (temporariamente) adicionada para evitá-lo.

    Veja também esta pergunta/resposta (onde respondi): Elimine TODAS as conexões TCP (ESTABELECIDAS, RELACIONADAS) no Ubuntu , onde o OP tenta se proteger contra ataques com um ipset (e também tem problemas com conexões obsoletas e firewall com estado).

    • 1

relate perguntas

  • Como descobrir detalhes sobre hardware na máquina Linux?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve