Prerouting SSH para uma porta interna diferente

1

Estou trabalhando em um projeto git local e estou executando um serviço SSH separado na porta 2222 com um usuário não root. Além disso, estou usando o ufw firewall e abri a porta 2222 - abri-a apenas para testar se a conexão a ela funciona como esperado e está tudo bem.

Como a porta padrão para SSH é 22 e eu não gostaria que os usuários escrevessem portas adicionais no endereço para acesso aos repositórios. Eu gostaria de pré-programar de 22 para 2222. Também quero que a porta 2222 não seja acessível a partir de fora quando o pré-processamento é eficaz.

Basicamente eu já fiz a primeira parte - eu fiz o tráfego de 22 para 2222 e ele funciona sem problema se a porta 2222 também estiver aberta, mas ao tentar fechar a porta 2222 também a conexão para 22 pára de funcionar (a regra para porta aberta ainda está lá). Isso é algo lógico, já que o iptables parece apenas converter a porta 22 para 2222 e encaminhá-la para o ufw, que então reconhece e nega a conexão porque a porta 2222 não está aberta.

Atualmente isso é o que eu tenho no before.rules do ufw e funciona se a porta 2222 também estiver aberta:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

Existe uma maneira de fazer este pré-roteamento sem a necessidade de ter a porta 2222 aberta?

    
por user1257255 20.08.2016 / 08:56

1 resposta

1

Em princípio, não. Usar ufw aqui não é importante, já que age apenas como um frontend, criando regras de iptables. Como você percebeu, as regras NAT são tratadas antes de qualquer filtragem, portanto, o filtro vê o pacote resultante após qualquer regra NAT. (A Wikipedia tem um gráfico de aparência assustadora do fluxo de pacotes dentro do netfilter, que os representa como independente.)

Não tenho certeza se é um grande problema que o servidor também possa ser acessado na outra porta.

No entanto, se você realmente deseja descartar pacotes indo diretamente para a porta 2222, pode fazê-lo com algum truque, usando marcas de conexão, ou seja, o CONNMARK target e connmark module:

Na tabela nat , defina uma marca na conexão e redirecione-a para a porta de destino.

iptables -t nat -A PREROUTING -p tcp --dport 22 -j CONNMARK --set-mark 1234
iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

Na tabela filter (padrão), rejeite a conexão se ela não tiver a marca.

iptables -A INPUT -p tcp --dport 2222 -m connmark ! --mark 1234 -j REJECT

Não importa qual seja o número da marca, desde que não colida com suas outras regras.

(Eu não tenho certeza se seria possível criar regras DROP na tabela NAT também. O iptables v1.4.21 não parece permitir isso, mas a reclamação vem do próprio iptables, não do kernel, como acontece com REJECT .)

    
por 21.08.2016 / 09:37