¿Cómo cambiar el puerto sshd en Mac OS X?

53

Quiero cambiar qué puerto sshdusa en un servidor Mac. Por ejemplo, digamos del puerto 22 al puerto 32.

La edición /etc/sshd_configno parece funcionar. ¿Alguien sabe como cambiarlo? Prefiero un método que sea compatible con todas las versiones de OSX (o al menos la mayor cantidad posible).

Alexander Artemenko
fuente
También tenga en cuenta que /usr/libexec/sshd-keygen-wrapper( que se muestra en las listas a continuación) puede iniciar un SSH diferente al especificado en la propia lista. Si lo atrapas, siempre comienza /usr/sbin/sshd.

Respuestas:

61

Todas las respuestas anteriores están funcionando (como sugiere Google también), pero son sucias y poco elegantes .

La forma correcta de cambiar el puerto de escucha para un servicio ejecutado en Mac OS X es hacer que los cambios de las teclas dedicadas estén disponibles en ssh.plist

Entonces, la solución es tan simple como usar el número de puerto en lugar del nombre del servicio.

Un extracto de mi editado /System/Library/LaunchDaemons/ssh.plist:

    <key>Sockets</key>
    <dict>
            <key>Listeners</key>
            <dict>
                    <key>SockServiceName</key>
                    <string>22022</string>
                    <key>SockFamily</key>
                    <string>IPv4</string>
                    <key>Bonjour</key>
                    <array>
                            <string>22022</string>
                    </array>
            </dict>
    </dict>

Nota: para poder editar este archivo en El Capitan, Sierra y probablemente también en versiones futuras, debe deshabilitar SIP (Protección de integridad del sistema). Consulte Cómo deshabilito la Protección de integridad del sistema (SIP) [...] .

La edición anterior también obligará a sshd a escuchar solo a través de IPV4.

Después de realizar cualquier cambio en ssh.plist, el archivo debe volver a cargarse de la siguiente manera:

sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load /System/Library/LaunchDaemons/ssh.plist

Tenga en cuenta que usar launchctl stop ...y launchctl start ...NO volverá a cargar este archivo.

La página del manual con más información se puede encontrar escribiendo man launchd.plisto usando este enlace .

drAlberT
fuente
3
@Yar launchd.plist es el nombre del manual. El cambio está en el archivo ssh.plist en / System / Library / LaunchDaemons
Martijn Pieters
1
Noto que necesita reiniciar la máquina o reiniciar el servicio ssh con launchctl.
Danny Staple
55
Grr ... cada actualización de OS X (Yosemite en este caso) descarta este cambio, lo que requiere que recuerde lo que hice la última vez para solucionarlo y dónde encontré esta información. Gracias por la solución!
Michael
2
@Hassan, debe iniciar dos instancias ssh ... es decir, agregar otro oyente con un nombre y un valor de SockServiceName diferentes
drAlberT
55
Tenga en cuenta que en la versión de El Capitan (y probablemente también en versiones futuras) necesita desactivar SIP (Protección de integridad del sistema) antes de poder editar el archivo, consulte: apple.stackexchange.com/a/208481
jcfrei
17

Si desea que sshd escuche en un puerto adicional, puede agregar varias entradas al diccionario Sockets.

Ejemplo:

<key>Sockets</key>
<dict>
        <key>Listeners</key>
        <dict>
                <key>SockServiceName</key>
                <string>ssh</string>
                <key>Bonjour</key>
                <array>
                        <string>ssh</string>
                        <string>sftp-ssh</string>
                </array>
        </dict>
        <key>Listeners2</key>
        <dict>
                <key>SockServiceName</key>
                <string>22022</string>
        </dict>
</dict>
raimue
fuente
1
Para mayor claridad, @Raim se refiere a:/System/Library/LaunchDaemons/ssh.plist
Mike Causer
¿Cuál es el propósito de la clave Bonjour?
Me encantaría saber también, ¿cuál es el propósito de la llave Bonjour?
Dibujó
¿Qué demonios es 20022?
Jamie Hutber
1
El propósito de la clave Bonjour: esta clave opcional se puede utilizar para solicitar que el servicio se registre en el subsistema Bonjour. Según lo dicho por man launchd.plist.
Scott Willeke
6

Según lo que he leído (y experimentado) hasta ahora, hay tres métodos principales que se pueden usar:

  1. cambie la configuración en el archivo ssh.plist;
  2. cambiar la configuración en el archivo / etc / services;
  3. cambie la configuración en el archivo /etc/sshd.conf.

