Será que usar ACCEPT e DROP para um par de porta / ip específico permitirá o ip mas nada mais nessa porta?

3

Estou trabalhando em um servidor e devo configurá-lo, de modo que as solicitações na porta 8080 sejam permitidas somente a partir de um IP específico. (Em outras portas http (s), nada está escutando de qualquer maneira.)

Tudo o resto deve permanecer irrestrito.

Depois de pesquisar sobre /etc/host e iptables eu escrevi este script para ativar (e desativar) essa regra:

#!/bin/bash

if ["$1" != 'restrict'] && ["$1" != 'restore']
  then
    echo "Usage:"
    echo "'${0##*/} restrict' to activate rules."
    echo "'${0##*/} restore' to deactivate rules."
    echo "'${0##*/}' to show this help."
    exit 0
fi


# Set default policies for INPUT, FORWARD and OUTPUT chains
# Allowing everything else.
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Flush all current rules from iptables
iptables -F

if [$1 == "restrict"]
  then

    # Allow HTTP connections on tcp port 8080 from X.X.X.X
    # [I]nserting the rules as first in the chain.
    iptables -I INPUT -p tcp --dport 8080 -s X.X.X.X -j ACCEPT

    # Denying all other connections on tcp port 8080
    # [A]ppending the rule as last in the chain.
    iptables -A INPUT -p tcp --dport 8080 -j DROP
fi

# Save settings
/sbin/service iptables save

# List rules
iptables -L -v

Como eu só tenho acesso à máquina via SSH, não quero estragar tudo e me trancar. Assim, gostaria de perguntar se esse script

  • funciona?
  • fará o que é desejado?
  • não fará mais nada?
  • permanece não volátil?
por Robin Koch 08.08.2016 / 13:54

3 respostas

6

Embora isso funcione, não é uma prática recomendada. Em vez de permitir tudo e apenas eliminar coisas específicas, é melhor abandonar tudo e só permitir o que você realmente quer passar.

Um conjunto de regras de tabela IP 'normal' geralmente começa assim:

# Flush rules
iptables -F

# Policy drop
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Permit loopback device
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Permit new outgoing connections, and packets that belong to
# an existing connection. You might actually not want to allow
# all new connections from the inside if you want to restrict 
# this, you will have to allow DNS, updates, etc.. manually
iptables -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

# Same for input
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

# Custom rules
# ...
iptables -A INPUT -p tcp --dport 8080 -s 5.35.252.105 -j ACCEPT

Além disso, ao configurar um novo firewall, não execute o script automaticamente nem torne as alterações permanentes. Dessa forma, se você errar, uma reinicialização do servidor retornará a conectividade.

    
por 08.08.2016 / 14:18
5

Suas regras estão corretas (caso você corrija o erro de sintaxe no shell script, mencionado no comentário anterior) para IPv4 . Para o IPv6, sua máquina provavelmente está completamente aberta .

Dicas para o futuro:

  • Impedindo o bloqueio: se você escrever suas regras diretamente no iptables-save style, poderá adorar o comando iptables-apply , que restaura as regras anteriores para o caso de as novas bloquearem você.

  • Tornando as regras persistentes: No Ubuntu, deve haver o pacote iptables-persistent para garantir que suas regras sobrevivam a uma reinicialização. Basta configurar suas regras e ir em apt-get install iptables-persistent e seguir o diálogo interativo.

  • Melhorando o estilo e a segurança: o mzhaase ofereceu um tutorial muito bom sobre como escrever regras de lista de permissões.

por 08.08.2016 / 15:09
3

Aqui está uma maneira fácil de evitar o bloqueio. Ele funcionará, em princípio, em qualquer sistema * nix, não apenas no Ubuntu.

Vamos presumir que seu script é chamado /usr/local/bin/start-iptables.sh e você desabilitará o iptables inteiramente com o comando /usr/local/bin/stop-iptables.sh

/usr/local/bin/start-iptables.sh ; sleep 30 ; /usr/local/bin/stop-iptables.sh

Se você executar os comandos desta forma, em uma linha, o shell os executará sequencialmente. Se você controlar-c, toda a seqüência de comandos será abortada - ela não apenas cancelará o comando em execução e passará para a próxima.

Assim, o shell executará seu script de início e depois dormirá por 30 segundos. Durante esses 30 segundos, verifique se você ainda pode acessar o servidor. Faça uma nova conexão, existem maneiras de você conseguir novas conexões, mas deixar a existente ativa. Uma vez que você tenha certeza, o script control-c e o script sleep e o script stop-iptables serão abortados.

Se você fizer bloquear-se, após 30 segundos, o script de parada será executado e você voltará.

    
por 08.08.2016 / 18:05

Tags