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” >> /var/log/tcpwrapper.log
in.telnetd: ALL :SPAWN echo “`date` Login attempt from %h” >> /var/log/tcpwrapper.log
本文轉自 chaijowin 51CTO部落格,原文連結:http://blog.51cto.com/jowin/1710045,如需轉載請自行聯系原作者