一、tcp wrapper
tcp wrapper是一种访问控制工具,类似于iptables可以作访问控制。
tcp wrapper只能对基于tcp协议的服务作访问控制,但并不是所有基于tcp协议的服务都能实现用tcp wraper作访问控制。
1.tcp wrapper实现访问控制主要依靠两个文件,一个是/etc.hosts.allow文件,另一个是/etc/hosts.deny文件.从文件的名字上可以理解:一个是定义允许的,一个是定义拒绝的。那这两个文件生效的次序是怎样的呢?
说明:如图所示,N表示没有匹配的规则,Y表示有匹配的规则,OK表示允许访问,DENY表示拒绝访问。
首先检查hosts.allow文件中是否有匹配的规则。如果有匹配的规则,则允许访问;如果没有匹配的规则,则检查hosts.deny文件。
其次,检查hosts.deny文件中是否有匹配的规则。如果有匹配的规则,则拒绝访问;如果没有匹配的规则,则视为默认规则,默认规则则为允许,所以允许访问。
2.文件内容的书写规则:
Daemon_list:client_list[:options]
Daemon_list 要写的可执行程序的二进制文件名。例ssh的二进制文件名sshd,http的二进制文件名为httpd。
ALL 本机上所有接受tcp wrapper 访问控制的服务
client_list
IP 单独的ip地址 例:172.16.22.1
Network address 不能使用长度格式,只能使用完整长度格式。例:172.16. 172.16.0.1/255.255.0.0 但不能使用172.16.0.1/16
HOSTNAME 主机名 例:www.lihuan.com
[:options] 选项,可有可无
看个例子:
例:ssh仅允许172.16.0.0/16网段访问。
首先在/etc/hosts.allow中定义:
sshd:172.16.
然后在/etc/hosts.deny中定义:
sshd:ALL
即可实现要求了。
3.特殊用法
spaw 记录日志功能
DENY 拒绝
ALLOW 允许
例:ssh允许172.16.0.0/16网段访问。
可在/etc/hosts.deny中这样定义:
sshd:172.16. :ALLOW
例:ssh允许172.16.0.0/16网段访问,记录日志。
可在/etc/hosts.allow中这样定义:
sshd:172.16. :spawn echo ”someone login” >> /var/log/tcpwrapper.log
在spawn中也可带上这几个选项:
%c 客户端信息
%s 服务端信息
%h 客户端主机名
%p 服务端的pid
例:ssh允许172.16.0.0/16网段访问,记录日志。
sshd:172.16. :spawn echo ”someone login attempt from%c to %s” >> /var/log/tcpwrapper.log
二、xinetd
xinetd是超级守护进程,xinetd提供类似于inetd+tcp wrapper的功能,但是更加强大和安全。
进程有独立守护进程和非独立守护进程。
独立守护进程响应速度快,消耗资源大;费独立守护进程响应速度慢,但消耗资源少,需要超级守护进程xinetd进行代理。
支持对tcp、udp、rpc服务
* 基本访问控制
only_from 仅允许 例:only_from = 172.16.22.1 only_from = 172.16.22.1/16
no_access 不允许 例:no_access = 172.16.22.1 no_access = 172.16.22.1/16
备注:两者同时使用,一般谁的匹配范围小谁生效,但不建议同时使用。
* 基于时间段的访问控制
access_times 例:access_times = 10:00-16:00
* 基于资源的访问控制
cps 能限制每秒钟客户端能启动服务的个数(带两个参数:每秒连接数的最大值;超出最大连接数后临时禁用的时长) 例:cps = 50 5
per_source 能限制每个客户端能启动的最大服务器数目 例:per_source = 20
instances 能限制客户端能启动的最大服务器数目总数 例:instances = 200
* 功能完备的log功能,即可以记录连接成功也可以记录连接失败的行为
type_log type_log=FILE /var/log/ftp.log
* 将某个服务绑定在特定的系统接口上,从而能实现只允许私有网络访问某项服务
bind 例:bind = 172.16.22.1
这些访问控制规则在哪儿写呢?当然会有一个文件专门保存这些规则的:/etc/xinetd.conf
只要把规则写进这个文件就会生效!
service daytime { socket_type = stream protocol = tcp wait = no user = nobody server = /usr/sbin/in.date instances = 1 nice = 10 only_from = 0.0.0.0
}
defaults { log_type = FILE /var/log/servicelog log_on_success = PID log_on_failure = HOST RECORD only_from = 128.138.193.0 128.138.204.0 only_from = 128.138.252.1 instances = 10 disabled = rstatd }
看看上面这2个例子,相信你应该懂得什么意思了!