sshd 服务是使用 frp 随机映射到一台服务器上的,也就是说端口号时不时会有变化。
我在网络上查到可以通过 StrictHostKeyChecking=no 的方式关闭某次或者所有连接的公钥验证,但我又不想不验证公钥,因为 frp 服务器是公共服务
我又查到可以通过 ssh-keyscan 来扫描公钥提前全部添加到 known_hosts,但看起来不太符合我这个 case
解决了, known_hosts 支持通配符,使用如下配置即可:
如果使用域名的方式的话,会在连接时额外追加当前连接的对侧IP到 known_hosts 中。
思路:按照二楼中提到的思想,想到了去查一下 known_hosts 的语法,然后灵机一动想到了通配符,再按照“wildcards known_host”的关键词,搜到了 [SSH known_hosts with a dynamic IP] 这个问答
1
Xusually 2020-11-24 11:07:27 +08:00
然而这很矛盾啊。
你如果不想要提示加入到 known_hosts,你本地不存,那么下次再链接的验证和比对就无从谈起啊。 你本地存了,下次换了,你也机械性的添加到本地,或者替换到本地,那么验证的过程呢?不也是没有什么安全可言? sshd 可以有多种方式忽略 known_hosts,但是你也提到了还是想验证。 验证的话,光处理这个 known_hosts 提醒只是表象吧,还是得确认对方的 key 才对,所以问题不出在这个提醒,是怎么在对方变了 key 之后确认 key 是不是真的主机。 我理解的应该没错吧? |
2
CEBBCAT OP @Xusually #1 谢谢回复。我现在我把公钥指纹存在 DNS 的 TXT 记录里了,所以本质上是可以验证的,这也是我现在的验证方式,ssh 提示我的时候,我就从 DNS 里查一下公钥指纹,看看和提示的是否一样。
我觉得有这么几种合乎逻辑的实现方式: - 我在连接的时候提供公钥指纹参数,如果验证一致那么就直接连接,添加不添加到 known_hosts 无所谓 - known_hosts 对指定机器不验证端口,只验证公钥。或者说,假定指定机器所有端口都使用同一公钥 第二种方法我还没查过,我现在查查 known_hosts 的语法去 |
3
Edward0Chan 2020-11-24 11:38:53 +08:00
@Xusually 他说的公钥没变,所以不矛盾
关键点在于端口变了会判定为新的服务吧,所以又要另存 相当于一个服务器存了很多个一样的公钥 |