一、Tcp_wrapper简介
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 
Tcp_wrapper Wietse Venema开发的一个免费软件。Tcp_wrapper的诞生有个小小的故事,大约1990年,作者所在大学的服务器屡屡受到一个外来***侵入,因为受害主机的硬盘数据屡次被rm -rf/命令整个抹掉,所以找寻线索极为困难,直到有一天晚上作者在工作的过程中无意中发现这个***在不断的finger 受害主机、偷窥受害者的工作。于是,一个想法诞生了:设计一个软件,使它可以截获发起finger请求的IP,用户名等资料。Venema很快投入了工作,而Tcp_wrapper也由此诞生!此后,Tcp_wrapper随着广泛的应用逐渐成为一种标准的安全工具。 通过它,管理员实现了对inetd提供的各种服务进行监控和过滤。

Tcp_wrapper 编译安装成功后,会生成一个tcpd程序,它可以在inetd.conf这个控制文件中取代in.telnetd的位置,这样, 每当有telnet的连接请求时,tcpd即会截获请求,先读取管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的in.telnetd程序,由in.telnetd完成后续工作。如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务。 Tcp_wrapper 访问控制的实现是依靠两个文件:hosts.allowhosts.deny来实现的。
如果我们编辑/etc/syslog.conf文件,为Tcp wrapper加入了日志记录功能,即:

 #tcp wrapper loglocal3.info /var/log/tcplog

编辑结束后,保存文件,在/var/log下会生成tcplog文件,注意这个文件的读写属性,应该只对root有读写权限。然后ps -ef | grep syslogd,找出syslogd的进程号,kill -HUP 重启syslogd进程使改动生效。在这里,我们可以预先看一看以后生成的tcplog文件内容,如下:

    Jul 31 22:00:52 [url]www.test.org[/url] in.telnetd[4365]: connect from 10.68.32.1

Jul 31 22:02:10 [url]www.test.org[/url] in.telnetd[4389]: connect from 10.68.32.5

Jul 31 22:04:58 [url]www.test.org[/url] in.ftpd[4429]: connect from 10.68.32.3

Aug 2 02:11:07 [url]www.test.org[/url] in.rshd[13660]: connect from 10.68.32.5

Aug 2 02:11:07 [url]www.test.org[/url] in.rlogind[13659]: connect from 10.68.32.1

从上面我们可以看到,在安装了Tcp_wrapper的主机上,系统的每一次连接,Tcp_wrapper都做了记录,它的内容包括时间、服务、状态、ip等,对***这有很大的参考价值,不过,一定要记得清除日志了。

 

二、inetd服务介绍

 
最重要的网络服务进程,即inetd服务器程序,实际上,大部分请求不太频繁的服务都是由它启动的。

inetd 程序在系统中是作为一个服务进程出现,它监听许多端口并且在得到客户请求时启动这个端口的服务程序。inetd程序可以由命令行来启动:inetd [-d]   -d选项用于打开调试信息。

    inetd 的工作方式是由/etc/inetd.conf/etc/services文件设定的,下面我们来解释一下这两个文件。

services 文件的格式基本上是这样:

   netstat 15/tcp

qotd 17/tcpquote

msp 18/tcp# message send protocol

msp 18/udp# message send protocol

chargen19/tcpttytst source

chargen19/udpttytst source

ftp21/tcp

# 22 - unassigned

telnet23/tcp

每一行都是两栏或者三栏,第一栏是服务的名字,第二行是使用的端口和协议,例如这里的telnet 23/tcp是表示telnet服务应该使用端口23,协议类型为tcp。第三栏是服务的别名,通常可以省略。

inetd.conf 是依赖于services文件的 ,它也是个文本文件,每行代表一种服务的工作方式,由"#"引导的行表示注释行,非注释行的格式大体是这样:

服务名  数据类型  协议  监听方式  用户身份  服务程序  参数

例如,要启动telnet的服务,应该加入这样一行:

telnet  stream  tcp  nowait  root  /usr/sbin/tcpd  in.telnetd

服务的名字就是telnet,这个名字按照/etc/services的定义将在23号端口提供服务;stream表示数据的发送和接收将使用简单的流式文件读写来完成(fscanffprintf);tcp表示使用tcp协议,监听方式这一栏可以由两个选项,即waitnowait。简单地说,如果相应的服务程序是多进程的,那么要设置为nowait,这时inetd会每接受到一个请求之后启动一个服务程序进程,例如telnet就是这样工作的,每个独立的telnet对话都会启动一个telnet服务进程。相反,如果是单进程的,就可以设置为wait

用户身份表示对应服务进程启动时所使用的uid/euid,因为telnet可以是任何用户发出,而且用户可以通过telnet执行任何命令,所以使用root用户身份。 /usr/sbin/tcpd 是实际启动的程序,这个程序实际是一个通用的TCP连接处理程序,参数使用in.telnetd,连起来就是当有23端口的连接请求时,inetd去执行/usr/sbin/tcpd in.telnetd

通常情况下,各种服务都已经写在inetd.conf中,不启用的服务使用注释#使之失效。如果需要打开这服务,只要把引导的#注释符号删除就可以了。 值得一提的是/usr/sbin/tcpd程序,它是一个TCP连接过滤程序,通常大部分需要做连接验证的服务都应该通过tcpd程序启动,这个程序能够自动对客户机器的IP地址进行验证并且进行某些安全性过滤,其中最主要的功能是禁止某些地址来的连接。 例如,按照

上面的形式,in.telnetd程序就是通过/usr/sbin/tcpd程序启动的,因此可以对telnet请求进行地址检验。

tcpd 的地址检验是通过/etc/hosts.deny/etc/hosts.allow文件完成的,如果不存在这样的文件,你可以自己建立一个,两者的语法几乎是一样的,只是hosts.allow是允许某个地址来的连接,而hosts.deny是禁止某个地方来的连接。基本的语法是:服务程序:客户地址(域名或主机名)

服务程序 是指通过tcpd程序被启动的程序名字, 客户地址 是相关地址的一个列表,例如,/etc/hosts.allow文件中加入这样一行:in.telnetd:<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />10.0.0.2  。将允许10.0.0.2处的机器使用本地的telnet服务,如果这一行加入到/etc/hosts.deny重将禁止10.0.0.2处的机器登录上来。

地址可以使用集合形式,常用的 集合形式 主要有下列几种:

以逗点开头的字符串定义一个域,例如.edu.cn表示所有域名后缀是.edu.cn的机器。

以逗点结束的字符串定义一串IP地址,如202.199.248.代表202.199.248.0202.199.248.255

/分开的字符串解释为网络地址/子网掩码的形式,例如172.13.0.0/255.255.0.0代表172.13.0.0172.13.255.255

另外,地址和服务程序都可以使用通配符,通配符有下列几种:

ALL 代表所有,所有的服务程序或者所有的地址。经常和EXCEPT子句连用,EXCEPT代表除了。例如,在hosts.deny中写上ALL:ALL EXCEPT 202.199.248.将禁止除了202.199.248.*的机器之外的所有客户机器使用任何基于tcpd的服务。写上ALL EXPECT in.telnetd:ALL将使得除了telnet以外的所有基于tcpd的服务都被禁止。

LOCAL 指代所有没有名字后缀的机器。

KNOWN 所有IP地址和域名都知道的机器

UNKNOWN IP 地址或者域名无法确定的机器

PARANOID IP 地址和从域名服务返回的名字不匹配的机器。