在這篇文章中,我們將會講述什麼是 TCP 封裝器(TCP wrappers)以及如何在一台 Linux 伺服器上配置他們來限製網路服務的權限。在開始之前,我們必須澄清 TCP 封裝器並不能消除對於正確配置防火牆的需求。
就這一點而言,你可以把這個工具看作是一個基於主機的存取控制列表,而且並不能作為你的系統的終極安全措施。透過使用一個防火牆和 TCP 封裝器,而不是只偏愛其中的一個,你將會確保你的服務不會被出現單點故障。
正確理解hosts.allow 和hosts.deny 檔案
當一個網路要求到達你的主機的時候,TCP 封裝器會使用hosts.allow 和hosts.deny (按照這樣的順序)來決定客戶端是否應該被允許使用一個提供的服務。 .
在預設情況下,這些檔案內容是空的,或者被註解掉,或者根本不存在。所以,任何請求都會被允許通過 TCP 過濾器而且你的系統被置於依靠防火牆來提供所有的保護。因為這並不是我們想要的。由於在一開始我們就介紹過的原因,清確保下面兩個文件都存在:
# ls -l /etc/hosts.allow /etc/hosts.deny
兩個文件的編寫語法規則是一樣的:
<services> : <clients> [: <option1> : <option2> : ...]
在文件中,
1. services 指當前規則對應的服務,是一個逗號分割的清單。
2. clients 指被規則影響的主機名稱或 IP 位址,逗號分割的。下面的通配符也可以接受:
1).ALL 表示所有事物,應用於clients和services。
2).LOCAL 表示符合在正式網域名稱中沒有完全限定主機名稱(FQDN)的機器,例如 localhost。
3).KNOWN 表示主機名,主機位址,或使用者是已知的(即可以透過 DNS 或其它服務解析到)。
4).UNKNOWN 和 KNOWN 相反。
5).PARANOID 如果進行反向 DNS 查找彼此返回了不同的位址,那麼連接就會被斷開(首先根據 IP 去解析主機名,然後根據主機名稱去獲得 IP 位址)。
3. 最後,一個冒號分割的動作清單表示了當一個規則被觸發的時候會採取什麼操作。
你應該記住 /etc/hosts.allow 檔案中允許一個服務接入的規則要優先於 /etc/hosts.deny 中的規則。另外還有,如果兩個規則應用在同一個服務,只有第一個規則會被納入考慮。
不幸的是,不是所有的網路服務都支援TCP 過濾器,為了查看一個給定的服務是否支援他們,可以執行以下命令:
# ldd /path/to/binary | grep libwrap
如果以上命令執行以後得到了以下結果,那麼它就可以支援TCP 濾波器,sshd 和vsftpd 作為例子,輸出如下所示。
中使用非空行後面透過回車鍵來新增一個新的行。
為了使得SSH 和FTP 服務只允許localhost 和192.168.0.102 並且拒絕所有其他用戶,在/etc/hosts.deny 添加如下內容:
sshd,vsftpd : ALL ALL : ALL
而且在/etc/hosts.allow 文件中添加如下內容:
sshd,vsftpd : 192.168.0.102,LOCAL
而且在/etc/hosts.allow 文件中添加如下內容:
rrreee這些變更會立刻生效並且不需要重新啟動。
在下圖中你會看到,在最後一行刪除 LOCAL 後,FTP 伺服器會對 localhost 不可用。在我們新增了通配符以後,服務又變得可用了。
確認FTP 權限
為了允許所有服務對於主機名中含有example.com 都可用,在hosts.allow 中添加如下一行:
ALL : .example.com
ALL : .example.com
1.0/24 的機器存取vsftpd 服務,在hosts.deny 檔案中加入以下一行:
在最後的兩個例子中,注意到客戶端清單每行開頭和