tcp wrapper
iptables/netfilter在定义访问控制的时候是相当麻烦的:要写很多的匹配条件,要指定跳转目标等等,下面介绍一种简单的方法--tcp wrapper,也是一种网络资源访问控制器,它工作在网络层,只对tcp相关服务控制,通过它,管理员实现了对inetd提供的各种服务进行监控和过滤。可以使用ldd命令查看一二应用程序是否受tcp wrapper的控制:ldd “which app” | grep libwrap app为程序名字。或者将libwrap的库文编译进应用程序中,那么次应用程序也将受tcp wrapper的控制,这种方法叫静态编译,用命令#string `which app` | grep hosts 查看程序是否受tcp wrapper的控制。tcp wrapper实现对应用程序的控制基于两个文件--/etc/hosts.allow和/etc/hosts.deny
Linux系统中的程序分为两类:standalone和transient.standalone叫独立守护进程,进程自我管理;transient是非独立守护进程,依赖于xinetd进行管理。xinetd是超级守护进程,它接受tcp wrapper的控制,所以凡是依赖于xinetd管理的进程都接受tcp wrapper的控制。
当一个服务受tcp wrapper控制时,tcp wrapper先检查/etc/hosts.allow文件,如果服务定义为allow则通过,如果没有定义,则检查/etc/hosts.deny文件,如果服务被定义为deny则拒绝,如果这两个文件都没有定义则默认通过。这两个文件的语法格式为:
daemon_list: client_list [:options]
#daemon_list进程列表(服务的可执行程序的二进制文件名字)
client_list客户端列表
daemon_list:
sshd:
vsftpd,sshd,in.telnetd(服务的可执行程序的二进制文件名字)
ALL(宏)
daemon@host
vsftpd@IP 只允许此地址接受控制
client_list:
IP
network address
netword/mask 只接受长度格式
HOSTNAME
fqdn
MACRO (宏)
ALL
LOCAL,KNOWN(主机名可以解析),UNKNOWN(无法解析),PARANOID(主机名正向解析和反向解析不匹配)
EXCEPT(除了,不包含)
例子:设定telnet服务不允许172.16.0.0/16访问,但允许172.16.100.200访问;其它客户端不做控制。
方法1:
先编辑/etc/hosts.allow
in.telnetd:172.16.100.200
在编辑/etc/hosts.deny
in.telnetd:172.16.
方法2:
编辑/etc/hosts.deny
in.telnetd:172.16. EXCEPT 172.16.100.200
方法3:
编辑/etc/hosts.allow
in.telnetd: ALL EXCETP 172.16. EXCEPT 172.16.100.200
在编辑/etc/hosts.deny
in.telnetd:ALL
tcp wrapper 中的宏macro:(可以通过man 5 hosts_access来获取)
%c: client information(user@host)
%s: service info (server@host)
%h: client hostname
%p: server PID
tcp wrapper具有日志功能:
在编辑allow和deny文件时追加:spawn。例如在上面的例子中:
in.telnetd:172.16. EXCEPT 172.16.100.200 :spawn echo"`date`,login attempt from %c to %s." >> /var/log/tcpwrapper.log
通过tellnet访问后就可以查看/var/log/tcpwrapper.log中的信息知道谁试图访问谁
xinetd
上面提到了xinetd超级守护进程,通过定义xinetd也可以实现访问控制。
xinetd的主配置文件: /etc/xinetd.conf
而xinetd控制许多非独立守护进程,这些非独立守护进程片段的配置文件位于/etc/xinetd.d/*中
主配置文件/etc/xinetd.conf有两部分组成:
1.全局配置 (服务的默认配置)
2.服务配置。服务配置的格式如下:
service <service_name>
{
<attribute> <assign_op> <value>...
...
}
在非独立守护进程/etc/xinetd.d/*中可以定义很多属性,定义时服务的名字必须和*所对应的名字相同例如:
访问控制:
only_from =
IP:
NETWORK:
HOSTNAME: FQDN
DOAMIN:
no_access =
IP:
NETWORK:
HOSTNAME: FQDN
DOAMIN:
时间控制:
access_times = hh:mm-hh:mm
hh: 0-23
mm: 0-59
监听的地址(提供服务的地址):
bind =
interface =
资源访问控制:用于控制每秒钟入站连接的个数
cps =
两个参数:
每秒入站连接数的个数
临时禁用的时长
一个IP地址(客户端)最多发起几个链接请求
per_source =
用于定义此服务最多允许多少用户链接进来
instances =
向启动的server传递参数:
server_args =
欢迎标语:
banner =
端口:
port =