TCP_Wrappers 簡介

 

TCP_Wrappers

 


 

簡介

TCP_Wrappers是一個工作在第四層(傳輸層)的的安全工具,對有狀態連接的特定服務進行安全檢測並實現訪問控制,凡是包含有libwrap.so庫文件的的程序就可以受TCP_Wrappers的安全控制。它的主要功能就是控制誰可以訪問,常見的程序有rpcbind、vsftpd、sshd,telnet。

 

工作原理

TCP_Wrappers有一個TCP的守護進程叫作tcpd。以ssh爲例,每當有ssh的連接請求時,tcpd即會截獲請求,先讀取系統管理員所設置的訪問控制文件,符合要求,則會把這次連接原封不動的轉給真正的ssh進程,由ssh完成後續工作;如果這次連接發起的ip不符合訪問控制文件中的設置,則會中斷連接請求,拒絕提供ssh服務。

 

TCP_Wrappers的使用

TCP_Wrappers的使用主要是依靠兩個配置文件/etc/hosts.allow, /etc/hosts.deny,用於拒絕和接受具有TCP_Wrappers控制全的程序,詳細信息具體可以查看man幫助,這裏我們就做簡單的演示和使用(man 5 hosts_access, man 5 hosts_options)

要說明的是當我們啓動一個受控制的軟件的時候,比如ssh,

不過在剛開始的時候,/etc/hosts.allow,/etc/hosts.deny什麼都沒有添加,此時沒有限制,是都可以連接的,現在我們來說如何設置,禁止和允許連接,配置文件格式遵循如下規則:

daemon_list@host: client_list [:options :option…]

daemon_list: 是程序的列表,可以是多個,是多個時,使用隔開
@host:可以沒有,是我們的限制的網卡訪問接口(自己的),設置允許或禁止他人從自己的那個網口進入。這一項不寫,就代表全部。
client_list:是訪問者的地址,如果需要控制的用戶較多,可以使用空格或,隔開,格式如下:

  • 基於IP地址: 192.168.10.1 192.168.1.
  • 基於主機名: www.magedu.com .magedu.com 較少用
  • 基於網絡/掩碼: 192.168.0.0/255.255.255.0
  • 基於net/prefixlen: 192.168.1.0/24(CentOS7)
  • 基於網絡組(NIS 域): @mynetwork
  • 內置ACL: ALL, LOCAL, KNOWN, UNKNOWN,PARANOID
    ALL:所有主機
    LOCAL:本地主機
    KNOWN:主機名可解析成ip的
    UNKNOWN:主機名無法解析成IP的
    PARANOID:正向解析與反向解析不對應的主機

 

我以三臺虛擬機作爲示例:
centOS 7:192.168.111.120
centOS 6:192.168.111.110
centOS 5:192.168.111.130

示例1
現在,我的centOS 6想拒絕centOS 7 的ssh訪問:
我在hosts.deny中寫:

sshd@192.168.111.110:192.168.111.120

然後我使用centOS 7 連接,就無法連接:

[root@CT73 ~]$ssh 192.168.111.110
ssh_exchange_identification: read:Connection reset by peer

示例2
或者我們還可以這樣寫(hosts.deny):

in.telnetd,sshd: ALL

這就意味着我們使用ssh,或者telnetd訪問這個機器都是無法訪問的,然後,我們就在hosts.allow中添加如下一行:

sshd:192.168.111.120

出現了下面的效果:

[root@CT73 ~]$ssh 192.168.111.110
root@192.168.111.110's password:
Last login: Thu Sep 28 14:51:57 2017 from 192.168.111.120
[root@CT691 ~]#

我們就可以連接了,我們想要訪問其他主機的資源,在連接過程中,對方的機器會按照順序先檢查/etc/hosts.allow,再檢查/etc/hosts.deny。如果在allow中允許連接,就可以連接的上,即便是又在deny中添加了限制也沒效果,但是在allow中沒有添加你的機器,但是在deny中設置了你的主機無法連接,那你是無法連接上對方的主機的。

示例3
我們還可以禁止後允許某個網段進行連接,以禁止爲例:

