SSH 在重启时重置为默认端口

3rg*_*rgo 12 ssh connection 16.04

我将我的家庭服务器(在/etc/ssh/sshd_config文件中)上的默认 SSH 端口更改为端口 54747,然后重新启动ssh和sshd服务(我不确定是哪一个,所以为了安全起见,我都做了)。为了测试我的配置,我注销然后重新登录,没有任何问题。

几天后,我安装了 apt 更新,然后重新启动了我的服务器。当我尝试通过 SSH 重新登录(在端口 54747 上)时,出现连接拒绝错误。

出于某种原因,我尝试在默认端口上使用 SSH,并且成功了!我回去检查 sshd_config,但它仍然有自定义端口。所以我重新启动了ssh和sshd服务,它又回到了“常规”行为(端口 54747 上的 ssh)。我再次尝试重新启动,连接再次被拒绝...

有谁知道我做错了什么?

额外的细节:

  • Ubuntu 16.04.2 LTS
  • 服务器也使用了 HTPC,在我的电视上有一个开放的会话(与 SSH 相同的用户)
  • 我使用笔记本电脑的 RSA 密钥 SSH,并禁用了密码验证
  • 我以前用 重启过sudo reboot -h now,但是搜索后发现有些人不鼓励,所以我尝试了sudo reboot,但没有区别

编辑 事件序列:

  1. 将 SSH 端口从 22 更改为 54747 /etc/ssh/sshd_config
  2. 重启ssh和sshd服务
  3. 结束当前 SSH 会话
  4. SSH 在端口 54747 上成功返回
  5. 重启
  6. 端口 54747 上的 SSH 连接错误,但在端口 22 上成功
  7. 重启ssh和sshd服务
  8. SSH 在端口 54747 上成功返回,端口 22 上的连接错误
  9. 重新启动并返回到 6

编辑 1: netstat输出

rgo@ATLAS:~$ sudo netstat -lntp | grep :54747
rgo@ATLAS:~$ sudo netstat -lntp | grep :22
tcp6       0      0 :::22                   :::*                    LISTEN      1/init  
Run Code Online (Sandbox Code Playgroud)

编辑 2: service sshd status

? ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
Run Code Online (Sandbox Code Playgroud)

编辑 3: lsof -i | grep ssh

systemd      1     root   46u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
systemd      1     root   49u  IPv6  14641      0t0  TCP *:ssh (LISTEN)
sshd      4088     root    3u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
sshd      4088     root    4u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
sshd      4202      rgo    3u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
sshd      4202      rgo    4u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)

作为参考,ATLAS 是远程服务器主机名,192.168.1.27 是我的笔记本电脑的 LAN IP,命令在步骤 6 和 7 之间执行

ufw status

Status: inactive
Run Code Online (Sandbox Code Playgroud)

编辑 4: ps -ef |grep sshd

root      4088     1  0 22:40 ?        00:00:00 sshd: rgo [priv]
rgo       4202  4088  0 22:40 ?        00:00:00 sshd: rgo@pts/1 sshd
Run Code Online (Sandbox Code Playgroud)

Rob*_*sak 10

根据配置,ssh 可能会被 systemd“激活套接字”,这意味着最初是 systemd 设置监听端口,并且 sshd 仅在客户端首次连接时启动。这是为了加快启动时间:服务守护进程仅按需启动。

然而,这意味着您还必须将 systemd 配置到匹配的端口。/lib/systemd/system/ssh.socket您将在其中找到系统配置列表ListenStream=22。要覆盖此设置,请创建一个文件/etc/systemd/system/ssh.socket.d/port.conf(如果需要,创建目录ssh.socket.d),其中包含:

[Socket]
ListenStream=
ListenStream=54747
Run Code Online (Sandbox Code Playgroud)

