tcp_wrapper過濾

1.1 wrap簡介

wrap工做在內核空間和應用程序中間的庫層次中。在內核接受到數據包準備傳送到用戶空間時都會通過庫層次,對於部分(只是部分)應用程序會在通過庫層次時會被wrap庫文件阻擋下來檢查一番,若是容許經過則交給應用程序。apache

1.2 查看是否支持wrapper

wrap只會檢查tcp數據包,因此稱爲tcpwrapper。但還不是檢查全部類型的tcp數據包,例如httpd就不支持。是否支持,能夠經過查看應用程序是否依賴於libwrap.so庫文件。(路徑/lib64/libwrap.so)bash

[root@mail ~]# ldd $(which sshd) | grep wrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f110efb7000)
[root@mail ~]# ldd  $(which vsftpd) | grep wrap    
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1e73185000)
[root@mail ~]# ldd  $(which httpd) | grep wrap

說明sshd和vsftpd都支持wrap機制,而apache的httpd不支持。app

固然上面grep不出結果只能說明不支持這樣的動態連接的方式,有些應用程序可能靜態編譯進程序中了,如舊版本的rpc應用程序portmap。ssh

是否將wrap功能靜態編譯到應用程序中,能夠經過如下方式查看。tcp

strings $(which portmap) | grep hosts

若是篩選出的結果中有hosts_access或者/etc/hosts.allow和/etc/hosts.deny這兩個文件,則說明是支持的。後兩個文件正是wrap訪問控制的文件。spa

要注意的是,若是超級守護進程xinetd被wrap控制了,則其下的瞬時守護進程都受wrap控制。code

1.3 配置文件格式

hosts.allow和hosts.deny兩個文件的語法格式是同樣的,以下:blog

daemon_list:   client_list  [:options]進程

【"daemon_list:"的表示方法】:程序名必須是which查出來同名的名稱,例如此處的in.telnetdip

sshd:
sshd,vsftpd,in.telnetd:
ALL
daemon@host:

最後一項daemon@host指定鏈接IP地址,針對多個IP的狀況。如本機有192.168.100.8和172.16.100.1兩個地址,可是隻想控制從其中一個ip鏈接的vsftpd服務,能夠寫"vsftpd@192.168.100.8:"。

【"client_list"的表示方法】

單IP:192.168.100.8
網段:兩種寫法:"172.16."和10.0.0.0/255.0.0.0
主機名或域匹配:fqdn或".a.com"
宏:ALL、KNOWN、UNKNOWN、PARANOID、EXCEPT

ALL表示全部主機;LOCAL表示和主機在同一網段的主機;(UN)KNOWN表示DNS是否能夠解析成功的;PARANOID表示正解反解不匹配的;EXCEPT表示「除了」。

它們的語法能夠man hosts_access。

tcpwrapper的檢查順序:hosts.allow --> hosts.deny --> 容許(默認規則)

例如sshd僅容許172.16網段主機訪問。

hosts.allow:
sshd: 172.16.
hosts.deny:
sshd: ALL

telnet服務不容許172.16網段訪問但容許172.16.100.200訪問。有幾種表達方式:

表達方式一:

hosts.allow:
in.telnetd: 172.16.100.200
hosts.deny:
in.telnetd: 172.16.

表達方式二:

hosts.deny:
    in.telnetd: 172.16. EXCEPT 172.16.100.200

此法不能寫入hosts.allow:"in.telnetd: 172.16.100.200 EXCEPT 172.16."

表達方式三:

hosts.allow:
    in.telnetd: ALL EXCEPT 172.16. EXCEPT 172.16.100.200
hosts.deny:
    in.telnetd: ALL

EXCEPT的最形象描述是「在其前面的範圍內挖一個洞,在洞範圍內的都不匹配」。因此hosts.allow中,ALL內有一個172.16的洞是不被allow的,在172.16中又有小洞172.16.100.200是被排除在172.16洞外的,因此172.16.100.200是被allow的。

注意:被EXCEPT匹配到的表示不通過此條規則的檢查,而不是反意。例如在allows中指明一個EXCEPT,當有except中的主機被匹配到,表示的不是該主機被拒絕。而是跳過allow檢測進入deny的檢測。

【:options的表達方式】

:ALLOW
:DENY
:spawn

ALLOW和DENY能夠分別寫入deny文件和allow文件,表示在allow文件中拒絕在deny文件中接受。如allow文件中:

in.telnetd: 172.16. :DENY

spawn表示啓動某程序的意思(/etc/inittab中的respawn表示重啓指定程序)。例如啓動一個echo程序。

in.telnetd: 172.16 :spawn echo "we are good $(date) >> /var/log/telnetd.log"
相關文章
相關標籤/搜索