Como garantir que a porta SSH esteja aberta apenas a um endereço IP específico?

42

Este é o meu /etc/sysconfig/iptables :

Tem duas portas abertas 80 apache e 22 para ssh.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Para a porta 22 (SSH), quero garantir que ninguém possa se conectar a essa porta, exceto para um endereço IP específico.

exemplo ip:

1.2.3.4

Por favor desconsidere qualquer omissão / preocupações sobre o que acontece se o meu ip mudar e eu não puder mais SSH para o meu servidor.

    
por Community 22.07.2014 / 17:29

3 respostas

46

se eu obtiver a pergunta do jeito certo, você quiser que o seu servidor seja alcançável somente a partir do endereço IP específico na porta 22, você pode atualizar o Iptables para isso:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

Nesse caso, você está abrindo a porta ssh somente para o YourIP, se precisar abrir o DNS para a sua rede interna:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

Depois de tê-los adicionados e abertos para esses IPs, você precisa fechar a porta para o restante dos IPs

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(Certifique-se de definir as regras na posição correta no seu conjunto de regras. iptables -A INPUT adicionará as regras ao final do INPUT como atualmente é.)

ou como joel disse que você pode adicionar uma regra:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

ou você pode apenas definir a política padrão no firewall com

iptables -P INPUT DROP

Em resumo, conforme apresentado em esta pergunta sobre SO :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
    
por 22.07.2014 / 17:40
6

Embora eu recomende o uso de chaves SSH, darei uma explicação.

Você não precisa usar IPtables para o que você está tentando alcançar, existem várias maneiras. Este é o caminho do IPtables:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = Seu IP residencial (bastante simples)

[SSH_PORT] = A porta na qual você executa o SSH (por padrão, 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

Isso garante que ninguém, exceto seu IP, possa efetuar login no SSH.

Existe outra maneira, que é adicionar algo ao sshd_config .

Adicione o seguinte:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Isso permite que você faça login no SSH como o usuário root do seu IP sem solicitar uma senha.

Por favor, tenha em mente que um cronjob com

iptables -X
iptables -F

pode ser inteligente para que você não fique bloqueado em seu servidor com SSH (o cronjob irá redefinir o IPtables para que você possa acessar novamente). Se você ainda tiver acesso, poderá remover o cronjob e configurar seus IPtables novamente.

    
por 22.07.2014 / 17:39
5

Outras respostas estão usando iptables -I em seus exemplos, o que geralmente não é o que você deve usar.

iptables executará a primeira regra que combina, então a ordem das regras é muito importante. -I é o comando "inserir" e deve ser usado com um parâmetro de índice para especificar em que local da lista uma determinada regra pertence. -A é o comando "append", que adicionará a regra ao final da lista.

Em algumas distrobutions (talvez todas) usando -I sem um parâmetro de índice irá adicionar a regra para indexar uma, fazendo com que seja a primeira regra marcada. Neste cenário, se o último comando executado for iptables -I INPUT -s tcp 0.0.0.0/0 -j DROP , o iptables descartará todo o tráfego, independentemente de você ter ou não regras ACCEPT posteriormente na cadeia.

Aqui está uma amostra da configuração de uma regra que permite apenas o SSH de um único IP:

Começando sem regras:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Adicione uma nova regra "allow SSH from 1.2.3.4":

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

Bloqueie o SSH de todos os outros IPs:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

Agora sua cadeia de entrada será parecida com:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Mais tarde, se você precisar colocar um segundo IP na lista de permissões, poderá usar o parâmetro -I para colocá-lo antes da regra da lista negra.

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Observe que usar -I INPUT 2 adicionou a nova regra como regra número 2 e aplicou a regra DROP no número 3.

    
por 11.06.2015 / 19:43