Cómo SSH a instancia ec2 en subred privada VPC a través del servidor NAT

16

He creado una VPC en AWS con una subred pública y una subred privada. La subred privada no tiene acceso directo a la red externa. Por lo tanto, hay un servidor NAT en la subred pública que reenvía todo el tráfico saliente desde la subred privada a la red externa.

Actualmente, puedo SSH de subred pública a subred privada, también SSH de NAT a subred privada. Sin embargo, lo que quiero es SSH desde cualquier máquina (computadora portátil doméstica, máquina de oficina y móvil) a instancias en subred privada.

He investigado que puedo configurar el cuadro NAT para reenviar SSH a una instancia en una subred privada. Pero no tuve suerte para esto.

¿Alguien puede enumerar lo que necesito configurar para que esto sea posible?

Los nombres son:

computadora portátil (cualquier dispositivo fuera de la VPC)

nat (el servidor NAT en la subred pública)

destino (el servidor en la subred privada a la que me quiero conectar)

No estoy seguro de que las siguientes sean limitaciones o no:

El "destino" no tiene una IP pública, solo una IP de subred, por ejemplo 10.0.0.1 El "destino" no puede conectarse a "nat" a través del público de nat. Hay varios servidores de "destino", ¿necesito configurar uno para cada uno?

Gracias

jasonfungsing
fuente
Este enlace describe los pasos necesarios para conectarse a instancias EC2 en la subred privada a través del reenvío de agentes SSH.
Shailender Rawat

Respuestas:

25

Puede configurar un host de bastión para conectarse a cualquier instancia dentro de su VPC:

http://blogs.aws.amazon.com/security/post/Tx3N8GFK85UN1G6/Securely-connect-to-Linux-instances-running-in-a-private-Amazon-VPC

Puede optar por iniciar una nueva instancia que funcionará como host de bastión, o usar su instancia NAT existente como bastión.

Si crea una nueva instancia, como resumen, usted:

1) cree un grupo de seguridad para su servidor bastión que permita el acceso SSH desde su computadora portátil (tenga en cuenta este grupo de seguridad para el paso 4)

2) inicie una instancia separada (bastión) en una subred pública en su VPC

3) proporcione al host del bastión una IP pública, ya sea en el lanzamiento o mediante la asignación de una IP elástica

4) actualice los grupos de seguridad de cada una de sus instancias que no tienen una IP pública para permitir el acceso SSH desde el host del bastión. Esto se puede hacer utilizando la ID del grupo de seguridad del host del bastión (sg - #####).

5) utilice el reenvío de agente SSH (ssh -Usuario @ publicIPofBastion) para conectarse primero al bastión y luego, una vez en el bastión, SSH a cualquier instancia interna (usuario ssh @ IP privada de instancia interna). El reenvío de agentes se encarga de reenviar su clave privada para que no tenga que almacenarse en la instancia de bastión (¡ nunca almacene claves privadas en ninguna instancia! )

La publicación de blog de AWS anterior debería ser capaz de proporcionar algo esencial sobre el proceso. También he incluido lo siguiente en caso de que desee detalles adicionales sobre los hosts de bastión:

Concepto de hosts de bastión: http://en.m.wikipedia.org/wiki/Bastion_host

Si necesita aclaraciones, no dude en comentar.

jca-
fuente
3
Asegúrese de permitir SSH / 22 tanto en la entrada como en la salida en el bastión.
user464180
¡Este es un punto tan crítico que debe ser parte de la respuesta!
Tariq
Además de la respuesta aceptada que ayuda mucho, pero no del todo, tuve que asegurarme de que los grupos de seguridad permitan el tráfico entrante y saliente. A primera vista, parecía que ya lo hacían, pero desde que usé la plantilla CloudFormation, no me había dado cuenta de que la fuente del tráfico entrante a la subred privada era mi ELB. Entonces, permitió todo el tráfico, pero solo provenía de ELB. Cambiar eso a mi subred pública solucionó el problema.
Milan Markovic
1

La única forma en que podría hacerlo funcionar.

1) Asegúrese de que el grupo de seguridad para esta instancia privada tenga en la regla de entrada el grupo de seguridad de la subred pública

Puertos Protocolo Fuente
Todos Todos sg-0b6616e070b9ea2d (grupo de seguridad pública)

2) Usando comandos proxy, configure su archivo de configuración ssh, para tener algo como esto

vim ~/.ssh/config

Host publichost
   HostName 24.123.34.45
   User ubuntu
   IdentityFile ~/mypem.pem
   ProxyCommand none
Host privatehost
   HostName 10.0.2.133
   User ubuntu
   IdentityFile ~/mypem.pem
   ProxyCommand ssh publichost -W %h:%p

Ejecutar ssh privatehost debería funcionar

Leonardo Ampuero
fuente
0

Solo para aclarar: una vez que haya ingresado en su host de bastión, debe ingresar en el host NAT como usuario ec2-user. Esto me engañó un poco, ya que normalmente el usuario de ubuntu es ubuntu en AWS. Así que lo hice:

laptop> ssh -A ubuntu@ssh_bastion
ssh_bastion> ssh ec2-user@nat_private_dns_or_private_ip

Además, recuerde que su ssh_bastion debe tener una regla de salida que permita el tráfico a otros hosts y sg.

Joel
fuente
¿Es ese nombre 'ec2_user' como resultado de activar específicamente una AMI de Amazon, ya configurada para el servicio NAT? Entonces, ¿cómo obtuvo 'ec2-user' una cuenta en la máquina privada?
Dennis