¿Ha bloqueado Apple este archivo [ /System/Library/LaunchDaemons/ssh.plist
¿ definitivamente?
Sí, lo han hecho, tienes que desactivar el SIP ( Protección de la integridad del sistema ), pero tenga en cuenta que la edición ssh.plist
no es la única opción para cambiar el puerto del servidor SSH, hay otras formas de conseguir el mismo resultado.
Hay (al menos) 4 formas de cambiar el puerto sshd
escucha en :
-
Modificación de /System/Library/LaunchDaemons/ssh.plist
:
-
Pros La forma más limpia de configurar sshd
, sshd
iniciado con Preferencias del Sistema>Compartir>Inicio de sesión remoto escucha en el nuevo puerto.
-
Cons : configuración enrevesada (requiere dos reinicios y deshabilitar/rehabilitar SIP ).
-
Caso de uso Cambio definitivo de sshd
puerto.
-
Creación de un nuevo plist /Library/LaunchDaemons/ssh2.plist
:
-
Pros : operación doble de sshd
escuchando en el puerto estándar y en el nuevo.
-
Cons : Método de inicio sólo por CLI sshd
en el nuevo puerto.
-
Caso de uso : sshd
debe escuchar tanto en el puerto estándar como en el puerto adicional.
-
Modificación de las entradas "ssh" en /etc/services
:
-
Pros Método más sencillo, sin necesidad de lidiar con el SIP, sshd
iniciado con Preferencias del Sistema>Compartir>Inicio de sesión remoto escucha en el nuevo puerto.
-
Cons efecto secundario: ssh
por defecto al nuevo puerto cuando se conecta al servidor remoto (hay una solución para ello).
-
Caso de uso : cambio de puerto temporal o pruebas sshd
que se ejecuta en un puerto diferente.
-
Redirigiendo el puerto 22 a un nuevo puerto con filtro de paquetes:
-
Pros no hay necesidad de lidiar con el SIP, sshd
se inicia con Preferencias del Sistema>Compartir>Inicio de sesión remoto parece para escuchar en el nuevo puerto.
-
Cons : algo poco transparente ( sshd
configuración está intacta, pero sshd
escucha en otro/puerto adicional) y confuso (el estado del cortafuegos en las Preferencias del Sistema no es fiable), pequeño efecto secundario (el cliente remoto cree que se está conectando al puerto 22 (a través de las variables env SSH_CLIENT
y SSH_CONNECTION
)).
-
Caso de uso : cambio definitivo o temporal de la sshd
puerto, sshd
debe escuchar tanto en el puerto estándar como en el puerto adicional.
Veámoslos más de cerca. (Cuando elijas el nuevo puerto, asegúrate de que no es utilizado por otro servicio ejecutando sudo lsof -i -n -P | grep <your port>
.)
1. Modificación de /System/Library/LaunchDaemons/ssh.plist
Este es el método que has probado, déjame describirlo aquí para completarlo:
-
Reinicia tu Mac y mantén pulsado R inmediatamente después de que su Mac comience a reiniciarse para entrar Recuperación de MacOS .
-
Seleccione Utilidades>Terminal en la barra de menú.
-
Tipo csrutil disable
para desactivar el SIP.
-
Seleccione el menú Apple>Reiniciar.
-
Iniciar sesión, editar /System/Library/LaunchDaemons/ssh.plist
y modifique la sección de los oyentes. Por ejemplo, para cambiar el puerto a 2222
:
-
Reinicie su Mac y mantenga pulsado R inmediatamente después de que su Mac comience a reiniciarse para entrar en Recuperación de macOS.
-
Seleccione Utilidades>Terminal en la barra de menú.
-
Tipo csrutil enable
para habilitar el SIP y reiniciar.
El servidor SSH escuchará ahora en el nuevo puerto y podrá iniciar sshd
como es habitual a través de Preferencias del Sistema>Compartir>Inicio de sesión remoto.
2. Crear un nuevo plist /System/Library/LaunchDaemons/ssh2.plist
Este método está muy bien descrito en este respuesta que básicamente dice:
-
Copiar /System/Library/LaunchDaemons/ssh.plist
a /Library/LaunchDaemons/ssh2.plist
para crear un nuevo sshd
inicio script.
-
Modificar la etiqueta en /Library/LaunchDaemons/ssh2.plist
para diferenciar el nuevo script de inicio del incorporado, por ejemplo añadiendo un número "2":
<key>Label</key>
<string>com.openssh.sshd2</string>
-
Modifique el puerto en la sección Listeners como en el método anterior. Por ejemplo, para cambiar el puerto a 2222:
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>2222</string>
<key>Bonjour</key>
<array>
<string>ssh</string>
<string>sftp-ssh</string>
</array>
</dict>
</dict>
-
Inicie sshd
en el nuevo puerto:
sudo launchctl load -w /Library/LaunchDaemons/ssh2.plist
(Para detenerlo, ejecute sudo launchctl unload /Library/LaunchDaemons/ssh2.plist
)
El servidor SSH escuchará ahora en el nuevo puerto. Puede seguir utilizando Preferencias del Sistema>Compartir>Inicio de sesión remoto para iniciar otra instancia del servidor SSH que escuche en el puerto estándar (22/tcp) . launchd
escuchará en ambos puertos:
$ sudo lsof -i -P -n
launchd 1 root 42u IPv6 0x9df385961b132cdf 0t0 TCP *:2222 (LISTEN)
launchd 1 root 44u IPv4 0x9df385961c81db1f 0t0 TCP *:2222 (LISTEN)
launchd 1 root 45u IPv6 0x9df385961b132cdf 0t0 TCP *:2222 (LISTEN)
launchd 1 root 47u IPv4 0x9df385961c81db1f 0t0 TCP *:2222 (LISTEN)
launchd 1 root 48u IPv6 0x9df385961b133e1f 0t0 TCP *:22 (LISTEN)
launchd 1 root 49u IPv4 0x9df385961b22d51f 0t0 TCP *:22 (LISTEN)
launchd 1 root 50u IPv6 0x9df385961b133e1f 0t0 TCP *:22 (LISTEN)
launchd 1 root 51u IPv4 0x9df385961b22d51f 0t0 TCP *:22 (LISTEN)
3. Modificar las entradas "ssh" en /etc/services
Para cambiar el sshd
puerto con este método, proceda como sigue:
-
Editar /etc/services
Busca estas entradas:
ssh 22/udp # SSH Remote Login Protocol
ssh 22/tcp # SSH Remote Login Protocol
y sustituya el puerto 22 por un puerto de su elección.
Puede activar SSH con Preferencias del Sistema>Compartir>Inicio de sesión remoto y sshd
escuchará en el nuevo puerto.
¿Por qué funciona esto? Si echas un vistazo a la sección de oyentes del /System/Library/LaunchDaemons/ssh.plist
verá que sshd
está configurado para escuchar en el puerto asignado al servicio llamado ssh en /etc/services
:
<key>Sockets</key>
<dict>
<ky>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>ssh</string>
(...)
</dict>
Este es sin duda el método más sencillo, pero tiene un inconveniente: el cliente SSH esperará que los servidores SSH remotos escuchen en el nuevo puerto (en lugar del puerto 22) (gracias a jcaron por la pista). Eso es, ssh
lee /etc/services
para saber cuál es el puerto SSH por defecto.
Afortunadamente existe una solución fácil para esto: descomentar Port 22
en /etc/ssh/ssh_config
(ver man ssh_config
para más información).
4. Redirigir el puerto 22 a un nuevo puerto con filtro de paquetes
El método utiliza el filtro de paquetes (PF) de MacOS para redirigir todas las peticiones recibidas en el puerto 22 al nuevo sshd
(gracias a Andrew Morton por la idea):
-
Crear un nuevo archivo de anclaje /etc/pf.anchors/sshd
con el contenido (sustituir 2222
con un puerto de su elección):
rdr pass inet proto tcp from any to any port = 2222 -> 127.0.0.1 port 22
# If you want `sshd` to listen on port 22 too, comment out the line below
block drop in quick proto tcp from any to any port = 22
-
Añade las reglas de anclaje "sshd" editando /etc/pf.conf
(¡el orden es relevante!):
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
# Load sshd redirect rule
rdr-anchor "sshd"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
# Load other sshd rules
anchor "sshd"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
# Tell PF where to find the sshd anchor
load anchor "sshd" from "/etc/pf.anchors/sshd"
-
Habilitar y recargar el filtro de paquetes:
sudo pfctl -F all -ef /etc/pf.conf
(Para desactivarlo, ejecute sudo pfctl -d
.)
Tenga en cuenta que:
- el cortafuegos de MacOS (Preferencias del Sistema>Seguridad y Privacidad>Cortafuegos) es bajo el capó el filtro de paquetes, por lo que cuando desactiva el filtro de paquetes en la línea de comandos, también está desactivando el cortafuegos, aunque el Panel de Preferencias no refleje el cambio.
- Los clientes de SSH pensarán que se están conectando al puerto 22 a través de la
SSH_CLIENT
y SSH_CONNECTION
variables ambientales.
Edición de sshd_config
no funciona
Los usuarios que ejecutan sshd
en otros sistemas operativos puede verse tentado a editar el archivo de configuración del demonio SSH, /etc/ssh/sshd_config
. Sin embargo, en MacOS, editando el Port
en la directiva /etc/ssh/sshd_config
no conseguirá el resultado deseado .
0 votos
Hola Darren, estaba revisando las preguntas abiertas y es posible que quieras upvote/marcar mi respuesta como aceptada, ya que, por tus comentarios, entiendo que resolvió tu problema. Marcar una pregunta como resuelta también ayuda a otros que tienen un problema similar, ya que muestra que tu pregunta tiene la respuesta que estabas buscando.