Eu quero fazer algumas regras simples do iptables para negar todas as conexões de entrada e permitir a saída. Como eu posso fazer isso?
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
Observe que isso reduzirá 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 para saber como adicionar uma exceção ao SSH.
Se você estiver trabalhando remotamente via SSH, poderá adicionar isso (
-I
insere-o antes de todas as outras regrasINPUT
):Se o seu serviço SSH estiver escutando em outra porta, você precisará usá-la em vez de
22
.Caso contrário, você poderá perder acidentalmente o acesso.
fonte
Esteja ciente de que as outras respostas não cobrem o IPv6! Se o seu sistema aceitar tráfego IPv6, nenhuma regra de iptables será aplicada ao tráfego IPv6.
em vez de usar o iptables / ip6tables diretamente, eu recomendo o uso do iptables-restore e salve. Essas ferramentas permitem especificar uma configuração do iptables com várias regras e carregá-la facilmente com um único comando.
crie um arquivo (denominado iptables.rules) com o seguinte conteúdo:
Note que adicionei um exemplo extra se você deseja permitir o ICMP e o tráfego para portas específicas.
agora você pode carregá-lo com estes comandos:
Agora, suas regras também abrangem o ipv6 e são fáceis de gerenciar.
Nota adicional para usuários do Debian: se você estiver satisfeito com suas regras, poderá
apt install iptables-persistent
fazê-lo após a reinicialização. As regras não são salvas automaticamente no desligamento, portanto, executenetfilter-persistent save
para atualizar as regras persistentes.fonte
As duas respostas acima, de alguma forma, estão corretas, mas não são precisas o suficiente para originar a resposta. (Desculpe, não tenho reputação suficiente para adicionar um comentário, por isso escreva a resposta completa).
No meu caso, conheci o servidor apache sobrecarregado, sobrecarregado com trabalhos cron, utilizando a CPU em excesso. Os 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 apache recebidas do host local (esta parte é opcional), mas manter todas as outras conexões possíveis. Incluindo aqueles que foram realmente estabelecidos.
Eu fiz isso com comando
sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT
Significa: para cada pacote tcp recebido na porta 80,
state
módulo de carregamento e, se este for o primeiro pacote (conexão de entrada), rejeite-o. Para localhost, você pode apenas usar-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 "maliciosos", tentando ignorar sua regra. E também substitua por-j DROP
para salvar seu tráfego de saída (ele não enviará sinal de rejeição)fonte