ineternet super server,简称inetd被所以的unix-like系统使用,提供许多基本的网络服务.这个章节将介绍这个服务以及/etc中有关的几个配置文件(和它们之间的关系)
1,概览
我们将看看inetd的定义,与之相关的几个文件(注意这些文件与其他程序没有什么关系)是这样工作的,怎样加入一个服务到inetd,和一些特殊服务使用inetd以及什么情况下不使用inetd(效果反倒更好)时,我们需要考虑的事情.
2,inetd是什么?
在传统unix中,一个服务进程监听某个特定端口,并处理请求.如果一个机器提供了多个服务,那么会运行许多服务进程,但大部分进程处于空闲状态,浪费了系统资源比如内存.inetd超级服务器,就是为解决这个问题而生.它监听很多端口,当接受到以个请求时,它决定哪个服务程序来处理这个请求,然后运行这个程序(并把处理权转交个它).
下面是一个非常简单的关于inetd原理的图表
pop3-------- |
|
ftpd-------- | INETD | ----iNTERNET/DMZ/WSITCH/WAHTERR....
|
cvsupserver----|
inetd进程接受到请求后,运行所需要的服务进程.inetd所做的是软多路处理.特别提醒的是,关于安全:在许多unix-like系统中,一个叫 tcpwrapper的软件包被用来 增强inetd的安全性.在netbsd中,inetd使用libwrap内建了tcpwrapper的功能.
3,配置inetd---/etc/inetd.conf
inetd通过自己的一个叫/etc/inetd.conf的配置文件控制自己的行为,参看inetd.conf的manpage.inetd.conf主要是激活服务和映射那些系统管理员想通过inetd运行的服务,而哪个程序会启动来处理从哪个端口接受到的请求.
inetd.conf是一个ascii文件,每个服务占一行,每一行有几个域.基本域结构是:
service-name socket-type protocol wait/nowait user:group serverprogram arguments
service-name:
这个名字表面inetd将监听的端口.它可以是一个10进制数,也可以是/etc/services中定义的服务名字.
socket-type:
通讯socket类型,各种类型包括:stream (tcp stream);dgram(udp sercie);raw(raw service);rdm(可靠的消息传递);seqpacket(顺序包socket).大部分的socket类型为stream 和dgram.
protocol:
使用的协议类型,大部分是使用tcp协议的流服务(stream):tcp,tcp6,udp,udp6;使用udp协议的datagram (数据报)服务;值得一提的是:tcp,udp意味着使用默认的ipv4,tcp4指定使用ipv4,而tcp6/udp6使用ipv6.而基于rpc的协议被指定为rpc/tcp或者rpc/udp.
wait/nowait:
这个域告诉inetd是等待一个服务程序返回还是继续处理新的连接.许多到服务进程的连接在数据传输完后需要的到服务器的一个应答,而另外一些则(不需要应答)而可以继续连接.后面的就称为nowait,前面的是wait.大部分情况下,它取决于socket类型.比如:steam类的(大部分时间)使用nowait.
user:[group]
这个域是inetd以什么身份(和组)来运行服务进程.
server-program
运行的程序(包含绝对路径)
program-arguments
运行的程序和它的参数
举例:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -ll
从左到右,service-name是ftp,socket-tyep是stream,protocol是tcp,nowait表示inetd不等待服务的结束,以root身份运行,路径是/usr/libexec/ftpdd,程序和参数为ftpd -ll.注意,最后以个域,程序名和服务名是不一样的.
4 服务/etc/services
包含服务名数据.这个文件包含servicename和portnubmer的以个映射.格式:
service-name port-number/protocol-name[aliases]
service-name是服务的名字,port-number是分配这个服务的端口,portocol-name是tcp或udp,如果需要端口的别名,可以使用aliases域,以空格隔开.#后是注释
ssh 22/tcp #secure shell
ssh 22/udp
正如我们看到的,从左开始,ssh是服务名,22是端口,协议为tcp和udp,注意每个协议都有一个入口(一行)(即使是同一个端口).
5,协议/etc/protocols
另外一个inetd需要的是/etc/protocols.
这个文件有关于darpa网络协议的信息.格式:
protocol-name number[aliases]
这里protocol-name表示ip包的有效名字,tcp或者udp,number是iana组织公布的官方数据,而alias可以加入到其后.
让我们来看看/etc/protocols数据的第7行.
tcp 6 TCP #transmission control protocol
从左边开始,我们看到protocol名字是tcp,6为iana数据,只有一个别名TCP,注释说这是一个tcp协议
6,rpc /etc/rpc
rpc程序数字数据库被inetd.conf中的rpc协议类型使用.包含名字到数字的映射关系.格式:
server-name program-number aliases
举例:
nfs 100003 nfsprog
7,allow(允许)和deny(拒绝)主机访问
/etc/hosts.{allow,deny}
象上面所说,netbsd的inetd通过libwrap已经包含tcpwrapper.所以,inetd能够细致的处理一个服务的访问权限,而不仅仅是只有允许访问或者干脆不运行.访问控制定义在/etc/hosts.allow,/etc/hosts.deny.参看hosts-access的 manpage
它们包含了几行为某个服务的访问定义.如果/etc/hosts.allow定义了访问权限,那么访问将允许;如果在 /etc/hosts.allow没有定义,而在/etc/hosts.deny中定义了,那么访问将被拒绝.如果两个文件中都没定义,那么服务将被允许访问,并一inetd的标准形式.(译者:其实就是2条,没有没明确禁止的就允许;没有被明确允许的就禁止.tcpwrapper使用的是前面的一条.而顺序是先看hosts.allow,再看hosts.deny)
.... Each line in /etc/hosts.allow and /etc/hosts.deny contains a service either by name (as given in the field for argv[0] in /etc/inetd.conf, e.g. "ftpd" instead of "ftp"), or the special service "ALL" which obviously applies to all services. Following the service name is - seperated by a colon - a number of access restrictions, which can be hostnames, domains, single IP addresses, whole IP subnets or some other restrictions, please check hosts_access(5) for all the details.
#/etc/hostname.deny
ALL:some.host.name, .some.domain
参考hosts.access
Another example that would be mostly closed, denying access to all but very few machines would need entries in both /etc/hosts.allow and /etc/hosts.deny. The entry for /etc/hosts.deny would be:
# /etc/hosts.deny
ALL: ALL
The entry to allow a few hosts would be put into /etc/hosts.allow:
# /etc/hosts.allow
ALL: friend.host.domain otherfriend.otherhost.otherdomain
8,增加服务
许多系统管理员将会发现,需要为inetd增加服务(因为inetd中没有)或者将那些访问量不大的服务添加到inetd中.其实很简单.我们举个pop3的例子.
我们安装了一个cucipop的软件.(在pkgsrc/mail/cucipop),这个程序使用起来很简单,但它的不同的路径看起来很古怪.我们知道pop3是一个stream类型,所以使用nowait,最好以root身份运行./etc/inetd.conf中我们新建一行;
pop3 stream tcp nowait root
当我们安装好后,cucipop在/usr/pkg/sbin/cucipop,所以下一个域(server-name):
pop3 stream tcp nowait root /usr/pkg/sbin/cucipop
最后,我们象使用berkeley的mailbox格式,所以,的添加-Y选项.这样整个一行看起来:
pop3 stream tcp nowait root /usr/pkg/sbin/cucipop cucipop -Y
添加好了.我们的看看系统是否映射了这个服务名到端口,检查/etc/services
grep ^pop3 /etc/services
pop3 110/tcp # POP version 3
pop3 110/udp
pop3s 995/tcp # pop3 protocol over TLS/SSL (was spop3)
pop3s 995/udp # pop3 protocol over TLS/SSL (was spop3)
已经有了,netbsd默认已经安装了它们.
现在,为了使用它,我们重起inetd
sh /etc/rc.d/inetd restart
.........
9,什么时候使用inetd还是不使用inetd?
决定是否将服务迁移到或迁移出inetd取决于系统负载.比如,
在许多系统上,telnet服务的请求没有mail服务的多.大部分情况下,系统管理员会得出结论是否迁移服务(到inetd).
一个好的例子是mailf服务比如smtp,pop.我已经设定pop3以inetd运行,而exim则独立运行(standalone), 我错误的认为这样很好,因为用户少(就我和一些知道的帐号).我还将服务器设定为backup MX和relay,如果另外一个不堪重负而死掉的话.当我测试的时候发现,远程pop连接实在是太慢了.原因是我一直获取邮件,而一些帐号经常来回发邮件.最后我不的不将pop3迁移出了inetd.
迁移出服务的原因是很有趣的.当某个服务负载很高的时候,系统负载也很高.这种情况下,负载很大的服务肯定会影响其他使用inetd的服务. 那些请求量很大的服务会影响其他使用inetd的服务的性能.解决的办法就是,将这个服务迁移出inetd以便提高inetd的响应时间.
10,其他一些资源
manpage::
inetd/protocols/rpc/services/hosts-access
连接:
http://www.iana.org/numbers.htm