TCP wrapper : Transmission Control Protocol Wrapper是Wietse Venema开发的基于TCP/IP协议之上,运行在Unix/Linux系统上通过分析TCP数据包头部的信息实现访问控制的软件,编译安装tcp wrapper后会生成一个tcpd程序,它可以在inetd.conf这个控制文件中取代in.telnetd的位置,这样,每当有telnet的连接请求时,tcpd即会截获,先读取管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的in.telnetd程序,由in.telnetd完成以后的工作.如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务.除in.telnetd以外,tcpd还可以替代其它各种tcp服务。

用户可以通过下面的两种方式得知某服务是否支持tcp_wrapper:

  1. ldd `which application` |  grep  libwrap
  2. strings `which  application` | grep  [tcp_wrappers|hosts_access]
   
   
   
   
  1. example: 
  2.  
  3. ldd `which xinetd` | grep libwrap  
  4.     libwrap.so.0 => /lib/libwrap.so.0 (0x00dd7000) 
  5.  
  6. strings `which portmap` | grep hosts  
  7. hosts_access_verbose  
  8. hosts_allow_table  
  9. hosts_deny_table  
  10. /etc/hosts.allow  
  11. /etc/hosts.deny 

tcp_wrapper通过/etc/hosts.allow和/etc/hosts.deny这两个配置文件实现访问控制,文件修改并保存后立即生效,匹配规则如下:

1. tcpd首先查找/etc/hosts.allow 和/etc/hosts.deny,若没有这两个配置文件或这两个配置文件均为空,则匹配默认规则,既是允许所有的访问

2. /etc/hosts.allow 和/etc/hosts.deny这两个配置文件存在,tcpd先读取/etc/hosts.allow,若匹配成功则执行允许或禁止操作,tcpd查询过程中一旦匹配成功就会终止查询,否则就去读取/etc/hosts.deny,若匹配成功就结束查询,否则匹配默认规则,允许所有访问。

/etc/hosts.{allow | deny}的格式:

daemon_list : client_list   [ :  options  ]

daemon_list  ####用逗号隔开服务列表

    ALL   ###表示所有服务

Clinet_list  ####用逗号隔开主机

    IP      ###ip地址

    HOST  ###主机名如:www.urchin.org

    Domain ### .urchin.org

    Network address ### 172.16.

    Network/mask ###不能使用长格式,必须是1.0.0.0/255.0.0.0

    MACRO

       ALL   ###表示所有主机

       LOCAL ###所有主机名中不包含.的主机

       KNOWN ##主机名能正常解析

       UNKOWN ###主机名不能解析

       PARANOID ####主机名正向和反向解析不匹配

       EXCEPT #### 除了,不包含

options

   deny  ## 拒绝被请求的服务,该选项必须出现在规则的结尾

   spawn  shell_command ### 以子进程执行shell命令

   twist  shell_command  ## 执行shell命令,而不是被请求的服务

tcp wrapper macro:

%c:以user@host格式显示客户端的信息

%s:以server@host格式显示客户端的信息

%h:显示客户端主机名

%p:服务的PID

   
   
   
   
  1. # man 5  hosts_access ##查看更多的macro宏 

example:telnet服务不允许192.168.11.0/24访问,但允许192.168.11.8访问,其他客户端不做控制

方法一:

1. 安装telnet-server并启动服务

   
   
   
   
  1. yum  -y  install  telnet-server 
  2.  
  3. chkconfig telnet on 
  4.  
  5. service xinetd start #成功启动telnet须关闭iptables和selinux

2. 编辑/etc/hosts.allow和/etc/hosts.deny

   
   
   
   
  1. vim /etc/hosts.allow  ##添加如下内容: 
  2.  
  3. in.telnetd: 192.168.11.8 
  4.  
  5. vim /etc/hosts.deny  ##添加如下内容: 
  6.  
  7. in.telnetd:  192.168.11. 

方法二:

   
   
   
   
  1. vim /etc/hosts.allow  ##添加如下内容: 
  2.  
  3. in.telnetd: ALL EXCEPT 192.168.11.  EXCEPT 192.168.11.8 

 方法三: 

   
   
   
   
  1. vim /etc/hosts.deny  ##添加如下内容: 
  2.  
  3. in.telnetd:  192.168.11.   EXCEPT  192.168.11.8 

 Xinetd : Extended Internet Deamon

Xinetd 是运行在类UNIX系统之上,基于网络管理网络连接的一种开源网络守护进程服务程序,提供类似于早期inetd + tcp  wrapper的功能,但xinetd提供比inetd更安全的网络守护进程服务。守护进程分为独立守护进程和非独立守护进程,xinetd通过/etc/xinetd.d/下对应的服务来管理相应的非独立守护进程,其工作过程是:当用户请求xinetd管理的非独立守护进程服务(该服务处于关闭状态),xinetd会通知用户所请求的服务的进程,这时用户所请求的服务的进程才启动;这种工作方式在用户请求较少的情况下节约系统资源,但是响应用户请求比独立守护进程慢

xinetd 的特色如下:

  • 支持对tcp、udp、RPC服务
  • 基于时间段设置访问控制
  • 功能更完善的日志功能,可以记录连接成功和连接失败的行为
  • 有效的防止DOS***
  • 限制同类型服务同时运行的数目
  • 限制启动所有服务器的数目
  • 可限制日志的大小
  • 将某个特定的服务绑定在特定的系统接口上,能实现只允许特定有网络访问某项服务
  • 能实现作为其他系统的代理

