天天看點

Linux運維 第三階段 (十二)tcp wrapper

tcp wrapper

tcp wrapper(工作在TCP層的通路控制工具,通常隻對TCP協定的應用做控制,它本身隻是個庫檔案libwrap.so(由glibc提供))

當來自用戶端的請求通路本機服務時,請求先到達本機網卡,再到核心TCP/IP協定棧,路由發現是通路本機的,轉至使用者空間服務所監聽的套接字上,服務響應送至核心TCP/IP協定棧,再通過路由經網卡傳回至用戶端;有了tcp wrapper後,在這過程當中附加了一層通路控制機制,由tcp wrapper檢查使用者通路的請求是否允許,若允許則交至使用者空間服務,否則在tcp wrapper上就拒絕無法到達使用者空間服務,可了解為tcp wrapper工作在使用者請求和服務所監聽的套接字之間的一種檢查過濾機制,可實作攔截對某種特定服務的通路請求,根據事先定義的規則決定是否允許通路指定服務

某一應用程式在開發時,開發者在程式裡提供一個調用接口,進而能夠調用libwrap.so這個庫的話,那這個程式就受tcp wrapper通路控制,否則不受其控制

#ldd `which  sshd`  | grep  libwrap(print sharedlibrary dependencies,檢查某一程式是否受tcp wrapper控制,檢視是否有libwrap.so.0這個動态連結庫檔案)

libwrap.so.0 => /lib/libwrap.so.0(0x00c7a000)

注:編譯某一程式時,可以将某些庫檔案直接編譯程序式當中去(靜态編譯,靜态連結),但這樣會使得程式體積過于龐大,是以很多應用程式通常都是動态連結

#ldd `which  xinetd`  | grep  libwrap

#ldd `which  portmap`  | grep  libwrap(雖沒查到,但它受tcpwrapper控制,因為它已将libwrap.so庫檔案靜态編譯程序式portmap裡了)

#strings $(ldd  `which  portmap`) | grep  hosts

/etc/hosts.allow,/etc/hosts.deny(這兩個檔案至關重要,tcpwrapper就是根據這兩個檔案來定義某些特定服務能被哪些主機通路控制的)

檢查順序:先查/etc/hosts.allow,若有比對則通過OK;若無比對,則查/etc/hosts.deny,有比對則禁止通路設定的服務,若仍無比對則按預設法則通過allow

<a href="http://s3.51cto.com/wyfs02/M01/75/84/wKiom1Y7CAagdLjcAABPV3zmMZg915.jpg" target="_blank"></a>

檔案文法格式:

daemon_list:  client_list[:options]

daemon@host:  client_list

daemon_list舉例:

sshd: 192.168.0.(daemon_list是可執行程式的名字,如sshd,vsftpd,in.telnetd,是#rpm  -ql telnet-server查詢到的/usr/sbin/in.telnetd)

ALL: 192.168.0.(ALL是宏,表示tcp wrapper所有接受控制的服務)

client_list舉例:

IP

NETWORK ADDRESS(NETWORK/MASK,注意MASK不能寫成完整長度格式,如1.0.0.0/255.0.0.0;隻能用短格式,簡寫如1.0.0.0/8)

HOSTNAME(FQDN、.magedu.com注意前面的點不能少表示是magedu.com這個域)

MACRO(宏,ALL表示所有,LOCAL表示與本地主機在同一網段的主機,KNOWS表示主機名可正常解析,UNKNOWN表示主機名不能解析,PARANOID表示正反向解析無法比對)

#whatis hosts_access

#man 5  hosts_access(檢視支援的宏)

%c(client information,格式user@host,user@address)

%s(server information,格式daemon@host,daemon@address)

%h(client hostname)

%H(server hostname)

%p(The daemon processid)

舉例:sshd僅允許172.16.0.0/16通路

#vim /etc/hosts.allow

sshd: 172.16.

#vim /etc/hosts.deny

sshd: ALL

舉例:telnet服務不允許172.16.0.0/16通路,但允許172.16.100.200通路,其它用戶端不作控制

方法一:

in.telnetd: 172.16.100.200

in.telnetd: 172.16.

方法二:

in.telnetd: 172.16.  EXCEPT  172.16.100.200

方法三:

in.telnetd: ALL  EXCEPT  172.16. EXCEPT  172.16.100.200

in.telnetd: ALL

舉例:client_list[:options]

in.telnetd: 172.16.  :DENY(禁止172.16.0.0/16通路telnet,在allow檔案中寫:DENY,也可在deny檔案中寫:ALLOW)

in.telnetd: 172.16.  :SPAWN  echo  “`date`Login attempt from %c to %s” &gt;&gt;  /var/log/tcpwrapper.log

in.telnetd: ALL  :SPAWN  echo  “`date`  Login attempt from %h”  &gt;&gt; /var/log/tcpwrapper.log

本文轉自 chaijowin 51CTO部落格,原文連結:http://blog.51cto.com/jowin/1710045,如需轉載請自行聯系原作者