1. 程式人生 > 實用技巧 >另一種訪問控制機制TCP Wrappers

另一種訪問控制機制TCP Wrappers

TCP Wrappers

在之前的文章中我們介紹過iptables,iptables也是一種訪問控制機制。由於iptables中的引數過多,對於初學者要想完全掌握iptables有一定的難度。因此,在這裡我們介紹另一種簡單的訪問控制機制,就是TCP Wrappers。

TCP Wrappers的工作原理主要是分析TCP的報頭資訊,並與/etc/hosts.allow和/etc/hosts.deny中的規則進行匹配,從而決定哪些主機可以訪問系統服務或資源。



TCP Wrappers雖然能對TCP協議的報文做過濾動作,但是並不是所有的TCP協議報文TCP Wrappers都可以過濾掉。只有某個服務連結到TCP Wrappers的函式庫(這個函式庫叫做libwrap.so)才可以使用TCP Wrappers進行報文過濾。

檢視某個服務是否連結到libwrap.so這個動態函式庫,使用如下命令檢視即可:

ldd $(which 服務名稱)或ldd `which 服務名稱`

例如:檢視sshd這個服務是否連結到了libwrap.so這個服務,可以使用如下命令:

ldd $(which sshd) | grep 'libwrap'


當然有些服務沒有連結到這個動態函式庫,TCP Wrappers也可以對它們進行匹配處理。原因是TCP Wrappers的這個函式庫被直接編譯到這個服務或程式裡面去了。所以有些服務也支援TCP Wrappers。

要檢視TCP Wrappers的函式庫是否被直接編譯進某個程式,使用如下命令即可:

string `which 服務名稱` | grep hosts

如果出現如下兩行,表示TCP Wrappers函式庫被直接編譯進某個程式裡了。

/etc/hosts.allow

/etc/hosts.deny

這兩個檔案就是TCP Wrappers匹配規則時用到的檔案,出現這兩個檔案表示該服務支援TCP Wrappers。


TCP Wrappers匹配TCP報文的流程:

wKiom1RY4obRoSVTAACk3a_uX-g580.jpg

1、當客戶端訪問伺服器端的某個服務時,TCP Wrappers會將該請求報文與/etc/hosts.allow中定義的規則進行匹配;匹配成功,則允許訪問伺服器的某個服務;

2、如果匹配不成功,在與/etc/hosts.deny中定義的規則進行匹配;如果匹配成功,則拒絕訪問某服務。

3、如果匹配沒有成功,則執行預設策略,就是允許該客戶端訪問某服務



/etc/hosts.allow和/etc/hosts.deny的語法格式:

這兩個檔案的語法格式是一樣的,語法格式為:

daemon_list: client_list [:options]

這裡的daemon_list可以是某一個服務的可執行程式的二進位制檔名稱或其服務列表,或者使用ALL也可以。

其中ALL是一個巨集變數,表示所有的服務或程序


client_list:可以是單個IP,NETWORK/MASK、HOSTNAME、巨集變數

IP:表示某一個具體的地址

NETWORK/MASK中的掩碼必須不能使用長度的格式,例如10.0.0.0/8是不正確的,必須是10.0.0.0/255.0.0.0

如果某個網段是標準的A,B,C類網段,可以這麼寫,以B類地址為例:172.16.

HOSTNAME:可以是符合FQDN格式的主機名,也可以是domain,域名前面要加'.',例如:.baidu.com

巨集變數:

ALL:表示所有的ip或主機

LOCAL:表示與本機IP在同一個網段內的主機

UNKOWN:表示FQDN格式的主機不能被正向解析

KNOWN:表示FQDN格式的主機名可以被正向解析

PARANOID:表示主機名正向解析和反向解析無法匹配

EXCEPT:除了,不包含的意思。


options:這個欄位可以省略,options的選項有如下幾個:

allow:表示允許,如果這個選項出現在/etc/host.deny檔案中也表示允許的意思

deny:表示拒絕,如果這個選項出現在/etc/hosts.allow檔案中,也表示是拒絕的意思。

spawn:表示立即執行其後的語句,通常用來記錄某個客戶端訪問某服務的資訊


這些規則如果寫入到/etc/hosts.allow表示允許訪問的意思;寫在/etc/hosts.deny中的表示拒絕訪問的意思。預設策略為允許訪問。


例項一:僅允許sshd這個服務被192.168.108.251訪問,並將訪問的資訊記錄下來

解決方法:

#vim /etc/hosts.allow

sshd: 192.168.108.251: spawn echo "%c want to access to %s,`date`" >> /var/log/tcp_wrappers.log


在編輯/etc/hosts.deny

#vim /etc/hosts.deny

sshd:ALL


###當192,168.108.251使用sshd服務時,日誌資訊如下:

[[email protected] ~]# tail /var/log/tcp_wrappers.log

192.168.108.15 want to access [email protected] ,Wed Nov 5 07:24:43 CST 2014


例項二:除了192.168.108.251不使用telnet服務外,其他主機都可以訪問

解決方法:

#vim /etc/hosts.allow

in.telnetd: EXCEPT 192.168.108.251: spawn echo "%h want to access to %p ,`date`"


#vim /etc/hosts.deny

in.telnetd: ALL


在這裡注意的是這裡的服務名稱是該服務的二進位制檔名稱,telnet-server的二進位制可執行檔案為/usr/sbin/in.telnetd,因此這裡的服務名稱為in.telnetd

在這裡還要說明一點:in.telnetd這個服務是瞬時守護程序,瞬時守護程序是由超級守護程序(xinetd)代為管理的,由於超級守護程序接受TCP Wrappers的控制,因此瞬時守護程序也接受TCP Wrappers的控制。


在這裡介紹幾個TCP Wrappers中的巨集變數:

%c和%h:顯示客戶端的ip地址

%s:顯示服務名稱和ip,以[email protected]的形式顯示

%p:顯示daemon的PID


更多的TCP Wrappers巨集變數可以使用如下命令檢視:

#man 5 hosts_access


轉載於:https://blog.51cto.com/xslwahaha/1571793