in.telnetd,sshd@192.168.111.110:192.168.37.

這樣的話192.168.37.網段的所有機器都無法通過這連個程序訪問到我的機器。

示例4
現在,我們使用一個關聯詞,EXCEPT,host.deny文件配置如下:

in.telnetd,sshd: ALL

hosts.allow文件配置如下:

sshd:192.168.111. EXCEPT 192.168.111.120

此時,centOS 7 能否訪問centOS 6呢:

[root@CT73 ~]$ssh 192.168.111.110
ssh_exchange_identification: read:Connection reset by peer

實驗證明,我們是無法連接的,這是由於,雖然我們在hosts.allow文件中設置了整個192.168.111.這個網段都可以訪問,但是使用EXCEPT關鍵字將192.168.111.120排除, 所以我們還是不能連接。
然後,我們重寫一下hosts.allow文件:

sshd:192.168.111. EXCEPT 192.168.111.

然後,我們使用centOS 5和centOS 7連接:

[root@CT511 ~]#ssh 192.168.111.110
ssh_exchange_identification:Connection closed by remote host
[root@CT73 ~]#ssh 192.168.111.110
ssh_exchange_identification:Connection closed by remote host

 

一些選項

上面還有 [ :options :option… ]選項,我們我們看看他們是咋用的
(更多使用方法查看 man 5 hosts_options)

  • deny 主要用在/etc/hosts.allow定義“拒絕”規則
    如: vsftpd: 172.16. :deny
  • allow 主要用在/etc/hosts.deny定義“允許” 規則
    如: vsftpd:172.16. :allow
  • spawn 啓動一個外部程序完成執行的操作
  • twist 實際動作是拒絕訪問,使用指定的操作替換當前服務,標準I/O和ERROR發送到客戶端,默認至/dev/null

示例1
在hosts.allow拒絕連接:

sshd:192.168.111.120:deny

這樣,雖然我們雖然在allow文件中添加可用規則,但是我們使用了:deny,生生的還是將該地址給拒絕了:

[root@CT73 ~]$ssh 192.168.111.110
ssh_exchange_identification: read:Connection reset by peer

實例2
在hosts.deny拒絕連接:

sshd:192.168.111.120:allow

這樣,雖然我們雖然在deny文件中添加不可用規則,但是我們使用了:allow,依舊允許該IP連接:

[root@CT73 ~]$ssh 192.168.111.110
root@192.168.111.110's password:
Last login: Thu Sep 28 15:44:27 2017 from 192.168.111.130
[root@CT691 ~]#

實例3
我們可以使用spawn啓用外部命令,那麼我們就能使用外部命令寫日誌文件:
在hosts.allow中:

sshd,in.telnetd:192.168.111.:spawn echo "`date +'%%F %%T'` login from client\: %c to %d">>/var/log/tcpwrap.log

我們在使用centOS 7 訪問後,看一下日誌:

[root@CT691 ~]#tail /var/log/tcpwrap.log
2017-09-2816:27:28 login from client:192.168.111.120 to sshd

在/etc/hosts.allow中添加,允許登錄,並記錄日誌
在/etc/hosts.deny中添加,拒絕登錄, 並記錄日誌
%c 客戶端信息
%s 服務器端信息
%d 服務名
%p 守護進程的PID
%% 代表%
: 符號轉譯

實例4
我們可以使用twist拒絕用戶訪問,並返回一個信息:

sshd,in.telnetd:192.168.111.:twist echo "Hello I am T_T !"

然後我們進行連接,使用調試模式,因爲默認ssh是看不到返回信息的,telnet可以:

 

最後我們再說一個調試工具:
tcpdmatch  [-d]  daemon[@host]  client
-d 測試當前目錄下的 hosts.allow和hosts.deny

這樣,在別人沒有連接的時候,我們就可以知道我們設置的那些IP是否可以連接我們的主機:
(hosts.deny)

sshd:192.168.111.120
 
[root@CT691 ~]#tcpdmatch -d ssh 192.168.111.120
client: address 192.168.111.120
server: process ssh
access: granted
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章