Negar todas as conexões de entrada com iptables?

17

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?

poliglota
fonte

Respostas:

24

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.

Yohann
fonte
2
Quando eu faço primeira linha de sua regra, eu tenho desligado da SSH
holms
7
A pergunta é "negar todas as conexões de entrada" e não "negar todas as conexões de entrada, exceto SSH" :)
Yohann
Eu li aviso de @holms cerca primeira regra tarde demais ...
Denis Kolodin
Observe que isso não tem efeito no tráfego ipv6. Leia minha resposta abaixo se você tiver o ipv6 ativado.
22418 bhelm
13

Se você estiver trabalhando remotamente via SSH, poderá adicionar isso ( -Iinsere-o antes de todas as outras regras INPUT):

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

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.

Miphix
fonte
2

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:

*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 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:

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ê estiver satisfeito com suas regras, poderá apt install iptables-persistentfazê-lo após a reinicialização. As regras não são salvas automaticamente no desligamento, portanto, execute netfilter-persistent savepara atualizar as regras persistentes.

bhelm
fonte
1

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, statemó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 DROPpara salvar seu tráfego de saída (ele não enviará sinal de rejeição)

Offenso
fonte