Linux

TCP 包裝器“除外”選項

  • April 14, 2020

/etc/hosts.allow在機器 192.168.122.50 上配置了以下選項。

sshd : ALL EXCEPT 192.168.122.1

並從機器 192.168.122.1 嘗試ssh root@192.168.122.50,我能夠以 root 身份連接到機器 192.168.122.50。

然後我將以下規則添加到/etc/hosts.deny192.168.122.50 的文件中

sshd : 192.168.122.1

再次,我ssh root@192.168.122.50從機器 192.168.122.1 嘗試。但是這次我無法連接,我得到了錯誤

ssh_exchange_identification: Connection closed by remote host

/etc/hosts.allow這讓我懷疑和中的 EXCEPT 指令的實際行為/etc/hosts.deny。以下是我對此的理解。

如果我們將EXCEPT指令放在 hosts.allow 中,這僅意味著我們不允許其後出現的特定主機/網路,但在我們明確提及特定主機/網路之前/etc/hosts.deny,連接仍然是可能的。簡單地說,不允許並不意味著否認

如果我們將EXCEPT指令放在 hosts.deny 中,這意味著我們間接允許特定主機/網路建立連接。簡單地說,不否認意味著允許

我的判斷是否正確?

注意 1:每當我進行更改時,ssh 守護程序都會重新啟動/etc/hosts.allow/etc/hosts.deny即使它不是必需的。

注意2:我知道允許比拒絕具有更高的優先級。

您可能假設存在隱含的“預設拒絕”:沒有。

ALL EXCEPT 192.168.122.1根本不適用於主機 192.168.122.1,因此檢查後續條目。

假設你沒有一個古老 tcpwrappers的(即它支持和建構-DHOSTS_ACCESS)你真的應該只使用hosts.allow

sshd: 192.168.122.1 : DENY
sshd: ALL : ALLOW

(請注意,預設允許當然是不好的做法)

問題是 tcp_wrappers 不能拒絕特定的主機,只能通過使用EXCEPT指令(我建議)。因此,對我來說,我發現只有 1 個可行的解決方案,方法是在 hosts.allow 中使用 allow ALL,除了特定主機之外,在 hosts.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

不適合我。

引用自:https://unix.stackexchange.com/questions/92196