将 ssh 限制为特定的主机名

cob*_*aco 3 ssh

所以这里的问题是:

  • 我有一个带有多个主机名的服务器,这意味着我有 A 记录example.com*.example.com指向服务器的 IP 地址
  • 我想将传入的 ssh 连接限制为特定的主机名,即我只想允许登录到 user@secret.example.com,并禁止使用 user@ip-address 或 user@example.com 进行登录尝试

sshd_config 的手册页包含以下内容ListenAddress

Specifies the local addresses sshd(8) should listen on.  
The following forms may be used:

ListenAddress host|IPv4_addr|IPv6_addr
ListenAddress host|IPv4_addr:port
ListenAddress [host|IPv6_addr]:port
Run Code Online (Sandbox Code Playgroud)

这似乎表明 sshd 有能力将自己限制为特定的主机名。但是我已经尝试过ListenAddress secret.example.com:22,但是在重新启动 sshd 之后,似乎没有根据所使用的主机名添加任何限制。

man sshd_config 似乎没有在这种情况下显示任何其他选项。

是不是我遗漏了什么,或者 sshd 根本没有这种能力?

小智 6

没有“DNS”连接之类的东西。一旦客户端获得 IP,它就只能建立 TCP/IP 连接。服务器只看到 IP,所以它不知道客户端用来查找服务器的名称。

我们有网站虚拟主机的原因是因为客户端传输请求特定主机的标头。事实上,虚拟主机在 SSL(TLS) 被修改为在初始连接期间允许“服务器名称指示”之前不能使用 SSL。

为了让“虚拟主机”与 SSH 一起工作,客户端需要一种在连接时传输主机名的方法。但即使 SSH 支持这样的功能,您也通过要求特定的主机名来增加零安全性。原因是 sshd 必须解密攻击者的数据包才能运行过滤器。只要您禁用 SSH 密码,解密攻击者的数据包以与您的 SSH 密钥进行比较就没有什么区别。

如果您不想被扫描,请移动 SSH 端口和/或安装 fail2ban。如果你真的很偏执,你可以安装一个端口敲门器,从临时扫描器“隐藏”你的开放端口和/或使用 iptables 将 IP 地址列入白名单。

  • 换句话说,即使 ssh 客户端区分同一主机的 2 个域名(要求指纹确认两次),它也不会在建立连接时将使用的主机名传输给服务器,因此服务器无法区分。把事情搞清楚了,谢谢。 (2认同)