Otra forma de hacerlo, que personalmente prefiero con mucho a todos y cada uno de estos métodos, porque evita perder el tiempo con los archivos del sistema Mac OS X es usar socat para redirigir el puerto 22 al puerto que desee.

  1. Descargar socat: http://www.dest-unreach.org/socat/download/socat-1.7.3.2.tar.gz
  2. Mueva el archivo tar.gz a su directorio / usr / local / ( sudo mv ./socat-1.7.3.2.tar.gz /usr/local/bin/socat-1.7.3.2.tar.gz)
  3. Vaya a su directorio / usr / local / bin ( cd /usr/local/bin)
  4. Descomprimir: sudo tar -xvzf socat-1.7.3.2.tar.gz
  5. Mover al directorio de archivos sin comprimir: cd ./socat-1.7.3.2
  6. Ejecute la configuración habitual, make y make install para instalar socat ( sudo ./configure && sudo make && sudo make install)
  7. Redirija el puerto 22 (ssh predeterminado) a cualquier puerto que desee (en el siguiente ejemplo, 2222) utilizando la opción correcta enviando una llamada socat ( sudo socat TCP-LISTEN:2222,reuseaddr,fork TCP:localhost:22)

Ya ha terminado y sus archivos de sistema mac os x no se modifican. Además, este método funciona no solo en Snow Leopard, sino en todas las versiones de Mac OS X y también en cualquier máquina en la que se pueda ejecutar Socat.

Lo último que debe hacer si utiliza un enrutador / firewall es incluir los comandos de redireccionamiento correctos en su enrutador / firewall.

Además, evita quedar atrapado en el debate sobre si el método ssh.plist, el método de servicios o el método que sea mejor, más elegante o peor que el otro.

También puede preparar fácilmente un script que se ejecute al inicio para reconstruir la redirección socat cada vez que reinicie su máquina. Coloque esto en /Library/LaunchDaemons/com.serverfault.sshdredirect.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.serverfault.sshdredirect</string>
    <key>KeepAlive</key>
    <dict>
        <key>NetworkState</key>
        <true/>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/socat</string>
        <string>TCP-LISTEN:2222,reuseaddr,fork</string>
        <string>TCP:localhost:22</string>
    </array>
</dict>
</plist>

Use sudo launchctl load -w /Library/LaunchDaemons/com.serverfault.sshdredirect.plistpara cargarlo. Se cargará automáticamente en futuros reinicios.

Además, también puede mejorar la seguridad (i) configurando su firewall para bloquear cualquier conexión a su puerto 22 desde cualquier otra interfaz que no sea el loopback (127.0.0.1) y (ii) realice un cambio similar en su archivo sshd.conf para haga que ssh escuche solo en el loopback.

Disfrutar.

Cedric
fuente
2
Editar el /etc/servicesarchivo es una mala idea: afectará cosas como el inicio de sesión con clave SSH en sus cuentas de github o bitbucket, que buscarán conectarse al nuevo puerto y fallarán.
ccpizza
1
Debería construir en un directorio temporal. Luego use sudopara instalar. No debe construir con privilegios elevados.
Esto también funciona en El Capitan, donde SIP dificulta el cambio de /System/Library/LaunchDaemons/ssh.plist. Pero, en El Capitan, la clave "NetworkState" está en desuso; Sugiero <key>KeepAlive</key><true/>.
RTS - lee sobre Monica Cellio el
con la última versión de osx sierra, la versión de trabajo es: gist.github.com/shanmuha/d97e9f1abdaf1c9b804f748f332a3ffd
Shanmu
1

No podría ver esto documentado correctamente en ninguna parte de una página de manual, pero si no desea hacer nada más que agregar un oyente adicional, puede usar una variedad de oyentes y tener un dict extra. Esto no requiere edición / etc / services si usa el puerto directamente (¡pero recuerde abrir el puerto en su firewall!)

    <key>Listeners</key>
    <array>
    <dict>
        <key>Bonjour</key>
        <array>
            <string>ssh</string>
            <string>sftp-ssh</string>
        </array>
        <key>SockServiceName</key>
        <string>ssh</string>
    </dict>
    <dict>
        <key>SockServiceName</key>
        <string>22222</string>
    </dict>
    </array>
Adam Prescott
fuente
1
¿Cuál es el propósito de la clave Bonjour?
@jww Creo que es un error de copiar y pegar cuando estaba reconstruyendo esto de otros oyentes.
Adam Prescott
Me encantaría saber también, ¿cuál es el propósito de la llave Bonjour?
Dibujó
1
El propósito de la clave Bonjour: esta clave opcional se puede utilizar para solicitar que el servicio se registre en el subsistema Bonjour. Según lo dicho por man launchd.plist.
Scott Willeke