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


42

Este é o meu /etc/sysconfig/iptables:

Possui 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 por um endereço IP específico.

exemplo ip:

1.2.3.4

Por favor, desconsidere qualquer supervisão / preocupação em relação a se o meu ip mudar e eu não puder mais fazer o SSH no meu servidor.

Respostas:


47

se eu receber a pergunta da maneira correta, você deseja que seu servidor seja acessível apenas a partir de um 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 apenas para o YourIP, se precisar abrir o DNS para 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 adicioná-los e abrir esses IPs, você precisará 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. As regras iptables -A INPUTserão adicionadas ao final do INPUTque está atualmente.)

ou, como Joel disse, você pode adicionar uma regra:

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

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

iptables -P INPUT DROP

Em resumo, conforme apresentado nesta pergunta sobre o SO :

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

2
Também vale a pena notar que iptablessuporta inversão com o operador bang, caso você queira fazer uma segmentação DROP. Exemplo:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley 22/07

1
Além disso, incondicionais DROPnão são realmente necessários, você pode simplesmente definir a política padrão no firewall iptables -P INPUT DROPe deixar para lá. Você provavelmente também deseja fazê-los como um acréscimo, se assim for, caso contrário, todo o tráfego será capturado pela DROPe nunca alcançará sua ACCEPTregra.
Bratchley

1
Isso não funcionou para mim porque o padrão para -I (inserir) é inserir como regra 1, portanto o DROP é inserido como regra 1 e avaliado primeiro e, portanto, descarta todos os pacotes ssh, nunca avaliando a regra ACEITAR. Você precisa executar iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPe iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROP"3" após INPUT significa inserir como regra 3 de entrada (supondo que você esteja inserindo dois ACEITOS, caso contrário, se apenas um ACEITAR usar o "2" para INPUT), #
404 Kevin Kevin Triplett

O @Networker Using -Iirá inserir as novas regras do iptables na parte superior. Como tal, você pode acabar inserindo sua gota antes de permitir. Sugiro usar em -Avez disso
BlueCacti

1
Bem, eu me tranquei para fora, gj
ngwdaniel

6

Embora eu recomende o uso de chaves SSH, vou lhe dar uma explicação.

Você não precisa usar as tabelas IP para o que está tentando alcançar, existem várias maneiras. Esta é a maneira IPtables:

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

[YOUR_HOME_IP] = O seu IP residencial (bastante direto)

[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 o 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ê efetue login no SSH como rootusuário do seu IP sem solicitar uma senha.

Lembre-se de que um cronjob com

iptables -X
iptables -F

pode ser inteligente, para que você não fique bloqueado no servidor com SSH (o cronjob redefinirá as tabelas de IP para que você tenha acesso novamente). Se você ainda tiver acesso, poderá remover o cronjob e configurar suas tabelas de IP novamente.


O cronjob apenas removeria o firewall. Por que configurar iptablesem primeiro lugar? Alguma forma de acesso fora da banda é o método usual. knockdé outro.
22414 Matt

@mtm Sim, quando você estiver bloqueado, o cronjob redefinirá sua configuração de tabelas de IP para que você possa acessar o SSH novamente. As razões pelas quais as pessoas usam as tabelas IP são diferentes, na minha opinião, é um firewall eficaz, simples e flexível.
William Edwards

2
oic. você quer dizer executar o flush uma vez no tempo de configuração, não agendado regularmente. atfaz isso.
Matt

4
Colocar na lista branca apenas o seu IP e permitir um login root sem senha parece uma péssima idéia.
Alex W

1
@AlexW Eu sei que já faz um tempo, mas eu ainda queria comentar: Without-Passwordsignifica que a autenticação por senha não é permitida, então você terá que usar a autenticação por chave SSH. Na verdade, é um nome pouco claro para esse método de autenticação. Mas isso não significa que você não precisa de uma senha para fazer login como root. No entanto, um método mais seguro é o de definir PermitRootLogin noe utilizar uma conta sudo diferente para o login, como raiz é um alvo comum
BlueCacti

5

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

O iptables executará a primeira regra que corresponder, portanto a ordem das regras é muito importante. -Ié o comando "inserir" e deve ser usado com um parâmetro de índice para especificar onde uma determinada regra pertence à lista. -Aé o comando "acrescentar", que adicionará a regra ao final da lista.

Em algumas distrobuções (talvez todas), o uso -Isem um parâmetro de índice adicionará a regra ao índice um, tornando-a a primeira regra verificada. Nesse cenário, se o último comando que você executar for iptables -I INPUT -s tcp 0.0.0.0/0 -j DROP, o iptables eliminará todo o tráfego, independentemente de você ter ou não ACCEPTregras mais tarde na cadeia.

Aqui está um exemplo de como configurar uma regra que permite apenas SSH a partir 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á semelhante a:

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, use o -Iparâmetro 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 o uso -I INPUT 2da nova regra como regra número 2 e a regra DROP foram adicionadas ao número 3.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.