xinetd 配置文件由两部分组成

  • /etc/xinetd.conf全局配置文件
  • /etc/xinetd.d/目录下服务配置文件

xinetd正是通过/etc/xinetd.conf 和/etc/xinetd.d/下面所有服务配置文件实现访问控制

/etc/xinetd.conf 的格式

   
   
   
   
  1. cat /etc/xinetd.conf 
  2.  
  3. #  
  4. # This is the master xinetd configuration file. Settings in the  
  5. default section will be inherited by all service configurations  
  6. # unless explicitly overridden in the service configuration. See  
  7. # xinetd.conf in the man pages for a more detailed explanation of  
  8. # these attributes. 
  9.  
  10. defaults  
  11. {  
  12. # The next two items are intended to be a quick access place to  
  13. # temporarily enable or disable services.  
  14. #  
  15. #    enabled    =  
  16. #    disabled    =   ##这两行定义是否允许server执行 
  17.  
  18. # Define general logging characteristics.  
  19.     log_type    = SYSLOG daemon info  ##定义日志类型syslog记录到系统 
  20.     log_on_failure    = HOST                 ##登录失败时日志记录的信息 
  21.     log_on_success  = PID HOST DURATION EXIT##登录成功时日志记录的信息 
  22.  
  23.     ##PID是记录进程的ID号 ,HOST记录远程主机的ip地址 ,DURTION记录服务回话的持续时间 ,EXIT 登记进程终止和状态 
  24.  
  25. # Define access restriction defaults  
  26. #  
  27. #    no_access    = ##定义拒绝访问某服务的主机/domain/网络 
  28. #    only_from    =  ##定义允许访问某服务的主机/domain/网络 
  29. #    max_load    = 0  
  30.     cps  = 50 10  ##控制每秒钟入站连接的个数,当连接数>=50,临时禁用服务10s 
  31.     instances  = 50  ##定义某一服务同时可连接的最大个数为50 
  32.     per_source  = 10 ##定义每个IP最多可以发起10连接 
  33.  
  34. # Address and networking defaults  
  35. #  
  36. #    bind        =  ##当server端有多个ip定义把一项服务绑定到一个特定的接口上 
  37. #    mdns      = yes  
  38.       v6only     = no  ##定义是否只允许ipv6访问某服务 
  39.  
  40. # setup environmental attributes  
  41. #  
  42. #  passenv        = ##用空格分开的xinetd环境中的环境变量表,该表在激活时传递给服务程序。设置no就不传送任何变量。该属性支持所有操作符 
  43.     groups          = yes  
  44.     umask           = 002 
  45.  
  46. # Generally, banners are not used. This sets up their global defaults  
  47. #  
  48. #    banner              = ##当建立连接时就将该文件显示给客户机 
  49. #    banner_fail        = ##连接被拒绝,当建立连接时就将该文件显示给客户机 
  50. #    banner_success = ##连接被允许,当建立连接时就将该文件显示给客户机 
  51.  
  52. includedir /etc/xinetd.d  ##把/etc/xinetd.d/下面所有配置文件包含进来 

 /etc/xinetd.d/目录下面个服务的格式

   
   
   
   
  1. service   
  2. {  
  3.               ...  
  4.           ...  
  5. service ##是必须的关键字,并且属性必须用大括号括起来;每一项都定义了由service_name定义的服务。 
  6. assign_op ##操作数,可以使用 ‘=’,  ‘+=’, ‘-=’指定操作数的值 
  7. ## ‘=’表示给操作数赋值;‘+=’表示为操作数添加值;‘-=’表示从操作数减去一个值 
  8. value ##为给定的属性值 

 

Telnet为例了解/etc/xinetd.d/目录下的服务

   
   
   
   
  1. [root@localhost ~]# vim /etc/xinetd.d/telnet  
  2. defaulton ##可以同过chkconfig service_name [on | off] 设置
  3. # description: The telnet server serves telnet sessions; it uses \ 
  4. #       unencrypted username/password pairs for authentication. 
  5. service telnet ##服务名称 
  6.         disable         = no ##设置xinetd是否监控此服务,yes|no分别表示[不监控|监控] 
  7.         flags           = REUSE 
  8.         socket_type     = stream ##服务使用的套接字类型 
  9.         wait            = no ##设置服务是否以单线程的方式运行 
  10.         user            = root ##设置运行此服务的用户 
  11.         server      = /usr/sbin/in.telnetd ##运行此服务可执行程序的完整路径名 
  12.         log_type        = FILE /var/log/xinet.log ##设置日志记录文件,有syslog(记录到系统)和file(记录日志到指定文件)两种 
  13.         instances       = 10 ##设置该服务同时提供服务的个数 
  14.         per_source  = 2 ##设置每个IP的最大连接数 
  15.         only_from   = 172.16. ##设置允许访问该服务的[ip | domain | fqdn | network/mask] 
  16.         no_access   = 172.16.11.3 ##设置不允许访问该服务的[ip | domain | fqdn | network/mask] 当与only_from同时定义时,谁匹配条件精确谁生效 
  17.         bind            = 172.16.11.2 ##把该服务绑定到指定的网络接口上 
  18.         cps         = 2 4 ##设置连接频率,第一个是每秒钟连接的次数,当连接次数>=2时,第二个就会临时禁用该服务4秒钟 
  19.         access_times    = 08:00-18:00 ##设置该服务可以被访问的时间段 
  20.         banner      = /tmp/tesst.txt##设置当建立连接时,无论该连接是否被允许显示的信息,默认显示/etc/issue.net的信息 
  21.         log_on_failure  += USERID ##登录失败,把登录者的ID加记入日志