iptables: permite determinados ips e bloqueia todas as outras conexões

26

Como permito certos ips e bloqueio todas as outras conexões no iptables?

David
fonte
Como Gilles demonstra, o conceito é o seguinte: Adicione regras ACEITAR para cada coisa específica que você deseja permitir, seja por IP de origem ou outras qualificações, depois defina a política padrão como REJECT.
Caleb

Respostas:

27

Escrevi um post no blog sobre regras básicas do Iptables para o usuário de desktop há muito tempo e você provavelmente deveria lê-lo, e seu artigo vinculado sobre o design do firewall Stateful . Mas o pré-kernel 2.6.39 (que inclui ipsete você pode querer usá-lo para os IPs da lista de permissões, se você tiver mais de 10 na lista de permissões (onde 10 é arbitrário)).

Primeiro, identifique os estados que sabemos que queremos aceitar ou descartar e faça a interface.

iptables -P FORWARD DROP # we aren't a router
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.1.1 -j ACCEPT
iptables -P INPUT DROP # Drop everything we don't accept

Se você deseja apenas permitir um IP apenas, sem estado

iptables -A INPUT -s 192.168.1.1 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.1 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP

é provável que você tenha problemas para fazer isso, e sugiro usar o estado para facilitar sua vida. Por exemplo, não permitir -i loe -o locertamente causará problemas para certos aplicativos.

xenoterracida
fonte
4
Em vez de DROP, você deve rejeitar pacotes indesejados, pois facilita muito o diagnóstico de problemas e evita tempos limite. Consulte Rejeitar pacotes IP com um erro ICMP ou simplesmente descartá-los?
Gilles 'SO- stop be evil'
Eu tentei as duas configurações e o KeePass2 não inicia, alguma ideia? Além disso, se eu fizer iptables -Fisso para limpar todas as regras, não consigo nem executar ping no ubuntu.com
Pawel Cioch
@PawelCioch Por que o KeePass2 precisaria de conexão com a Internet?
Alex
@ Alex para armazenar arquivo de banco de dados no local remoto, isso eu quero único IP. Mas eu descobri tudo, a configuração é mais complicada que o exemplo aqui
Pawel Cioch
10

Aqui está um exemplo (não testado!) Que bloqueia apenas as conexões de entrada . São permitidas conexões pela interface de loopback, provenientes de 192.168.3.x, ICMP ou à porta SSH. Todas as outras conexões são rejeitadas.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.3.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j REJECT
Gilles 'SO- parar de ser mau'
fonte
@Gilles para usar corretamente os estados RELACIONADOS e ESTABELECIDOS, você precisa corresponder o pacote inicial como um estado NOVO. lono exemplo acima é excluído da correspondência de estado e sempre permitido.
precisa saber é o seguinte
@ penguin359: Você poderia explicar por que NEW é necessário? Como estou longe de ser um especialista em iptables, copiei parcialmente essas regras do meu roteador doméstico, que não corresponde a NEW. Até onde eu entendi, tudo o que resta após a primeira regra são pacotes NOVOS (ou NÃO TRILHADOS). (Se eu estiver muito errado e você não puder explicar em um comentário, publique suas versões com explicações como resposta e eu excluirei as minhas.)
Gilles 'SO- stop stop be evil'
@Gilles Eu sempre largo o estado INVÁLIDO antes de aceitar qualquer coisa ... que torne algo que não é INVÁLIDO, RELACIONADO, ESTABELECIDO, deve ser um estado NOVO. Mas não sei por que motivo tudo deve especificar NEW. Em teoria, se você não manipular INVALID e não especificar NEW, poderá aceitar INVALID. Porém, uma vez que INVALID é tratado, parece-me que a verificação de NOVO estado em todas as regras simplesmente requer mais processamento para o pacote.
Xenoterracide
O @Gilles também é uma política padrão de rejeição ruim, porque envia um pacote de rejeição para cada pacote recebido, isso cria um ataque do DOS.
Xenoterracide
@xenoterracide: Bom ponto. O REJECT deve ser usado? Eu perguntei: Rejeitar pacotes IP com um erro ICMP ou simplesmente descartá-los?
Gilles 'SO- stop be evil'
7

A regra abaixo permitirá apenas o seu IP e bloqueia todos os outros IPs na porta 22 ou ssh. Teste com um novo terminal antes de desconectar.

iptables -I INPUT -p tcp ! -s yourIPaddress --dport 22 -j DROP
Ishtiyaque Noori
fonte
3
obrigado pela resposta sucinta. Como isso mudaria se eu quisesse permitir alguns IPs e intervalos de IPs. Em vez de yourIPaddressadicionar alguns endereços IP e intervalos? E se eu estiver usando SSH em uma porta não padrão como 2888, o comando mudaria o 22do seu exemplo para 2288? Além disso, isso também bloqueia rsync, sftp, etc para este servidor de todos os IPs, exceto os permitidos?
PKHunter
1
Observe que -p tcpé importante aqui porque --dportnão funciona sem ele. Eu também sugeriria usar em -j REJECTvez de DROPporque REJECTtorna a porta idêntica à porta fechada e DROPtorna os pacotes destinados a essa porta ocultos em preto. Na prática, o atacante remoto pode detectar DROPportas configuradas de portas realmente fechadas.
Mikko Rantalainen