介紹如何在 Linux 系統上使用 hosts.allow
與 hosts.deny
的設定來限制各種服務的連線來源 IP 位址。
並不是每一種服務都支援 TCP Wrappers,若要檢查特定服務是否有支援 TCP Wrappers,可以使用 ldd
來查閱該服務執行檔有沒有需要用到 libwrap
,若要確認 sshd
是否支援 TCP Wrappers 則可執行:
# 確認 sshd 支援 TCP Wrappers ldd `which sshd` | grep libwrap
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007fd85b09e000)
若有出現類似這樣的 libwrap
路徑資訊,就代表該服務執行檔有支援 TCP Wrappers,可以使用 hosts.allow
與 hosts.deny
來限制連線 IP 位址。
hosts.allow
與 hosts.deny
TCP Wrappers 可透過以下兩個設定檔案來連線來源的 IP 位址:
設定檔 | 優先順序 | 說明 |
---|---|---|
hosts.allow |
高 | 允許的來源 IP 位址。 |
hosts.deny |
低 | 拒絕的來源 IP 位址。 |
在優先順序上,hosts.allow
高於 hosts.deny
,也就是說如果寫在 hosts.allow
中被允許的 IP 位址,就一定可以連線,如果 hosts.allow
沒有寫到的,才再去檢查 hosts.deny
。如果這兩個檔案都沒有寫到的 IP 位址,預設也是可以進行連線的。
這裡我們希望只有我們指定的 IP 位址可以進行連線(白名單),所以我們將允許連線的 IP 位址寫在 hosts.allow
中,例如若希望 sshd
服務允許接受 192.168.0.0/24
這個 IP 網段連線,就可以加入以下設定:
# 允許 sshd 接受 192.168.0.0/24 網段 IP 連線 sshd: 192.168.0.0/24 # 允許 sshd 接受本機連線 sshd: 127.0.0.1 sshd: [::1]
通常服務都會允許本機自己的連線,如果感覺沒必要的話,可以自行移除。
接著在 hosts.deny
中加入以下設定,禁止其他所有來源 IP 的連線:
# 禁止所有來源 IP 的連線
sshd: ANY
這樣設定完 hosts.allow
與 hosts.deny
之後,就只有 192.168.0.0/24
這個 IP 網段連線能夠透過 SSH 連線至伺服器了。
hosts.allow
範例以下是一些常用的 hosts.allow
寫法範例:
# 允許 sshd 接受 192.168.0.1 與 192.168.0.2 的連線 sshd: 192.168.0.1, 192.168.0.2 # 允許 sshd 接受相同網域的機器連線 sshd: LOCAL # 允許 sshd 接受 .officeguide.cc 網域的機器連線 sshd: .officeguide.cc # 允許 sshd 接受 .officeguide.cc 網域的機器連線,但 cracker.officeguide.cc 除外 sshd: .officeguide.cc EXCEPT cracker.officeguide.cc # 允許任何服務接受 192.168.0.1 與 192.168.0.2 的連線 ALL: 192.168.0.1, 192.168.0.2