Iptables não encaminha o acesso ssh a instância sob uma sub-rede pública

1

Eu tenho o seguinte cenário:

1 - Uma instância de bastião (NAT) que eu uso como um gateway para encaminhar o acesso ssh a todas as minhas instâncias privadas (usando iptables) [IP Privado: 10.10.1.10 IP Público: 200.147.160.24]

2 - Uma instância pública sob o mesmo vpc (mas não e sob a mesma sub-rede) como minha instância de bastião (que usa um gateway de internet) [Private IP: 10.10.9.23 IP público: 186.192 .90.5]

Eu gostaria de acessar minha instância pública (2) através do iptables forward no bastião (1), mas estou conseguindo. Isso resulta em tempo limite. (todos os outros encaminhamentos para instâncias particulares funcionam).

Isso é intrigante porque: - Se eu ssh a instância pública diretamente usando seu IP público, ela funciona bem.

  • Se eu ssh no bastião e, em seguida, ssh na instância pública usando seu IP privado, ele também funciona bem.

Esta é a regra do iptables que estou usando no meu bastião:

iptables -t nat -A PREROUTING -d 0.0.0.0/0 -p tcp --dport 1500 -j DNAT --to-destination 10.10.9.23:22

Isso funciona: ssh [email protected]

Isso funciona (dentro do bastião (1)): ssh [email protected]

Isso não funciona (tempo limite): ssh -p 1500 [email protected]

  • todas as portas usadas estão abertas no grupo de segurança.
  • os ips públicos não são reais, apenas por exemplo

Quaisquer pensamentos são apreciados.

    
por Josué Lima 05.05.2015 / 18:32

2 respostas

1

Você tem uma situação de roteamento assimétrica envolvendo NAT, aqui, e isso não vai funcionar.

Naturalmente, se sua instância de destino tiver um IP público de qualquer maneira, parece que não há muito efeito de bastião acontecendo no host do bastião ... mas supondo que você tenha um motivo lógico, aqui está minha opinião sobre o problema :

Vamos chamar a máquina cliente C , o bastion B e a instância de destino T .

O tráfego chega: IP de origem = C, IP de destino = B.

B traduz: fonte IP = C, dest IP = T. Enviar para T.

T recebe: IP de origem = C, dest IP = T.

T responde: fonte IP = T, dest IP = C.

Para onde vai o tráfego de resposta? Não para o bastião - ele vai para o Gateway da Internet ... um pacote de resposta para um fluxo TCP do qual o gateway nunca ouviu falar. O gateway, por todos os direitos, deve descartá-lo ou enviar um TCP RST para a instância de envio T para derrubar essa conexão inválida.

O cliente C não deve ver essa resposta, mas mesmo assim, o cliente agora vê ...

IP de origem = T, dest IP = C.

Isso não é esperado pelo cliente nem por nenhum firewall intermediário com estado, portanto, o tráfego é descartado ou rejeitado.

Com suas máquinas de endereçamento privado, sua rota VPC padrão (suponho) aponta para o host de bastiões, portanto não há nenhuma situação assimétrica aqui. O bastião pode traduzir os endereços na direção oposta no caminho de volta para C e tudo funciona.

Agora, teoricamente, você deve ser capaz de fazer essa configuração funcionar adicionando uma segunda regra ao bastião, para que essas conexões ssh adotem o endereço IP do bastião como seu endereço source .

Deixando a regra DNAT no lugar, você precisaria de algo assim ...

iptables -t nat -A POSTROUTING -d 10.10.9.23/32 -p tcp --dport 22 -j SNAT 

Claro, eu acabei inventando isso, já que eu nunca tive a oportunidade de fazer isso ... mas a lógica, pelo menos, é boa.

Agora, supondo que isso (ou algo realmente similar) funcione, você resolveu seu problema de alcançabilidade ... e criou um novo problema: o endereço IP de origem (nos logs do servidor interno) sempre será o bastião hospedeiro. Nós não tínhamos muita escolha, mas para fazer isso, tornar a conexão traduzida roteável de volta para a Internet ... mas você pode estar melhor apenas acessando a máquina com seu endereço público.

Outra maneira de conseguir isso é com o HAProxy no bastião. O endereço de origem visto pelo servidor T ainda será o endereço interno do host do bastião ... mas agora você tem arquivos de log agradáveis no host bastion para o rastreamento do endereço IP. Na ocasião em que precisei expor um serviço TCP interno para a Internet, essa é a minha abordagem preferencial, acima de DNAT , por causa dos logs, controle de acesso e estatísticas de conexão que o proxy disponibiliza. (O HAProxy é um balanceador de carga compatível com http e um balanceador de carga TCP independente de carga. Eu não sou afiliado ao produto, apenas um fã).

    
por 06.05.2015 / 03:32
0

Não tenho certeza do que está acontecendo, mas suspeito que um problema de roteamento / incompatibilidade seja uma possibilidade. Você já tentou usar uma ferramenta como o tcpdump para checar se os pacotes fazem isso e o caminho que você pega?

    
por 06.05.2015 / 03:55