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
文件语法格式:
daemon_list: client_list[:options]
[email protected]: 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所有接受控制的服务)
[email protected]: 1.(表示在192.168.0.11主机上的vsftpd服务,仅允许1.0.0.0网段的主机访问
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,格式[email protected],[email protected])
%s(server information,格式[email protected],[email protected])
%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访问,其它客户端不作控制
方法一:
#vim /etc/hosts.allow
in.telnetd: 172.16.100.200
#vim /etc/hosts.deny
in.telnetd: 172.16.
方法二:
#vim /etc/hosts.deny
in.telnetd: 172.16. EXCEPT 172.16.100.200
方法三:
#vim /etc/hosts.allow
in.telnetd: ALL EXCEPT 172.16. EXCEPT 172.16.100.200
#vim /etc/hosts.deny
in.telnetd: ALL
举例:client_list[:options]
#vim /etc/hosts.allow
in.telnetd: 172.16. :DENY(禁止172.16.0.0/16访问telnet,在allow文件中写:DENY,也可在deny文件中写:ALLOW)
#vim /etc/hosts.allow
in.telnetd: 172.16. :SPAWN echo “`date`Login attempt from %c to %s” >> /var/log/tcpwrapper.log
#vim /etc/hosts.deny
in.telnetd: ALL :SPAWN echo “`date` Login attempt from %h” >> /var/log/tcpwrapper.log
以上是学习《马哥运维课程》做的笔记。