总长DR
在sshd_配置(5),此配置段:
Match Address fe80::/10
PasswordAuthentication yes
...未按预期匹配链路本地 IPv6 地址。为什么以及如何解决?
我正在尝试配置sshd
为仅在从本地地址连接时允许密码身份验证。否则需要公钥认证。这是 中的相关配置sshd_config
。
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
# Allow password auth on local network
Match Address 169.254.0.0/16,192.168.0.0/16
PasswordAuthentication yes
Match Address fe80::/10
PasswordAuthentication yes
什么有效:
- 正如预期的那样,在所有地址上启用了公钥身份验证。
169.254.0.0/16,192.168.0.0/16
正如预期的那样,通过 IPv4 连接时在地址范围上启用了密码身份验证。
什么不起作用:
fe80::/10
通过 IPv6 连接时,不会在地址范围上启用密码身份验证。
相关行var/log/secure
:
sshd[9457]: Connection reset by fe80::39c9:9db5:5a2a:1299%eth0 port 60468 [preauth]
...这是一个应该匹配的地址fe80::/10
我已完成的清单项目:
- IPv6 流量未被防火墙阻止
sshd
正在监听两个堆栈
$ netstat -tupln | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 8903/sshd
tcp6 0 0 :::22 :::* LISTEN 8903/sshd
- 组合/拆分
Match
IPv4 和 IPv6 的语句不会 执行任何操作Match Address 169.254.0.0/16,192.168.0.0/16,fe80::/10
这也不起作用。 - 将 IPv6 地址放在方括号中
Match Address [fe80::]/10
不行。 sshd
不记录任何配置错误var/log/secure
- 不是客户端问题 - 尝试了 OpenSSH、PuTTY、WinSCP 并得到了相同的错误
版本:
sshd
在 CentOS 7 上运行
$ uname -msr
Linux 5.4.72-v8.1.el7 aarch64
$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
我已经在/r/sysadmin
不和谐服务器上问过这个问题,人们的反应是“奇怪”。查看我们的完整对话这里如果你感兴趣。它有一些关于我尝试过的不同事情的更多小细节。
答案1
在尝试了我能想到的所有方法之后,我找到了一个适合我的解决方案。我想允许对 LAN 上的用户进行密码身份验证,但只允许来自 LAN 外部的基于密钥的身份验证,这就是我最终找到这篇文章的原因。
从其他阅读中,我看到一些指示表明方括号应该与 ipv6 地址一起使用,并且我还在 sshd 日志中看到它记录了当我使用 ipv6 连接时我的连接来自的接口名称(即eth0
, )。wlan0
我决定测试所有的组合,直到找到有效的组合。我输入了完整的 ipv6 地址,并且没有使用 /10 以确保其格式不会干扰,并且我尝试了带或不带接口名称以及带或不带括号(并将它们放在地址的不同部分周围)我可以肯定地说 sshd 不喜欢括号。任何时候我将它们包含在内都不起作用。
即使我使用了完整的精确 ipv6 地址,如果没有指定接口名称,它也无法工作,因此看起来 sshd 期望 ipv6 地址不包含方括号,就像在 URL 中一样,并且期望它将包含接口名称什么。
最后一部分是 /10,包含所有链接本地地址。我最初期望正确的形式,fe80::/10%eth0
但令人惊讶的是,这不起作用。相反,sshd 希望您编写fe80::%eth0/10
.我想如果你将 /10 视为修改整个 ip 地址,其中正确且完整的 ipv6 地址是某个数字和接口名称,而 ipv4 只是数字,那么这种情况是有意义的,但无论哪种情况,这种扭曲都已解开,我有一个解决方案。
这是我用来允许 ipv4 和 ipv6 本地连接使用密码进行身份验证的完整匹配块:
Match Address 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,fe80::%eth0/10
PasswordAuthentication yes
显然,您需要将名称修改eth0
为您机器的正确接口名称(您可以查看它们的列表,ifconfig
或者在尝试通过 ipv6 连接时检查 sshd 日志,以查看您的连接使用的接口)如果您想支持来自多个接口的连接,我认为您需要,fe80::%name/10
为每个接口指定。
我希望这个答案可以帮助其他偶然发现这个帖子的人(也许还有OP,尽管我不确定五个月后这会有多大帮助)