将号码更改为所需的端口。第一个空白条目会删除之前的默认值,后续条目会添加新的默认值。这会覆盖默认交付的内容,并且除了更改之外/lib/systemd/system/ssh.socket还必须完成此操作。/etc/ssh/sshd_config

然后运行sudo systemctl daemon-reload告诉 systemd 你的更改,以及sudo systemctl reload ssh你的 ssh 守护进程之前是否运行过。

  • 这有效!这个谜题终于解开了!但后来我注意到我可以使用两个端口进行访问:默认 22 端口和自定义端口。在自定义端口之前添加“ListenStream=”行可以阻止此操作,不知道为什么。也许这会“清除”默认“/lib/systemd/system/ssh.socket”中的“ListenStream=22”设置?覆盖设置的奇怪方法。也许值得将其添加到答案中? (2认同)

jon*_*610 0

ssh 是仲裁并维护与 ssh 服务器的用户会话连接的客户端进程。sshd 是运行在 ssh 服务器上的守护进程,用于侦听和验证 ssh 连接请求。

启动sshd服务时读取的sshd服务器上的配置文件(需要sudo权限才能编辑)为

/etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

该服务应该开始于

/etc/systemd/system/sshd.service
Run Code Online (Sandbox Code Playgroud)

重新启动 sshd 这将涉及重新读取 sshd_config 文件

sudo service sshd restart
Run Code Online (Sandbox Code Playgroud)

要查看 sshd 守护进程正在侦听的端口以及其他有用信息,请在 ssh 服务器上键入

sudo service sshd status
Run Code Online (Sandbox Code Playgroud)

按指定顺序执行以下步骤:

重新启动 ssh 服务器

在 ssh 服务器上打开终端会话(不是与其建立 ssh 连接)

类型hostname

如果主机名未返回 ssh 服务器的名称(本例中为 Atlas),请正确重做上一步。

grep Port /etc/ssh/sshd_config - 记下端口号。应该是你指定的那个

sudo service sshd status

如果状态报告它处于活动状态,正在运行并正在侦听您指定的自定义端口,那么您就可以做到这一点。如果没有,服务启动可能不会调用您修改的 sshd_config 文件,而是调用另一个包含默认信息的配置文件。如果服务未启动(表示已死亡且未激活且正在运行),那么这与您询问的问题不同。

这些步骤可能会确定您所询问问题的根本原因。

出于测试目的和简单性:在客户端,您可以从终端会话 ssh 进入 ssh 服务器,如下所示

ssh -l username -p 54747 hostname
Run Code Online (Sandbox Code Playgroud)

根据OP反馈,我怀疑 sshd 没有在启动时启动,但在手动调用时确实启动正确。通过端口 22 成功的 ssh 连接很可能不是连接到 ssh 服务器,而是连接到其他东西(例如本地主机)。为了证明或揭穿这一点,在通过 ssh 连接后输入

hostname
Run Code Online (Sandbox Code Playgroud)

根据OP所说的,我猜测主机名不会是ssh服务器图集。

为了进一步隔离这一点,在重新启动 ssh 服务器之后但在执行任何进一步操作之前,从 ssh 服务器 (Atlas) 上的终端会话键入

ssh localhost
Run Code Online (Sandbox Code Playgroud)

如果这失败了(应该如此),那么

ssh -p 54747 localhost
Run Code Online (Sandbox Code Playgroud)

如果这也不起作用,将确认运行时获得的结果

sudo service sshd status
Run Code Online (Sandbox Code Playgroud)


G_S*_*yle 0

验证文件中的端口设置/etc/ssh/sshd_config。确保您以 sudo 或 sudo 组中的用户身份进行编辑。设置端口所需要做的就是在一行中键入Port 54747.Now,通过运行重新启动 ssh 服务service sshd restart.,然后通过运行 Reboot 和 test 来验证 ssh 是否正在侦听该端口sudo netstat -lntp | grep ssh.。

另请检查您的网络设置。如果您在公司网络上,请确保您位于正确的 VLAN 中。