天天看点

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,如需转载请自行联系原作者