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:
- example:
- ldd `which xinetd` | grep libwrap
- libwrap.so.0 => /lib/libwrap.so.0 (0x00dd7000)
- strings `which portmap` | grep hosts
- hosts_access_verbose
- hosts_allow_table
- hosts_deny_table
- /etc/hosts.allow
- /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
- # man 5 hosts_access ##查看更多的macro宏
example:telnet服务不允许192.168.11.0/24访问,但允许192.168.11.8访问,其他客户端不做控制
方法一:
1. 安装telnet-server并启动服务
- yum -y install telnet-server
- chkconfig telnet on
- service xinetd start #成功启动telnet须关闭iptables和selinux
2. 编辑/etc/hosts.allow和/etc/hosts.deny
- vim /etc/hosts.allow ##添加如下内容:
- in.telnetd: 192.168.11.8
- vim /etc/hosts.deny ##添加如下内容:
- in.telnetd: 192.168.11.
方法二:
- vim /etc/hosts.allow ##添加如下内容:
- in.telnetd: ALL EXCEPT 192.168.11. EXCEPT 192.168.11.8
方法三:
- vim /etc/hosts.deny ##添加如下内容:
- 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 的特色如下:
xinetd 配置文件由两部分组成
xinetd正是通过/etc/xinetd.conf 和/etc/xinetd.d/下面所有服务配置文件实现访问控制
/etc/xinetd.conf 的格式
- cat /etc/xinetd.conf
- #
- # This is the master xinetd configuration file. Settings in the
- # default section will be inherited by all service configurations
- # unless explicitly overridden in the service configuration. See
- # xinetd.conf in the man pages for a more detailed explanation of
- # these attributes.
- defaults
- {
- # The next two items are intended to be a quick access place to
- # temporarily enable or disable services.
- #
- # enabled =
- # disabled = ##这两行定义是否允许server执行
- # Define general logging characteristics.
- log_type = SYSLOG daemon info ##定义日志类型syslog记录到系统
- log_on_failure = HOST ##登录失败时日志记录的信息
- log_on_success = PID HOST DURATION EXIT##登录成功时日志记录的信息
- ##PID是记录进程的ID号 ,HOST记录远程主机的ip地址 ,DURTION记录服务回话的持续时间 ,EXIT 登记进程终止和状态
- # Define access restriction defaults
- #
- # no_access = ##定义拒绝访问某服务的主机/domain/网络
- # only_from = ##定义允许访问某服务的主机/domain/网络
- # max_load = 0
- cps = 50 10 ##控制每秒钟入站连接的个数,当连接数>=50,临时禁用服务10s
- instances = 50 ##定义某一服务同时可连接的最大个数为50
- per_source = 10 ##定义每个IP最多可以发起10连接
- # Address and networking defaults
- #
- # bind = ##当server端有多个ip定义把一项服务绑定到一个特定的接口上
- # mdns = yes
- v6only = no ##定义是否只允许ipv6访问某服务
- # setup environmental attributes
- #
- # passenv = ##用空格分开的xinetd环境中的环境变量表,该表在激活时传递给服务程序。设置no就不传送任何变量。该属性支持所有操作符
- groups = yes
- umask = 002
- # Generally, banners are not used. This sets up their global defaults
- #
- # banner = ##当建立连接时就将该文件显示给客户机
- # banner_fail = ##连接被拒绝,当建立连接时就将该文件显示给客户机
- # banner_success = ##连接被允许,当建立连接时就将该文件显示给客户机
- }
- includedir /etc/xinetd.d ##把/etc/xinetd.d/下面所有配置文件包含进来
/etc/xinetd.d/目录下面个服务的格式
- service <service_name>
- {
- <attribute> <assign_op> <value> <value> ...
- ...
- }
- service ##是必须的关键字,并且属性必须用大括号括起来;每一项都定义了由service_name定义的服务。
- assign_op ##操作数,可以使用 ‘=’, ‘+=’, ‘-=’指定操作数的值
- ## ‘=’表示给操作数赋值;‘+=’表示为操作数添加值;‘-=’表示从操作数减去一个值
- value ##为给定的属性值
以Telnet为例了解/etc/xinetd.d/目录下的服务
- [root@localhost ~]# vim /etc/xinetd.d/telnet
- # default: on ##可以同过chkconfig service_name [on | off] 设置
- # description: The telnet server serves telnet sessions; it uses \
- # unencrypted username/password pairs for authentication.
- service telnet ##服务名称
- {
- disable = no ##设置xinetd是否监控此服务,yes|no分别表示[不监控|监控]
- flags = REUSE
- socket_type = stream ##服务使用的套接字类型
- wait = no ##设置服务是否以单线程的方式运行
- user = root ##设置运行此服务的用户
- server = /usr/sbin/in.telnetd ##运行此服务可执行程序的完整路径名
- log_type = FILE /var/log/xinet.log ##设置日志记录文件,有syslog(记录到系统)和file(记录日志到指定文件)两种
- instances = 10 ##设置该服务同时提供服务的个数
- per_source = 2 ##设置每个IP的最大连接数
- only_from = 172.16. ##设置允许访问该服务的[ip | domain | fqdn | network/mask]
- no_access = 172.16.11.3 ##设置不允许访问该服务的[ip | domain | fqdn | network/mask] 当与only_from同时定义时,谁匹配条件精确谁生效
- bind = 172.16.11.2 ##把该服务绑定到指定的网络接口上
- cps = 2 4 ##设置连接频率,第一个是每秒钟连接的次数,当连接次数>=2时,第二个就会临时禁用该服务4秒钟
- access_times = 08:00-18:00 ##设置该服务可以被访问的时间段
- banner = /tmp/tesst.txt##设置当建立连接时,无论该连接是否被允许显示的信息,默认显示/etc/issue.net的信息
- log_on_failure += USERID ##登录失败,把登录者的ID加记入日志
- }