En AWS, ¿tengo que abrir puertos en el firewall de una instancia de EC2 y en un grupo de seguridad?

8

Si cambio mi puerto SSH de 22 a 23453, ya no puedo ingresar.

Con más detalle, estoy usando una instancia de Red Hat EC2 en Amazon Web Services. Este es el segundo cambio que tengo en una instalación nueva (el primer cambio fue agregar un usuario no root).

Puedo ssh bien usando Git Bash y un archivo local .ssh / config, edito la línea en / etc / ssh / sshd_config que actualmente dice

#Port 23453

decir

Port 23453

luego reinicie sshd con

sudo service sshd restart

Luego agrego una línea "Puerto 23453" a mi archivo .ssh / config

Host foo 
Hostname my-ec2-public-DNS
Port 23453
IdentityFile my ssl key

Si abro otro shell de Git Bash (sin cerrar mi conexión existente) e intento ingresar a mi instancia ssh (con ssh foo), veo el siguiente error:

ssh: connect to host my-ec2-public-DNS port 23453: Bad file number

El grupo de seguridad adjunto a esta instancia tiene dos entradas, ambas TCP

22 (SSH) 0.0.0.0/0

23453 0.0.0.0/0

Mi mejor conjetura es que el puerto todavía está bloqueado por mi firewall.

La salida de sudo iptables -Les la siguiente

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Lo cual me parece bastante abierto.

ACTUALIZAR

Después de agregar una regla de iptables

iptables -A INPUT -p tcp --dport 23453 -j ACCEPT

e intentándolo de nuevo, todavía no tuve suerte.

Salida de iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:23453

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Que parece suficientemente abierto. No estoy completamente seguro de cómo buscar los paquetes que entran o la actividad en el puerto. Pero la salida de netstat -ntlp(como root)

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State PID/Program name
tcp        0      0 0.0.0.0:56137               0.0.0.0:*                   LISTEN      948/rpc.statd
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      930/rpcbind
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1012/cupsd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1224/master
tcp        0      0 0.0.0.0:23453               0.0.0.0:*                   LISTEN      32638/sshd
tcp        0      0 :::36139                    :::*                        LISTEN      948/rpc.statd
tcp        0      0 :::111                      :::*                        LISTEN      930/rpcbind
tcp        0      0 ::1:631                     :::*                        LISTEN      1012/cupsd
tcp        0      0 :::23453                    :::*                        LISTEN      32638/sshd

Lo que me parece mostrar sshd en 23453.

He comprobado nuevamente que la instancia tiene el puerto abierto en el grupo de seguridad (Puerto: 23453, Protocolo: tcp, Fuente: 0.0.0.0/0)

¿Qué más puede estar causando la falla de conexión a través de SSH?

Salud

POST MORTEM

Ahora puedo conectarme. Era una regla que faltaba en iptables. La salida de iptables -Lahora se ve así:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:23453 state NEW
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Andrew Martin
fuente
Para cualquiera que no pueda ver la diferencia entre el tercero iptables -L(ssh funciona) y el segundo iptables -L(ssh está bloqueado). Observe el orden de las reglas en la cadena INPUT (las 6 líneas debajo del primer "objetivo"), se leen de arriba a abajo, por lo que en el segundo conjunto de reglas, "RECHAZAR todo" se golpea antes de "ACEPTAR tcp dpt: 23453 ". El tercer conjunto de reglas tiene la entrada ACEPTAR anterior y, por lo tanto, antes, la entrada RECHAZAR.
Andrew Martin

Respuestas:

12

Su firewall de instancia no tiene este puerto abierto. Pruebe el siguiente comando:

iptables -I INPUT 3 -s 0.0.0.0/0 -d 0.0.0.0/0 -p tcp --dport 23453 -m state --state New -j ACCEPT

Tenga en cuenta que las reglas de iptables deben guardarse para persistir después de un reinicio. En RHEL eso es:

/sbin/service iptables save
melsayed
fuente
Esto funcionó. Si alguien pudiera decirme una diferencia importante entre la regla de iptables de @ melsayed y la regla de iptables de Frank, estaría muy agradecido. Además, supongo que esto significa que la respuesta a mi última pregunta es "Sí, en AWS tienes que abrir puertos en firewalls de instancia ec2, así como sus grupos de seguridad". Gracias a todos.
Andrew Martin
Traté de comentar la respuesta de Frank, pero aún no tengo suficiente representante :)
melsayed
2
Básicamente, el comando iptables de Frank agrega (-A) una nueva regla que permitiría la conexión a ese puerto. El problema es que agrega la regla al final de la lista de reglas de iptables. La última regla en la lista de iptables rechaza todo lo que no está explícitamente permitido antes. Dado que las reglas de iptables se aplican en orden, la conexión coincide y se rechaza incluso antes de llegar a la nueva regla.
melsayed
2
Inserté una nueva regla en la lista, en la tercera posición (-I INPUT 3). Que coincide antes de la regla de rechazo al final, lo que permite la conexión. Como Frank mencionó, podría usar iptables -nvL para ver la cantidad de paquetes que coincide con cada regla, lo que ayuda a depurar dicha configuración.
melsayed
/sbin/service iptables saveno funciona para mí, incluso con sudo.
huertanix
2

Agregar una regla de iptables

iptables -I INPUT 1 -p tcp --dport 23435 -j ACCEPT

que acepta el tráfico de cualquier host, por el puerto 23435, e intenta ssh, si ve algún paquete o actividad, significa que los paquetes están llegando a su servidor.

Si no ve ningún paquete, eso significa que el grupo de seguridad de AWS no tiene una regla para permitir su puerto.

pero si ve tráfico en esta regla (by iptables -nvL), debe ejecutar "netstat -ntlp" y verificar si el demonio SSH se está ejecutando en el puerto 2435. y en adelante 0.0.0.0/0.

Esperemos que estos pasos resuelvan el problema. si todavía no, entonces dime.

Farhan
fuente
1

¿Estás seguro de que el grupo de seguridad está configurado correctamente? ¿Hiciste clic en "Aplicar cambios"? Muchas personas se olvidan de aplicar sus cambios :)

"Número de archivo incorrecto" generalmente significa tiempos de espera de conexión, y su configuración de iptables parece correcta.

Waleed Hamra
fuente
Caí en falta ante la trampa de "aplicar cambios" una vez antes. Nunca más. :)
Andrew Martin
-1

En caso de que alguien tropiece con este tema porque cambiaron el puerto predeterminado de ssh, aquí hay una solución que funcionó para mí:

  1. Para evitar un firewall corporativo, cambié el puerto a 80 en adelante /etc/ssh/sshd_conf.
  2. Desafortunadamente, Apache ya estaba instalado en esa instancia, por lo que ya no podía usar ssh.
  3. Separé el volumen de la instancia.
  4. adjunto a otra instancia
  5. lo montó, cambió el puerto en el archivo de configuración
  6. lo separó, lo volvió a conectar en la instancia anterior
  7. reiniciado: todo bien: D
Homezar
fuente