Negar todas as conexões de entrada com iptables?

12

Eu quero fazer algumas regras simples de iptables para negar todas as conexões de entrada e permitir a saída. Como posso fazer isso?

    
por polyglot 22.05.2012 / 16:27

4 respostas

17

Tente isso com acesso root:

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Note que isso vai cortar brutalmente todas as conexões em execução - isso inclui coisas como a conexão SSH que você pode usar para administrar o servidor. Use isso somente se você tiver acesso a um console local.

Veja a resposta do Miphix sobre como adicionar uma exceção para o SSH.

    
por 22.05.2012 / 16:51
10

Se você estiver trabalhando remotamente via SSH, convém adicioná-lo ( -I o insere antes de todas as outras regras em INPUT ):

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

Se o seu serviço SSH estiver escutando em outra porta, você precisará usar essa porta em vez de 22 .

Caso contrário, você pode perder o acesso acidentalmente.

    
por 06.10.2014 / 22:38
1

Ambas as respostas acima estão corretas, mas não são precisas o suficiente para dar origem à resposta. (Desculpe, eu não tenho reputação suficiente para adicionar comentários, então escrever resposta completa).

No meu caso, eu conheci um servidor apache sobrecarregado, sobrecarregado com tarefas agendadas, utilizando demais o cpu. Limites de threads foram armazenados no banco de dados SQL, mas eu conheci o limite de suas conexões. Eu queria limitar as conexões de entrada do apache do host local (essa parte é opcional), mas mantenha todas as outras conexões possíveis. Incluindo aqueles que foram realmente estabelecidos.

Eu fiz isso com o comando

sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

Isso significa que: para cada pacote tcp de entrada na porta 80, carregue state module e, se esse for o primeiro pacote (conexão de entrada), rejeite-o. Para localhost, você pode usar apenas -s 127.0.0.0/8

E para uso no mundo real, em alguns casos, você pode adicionar 'INVALID' aos estados, NEW,INVALID , porque é possível enviar pacotes "mal-intencionados", tentando ignorar sua regra. E também substitua com -j DROP para salvar seu tráfego de saída (ele não enviará sinal de rejeição)

    
por 03.04.2018 / 08:40
0

Esteja ciente de que as outras respostas não cobrem o IPv6! Se o seu sistema aceitar tráfego IPv6, nenhuma regra do iptables será aplicada ao tráfego ipv6.

ao invés de usar iptables / ip6tables diretamente, eu recomendo usar o iptables-restore e salvar. Estas ferramentas permitem especificar uma configuração iptables com múltiplas regras e facilmente carregá-la com um comando.

crie um arquivo (denominei iptables.rules) com o seguinte conteúdo:

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

Note que adicionei algum exemplo extra se você quiser permitir o ICMP e o tráfego para portas específicas.

agora você pode carregá-lo com estes comandos:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

Agora, suas regras também abrangem o ipv6 e são fáceis de gerenciar.

Nota adicional para usuários do Debian: se você está satisfeito com suas regras, você pode apt install iptables-persistent para que as regras sejam restauradas após a reinicialização. As regras não são salvas automaticamente no desligamento, portanto, execute netfilter-persistent save para atualizar as regras persistentes.

    
por 19.07.2018 / 09:40