macOS X Mojave 10.14.2,内核 Darwin 18.2.0
出于安全原因,想要进一步更改 2222x 中用于监听传入 SSH 连接的 22 端口。
更改 /etc/ssh/sshd_config 毫无意义。
这之前描述的方法在 Mojave 上对我来说不起作用有
什么建议我可以在哪里更改端口设置?
在 /etc/ssh/sshd_config 中:
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# SSH v2
Protocol 2
Port 2222
AddressFamily inet
#ListenAddress 0.0.0.0
#ListenAddress ::
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
客户端的 /etc/ssh/ssh_config:
Host *
Protocol 2
Port 2222
SendEnv LANG LC_*
sshd 上监听的端口:
MBP:.ssh user$ > sudo lsof -iTCP -sTCP:LISTEN -n -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
launchd 1 root 8u IPv6 0xad7e82fd153731a7 0t0 TCP *:445 (LISTEN)
launchd 1 root 12u IPv4 0xad7e82fd153798e7 0t0 TCP *:445 (LISTEN)
launchd 1 root 14u IPv6 0xad7e82fd22020067 0t0 TCP *:22 (LISTEN)
launchd 1 root 20u IPv4 0xad7e82fd2eeb3f67 0t0 TCP *:22 (LISTEN)
launchd 1 root 24u IPv6 0xad7e82fd153731a7 0t0 TCP *:445 (LISTEN)
launchd 1 root 26u IPv6 0xad7e82fd15373767 0t0 TCP *:548 (LISTEN)
launchd 1 root 28u IPv4 0xad7e82fd153798e7 0t0 TCP *:445 (LISTEN)
launchd 1 root 29u IPv6 0xad7e82fd22020067 0t0 TCP *:22 (LISTEN)
launchd 1 root 33u IPv4 0xad7e82fd15378f67 0t0 TCP *:548 (LISTEN)
launchd 1 root 43u IPv6 0xad7e82fd15373767 0t0 TCP *:548 (LISTEN)
launchd 1 root 44u IPv4 0xad7e82fd15378f67 0t0 TCP *:548 (LISTEN)
launchd 1 root 47u IPv4 0xad7e82fd2eeb3f67 0t0 TCP *:22 (LISTEN)
kdc 87 root 5u IPv6 0xad7e82fd15372be7 0t0 TCP *:88 (LISTEN)
kdc 87 root 7u IPv4 0xad7e82fd15377c67 0t0 TCP *:88 (LISTEN)
答案1
假设你想将默认端口 22 更改为端口 22222
打开终端窗口
编辑/etc/services
文件输入:
sudo vi /etc/services
系统将提示您输入密码并获得提升的安全权限以进行更改。
使用斜线命令查找 ssh 服务/ssh
。将有两个条目,一个用于tcp
,另一个用于udp
ssh 22/udp # SSH 远程登录协议
ssh 22/tcp # SSH 远程登录协议
将两种情况下的数字 22 更改为 22222 或您想要的端口号。
使用保存更改:w
Enter
你需要回收远程控制守护进程。根据您的系统设置,远程控制可能没有运行。如果没有,第一个命令将失败;忽略它并继续执行第二个命令以启动远程控制。
输入以下命令来停止它:
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
现在输入以下命令再次启动 SSH:
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
使用以下命令通过 ssh 登录来验证您是否可以访问系统:
ssh localhost -p 22222
要恢复系统,请重做上述步骤并将 ssh 端口改回 22。
答案2
监听端口 22 由 负责launchd
,它相当于 Unix 的init
,inetd
并且cron
。 Inetd
可以配置为监听某个端口并启动相应的命令,而不是以守护进程模式启动该命令,与 相同launchd
。
您会注意到,如果您运行一个,ps -ax | grep sshd
它们都没有监听端口 22。您还会注意到,如果您lsof
在launchd
进程上运行一个,您会看到它正在监听端口 22。
launchd
是通过和操作系统一起安装的系统目录中的一堆.plist
文件进行的配置,非系统是在安装后添加的。/Library/LaunchDaemons
/System/Library/LaunchDaemons
您需要的配置是/System/Library/LaunchDaemons/ssh.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>com.openssh.sshd</string>
<key>Program</key>
<string>/usr/libexec/sshd-keygen-wrapper</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/sshd</string>
<string>-i</string>
</array>
<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>
</dict>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
<key>Instances</key>
<integer>42</integer>
</dict>
<key>StandardErrorPath</key>
<string>/dev/null</string>
<key>SHAuthorizationRight</key>
<string>system.preferences</string>
<key>POSIXSpawnType</key>
<string>Interactive</string>
</dict>
</plist>
如果您不想让它再监听端口 22,您可以编辑此文件。否则,请将其以不同的名称复制/Libary/LaunchDaemons
并编辑该副本。cp /System/Library/LaunchDaemons/ssh.plist /Library/LaunchDaemons/ssh-alt.plist
编辑正下方的行,SockServiceName
它是端口号或端口别名的字符串,因此更改/etc/services
有效。您可以将所需的数字端口添加到 plist 中的数组,也可以使用自己的标识符将所需的数字端口添加到 /etc/services,就像my-ssh-alt
在 plist 中更改为它一样。
如果已复制到新的 plist,请加载新的 plist;
sudo launchctl load -w /Library/LaunchDaemons/ssh-alt.plist
否则重新加载 ssh 配置,我将从其他答案中复制该配置;
输入以下命令来停止它:
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
现在输入以下命令再次启动 SSH:
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
答案3
为了跟进 Hogstrom 的回应,你可能还需要编辑 /etc/ssh/ssh_config 并取消注释以下内容:
端口 22
因此,当您尝试 ssh 到所选的普通主机(运行端口 22)而不是您在 /etc/services 中设置的新 ssh 默认值时。
答案4
为了补充 silicontrip 的答案,如果您想要原始端口和新端口,您可以在 ssh.plist 的 Sockets 部分添加一个“备用监听器”键(或任何标签):
...
<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>Alternate Listeners</key>
<dict>
<key>SockServiceName</key>
<string>(name of service)</string>
</dict>
</dict>
...
请注意,在蒙特雷,ProgramArguments 部分自 Big Sur 以来发生了变化(它过去直接调用 sshd)。如果您刚刚将 ssh.plist 文件从 Big Sur 复制到蒙特雷,则会导致“kex_exchange_identification:读取:对等方重置连接”。
<key>ProgramArguments</key>
<array>
<string>sshd-keygen-wrapper</string>
</array>
我修改 /System/Library/LaunchDaemons/ssh.plist 的问题是我不想破坏卷上的 apfs 密封。
我在 /Library/LaunchDaemons/ssh_alt.plist 中使用不同的标签创建了 ssh.plist 的副本,并使用
sudo launchctl load -w /Library/LaunchDaemons/ssh_alt.plist
到目前为止,这种现象似乎仍在靴子中持续存在。