我/etc/hosts.allow
在机器 192.168.122.50 上配置了以下选项。
sshd : ALL EXCEPT 192.168.122.1
并从机器 192.168.122.1 尝试,我能够以 root 身份连接到机器 192.168.122.50。ssh [email protected]
然后我将以下规则添加到/etc/hosts.deny
192.168.122.50 的文件中
sshd : 192.168.122.1
我再次从机器 192.168.122.1 进行尝试。但这次我是ssh [email protected]
无法连接我得到了错误
ssh_exchange_identification: Connection closed by remote host
/etc/hosts.allow
这让我怀疑和中 EXCEPT 指令的实际行为/etc/hosts.deny
。以下是我从中了解到的。
如果我们把除了Hosts.allow 中的指令,仅意味着我们不允许其后的特定主机/网络,但仍然可以建立连接直到我们在 中明确提到了特定的主机/网络/etc/hosts.deny
。简而言之不允许并不代表拒绝
如果我们把除了Hosts.deny 中的指令,这意味着我们间接允许特定主机/网络建立连接。简而言之不否认意味着允许
我的判断正确吗?
注 1:每当我进行更改时,ssh 守护进程都会重新启动/etc/hosts.allow
,/etc/hosts.deny
即使这不是必需的。
注2:据我所知,允许比拒绝具有更高的优先级。
答案1
您可能假设有一个隐式的“默认拒绝”:没有。
ALL EXCEPT 192.168.122.1
根本不适用于主机 192.168.122.1,因此会检查后续条目。
假设您没有古老的 tcpwrappers
(即它支持并构建-DHOSTS_ACCESS
)你真的应该只使用hosts.allow
:
sshd: 192.168.122.1 : DENY
sshd: ALL : ALLOW
(注意默认允许当然是不好的做法)
答案2
问题是 tcp_wrappers 无法拒绝特定主机,只能通过使用EXCEPT
指令(我建议)。因此,对我来说,我只找到了 1 个可行的解决方案:在hosts.allow 中使用allow ALL(除了特定主机)并在hosts.deny 中使用deny ALL:
# hosts.allow
sshd : ALL EXCEPT 11.22.33.44
# hosts.deny
sshd : ALL : DENY
我知道这有点奇怪,但它确实有效。
解决方案如
sshd: 192.168.122.1 : DENY
sshd: ALL : ALLOW
不适合我。