inetd 简介
单个 Linux 系统可以提供数十、甚至数百个网络服务。例如,使用 telnet 程序,您可以访问远程系统上的 telnet 服务。同样地,使用 ftp 程序,您可与远程系统上的 ftp 服务连接。
为了提供这些服务,远程系统运行每个服务器的实例(例如 /usr/sbin/in.telnetd 和 /usr/sbin/in.ftpd)以接受连接或者运行 inetd。inetd 程序接受每个进入的连接,然后根据其连接的类型启动处理该连接的适当的服务。出于这个原因,inetd 也被称为“因特网超级服务器”。
在典型的安装了 Linux 的系统上,inetd 处理大多数进入的连接。只有少数程序(如 sshd 和 lpd)处理它们自己的网络通信而无需依靠 inetd 接受进入的连接。
嘀嗒滴答 于 2006-10-02 21:32:02发表:
xinetd 配置
xinetd 的配置文件是 /etc/xinetd.conf。最常见的情况下,那个文件仅包含为其余服务设置缺省配置参数的几行:
[code]# cat /etc/xinetd.conf
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST RECORD
}
includedir /etc/xinetd.d[/code]
文件的最后一行指示 xinetd 从 /etc/xinetd.d 目录的文件代码片段读取额外的配置信息。我们快速地看看 telnet 代码片段:
[code]# cat /etc/xinetd.d/telnet
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}[/code]
如您所见,配置 xinetd 并不困难,而且它比 inetd 更直观。您可以在 xinetd(8)、xinetd.conf(5) 和 xinetd.log(5) 手册页中获得有关 xinetd 的更多信息。
在 Web 上也有关于 inetd、tcp_wrappers 和 xinetd 的大量信息。请务必查看我们在本教程最后一章(参考资料)中给出的这些工具的一些链接;它们能让您更好地体会这些工具的能力和配置。
嘀嗒滴答 于 2006-10-02 21:31:24发表:
xinetd:扩展的 inetd
尽管 inetd 是经典的因特网超级服务器,但最近对它进行了多次改写以试图添加特性和更多的安全性。xinetd 程序在许多新近的分发版(包括 Red Hat 和 Debian)中取代了 inetd。部分扩展的特性是:
.访问控制(内置 TCP 封装器)
.详尽的日志记录(连接持续时间和失败的连接等等)
.来自另一个主机的服务重定向
.IPv6 支持
.通过代码片段而不是一个汇总文件进行配置
嘀嗒滴答 于 2006-10-02 21:30:55发表:
用 TCP 封装器将访问限制为已知主机
无需重新装入 inetd,因为每当 telnet 端口有连接时,就会调用 tcpd。因此我们可以立即尝试:
[code]# telnet box.yourdomain.com
Trying 10.0.0.1...
Connected to box.yourdomain.com.
Escape character is '^]'.
Connection closed by foreign host.[/code]
哦!被拒绝了!(这是人生中为数不多的几次经历:拒绝表示成功。)要重新启用来自自己网络的访问,可在 /etc/hosts.allow 中插入例外:
[code]in.telnetd: .yourdomain.com[/code]
此刻我们就能够再次成功地用 telnet 访问系统了。而这仅仅触及了 tcp_wrappers 的能力的表面。在 tcpd(8) 和 hosts_access(5) 手册页中还有有关 tcp_wrappers 的更多信息。
嘀嗒滴答 于 2006-10-02 21:30:20发表:
用 TCP 封装器限制对本地用户的访问
tcpd 程序配置为使用两个文件:/etc/hosts.allow 和 /etc/hosts.deny。这两个文件中行的格式为:
[code]daemon_list : client_list [ : shell_command ][/code]
按以下顺序授权或拒绝访问。搜索在第一次匹配时停止:
.当与 /etc/hosts.allow 中的项匹配时,则授权访问
.当与 /etc/hosts.deny 中的项匹配时,则拒绝访问
.若没有匹配项,则授权访问
例如,若只允许对内部网络进行 telnet 访问,可通过在 /etc/hosts.deny 中设置策略(拒绝除 localhost 以外的其它来源的所有连接)着手:
[code]in.telnetd: ALL EXCEPT LOCAL[/code]
嘀嗒滴答 于 2006-10-02 21:29:40发表:
用 TCP 封装器进行日志记录
to abort)
缺省情况下,连接不受限制但会被日志记录下来。例如,我们可以重新启动 inetd 以使在前页做的更改生效。然后一些快速调查应该显示已记录的连接:
[code]# telnet localhost
login: (press
# tail -1 /var/log/secure
Feb 12 23:33:05 firewall in.telnetd[440]: connect from 127.0.0.1[/code]
tcpd 将记录 telnet 连接尝试,因此看起来有些东西在工作了。因为 tcpd 提供一致的连接日志记录服务,这就免除了单个服务守护程序每次自己将连接编入日志的需要。事实上,在接受连接的工作方面,它与 inetd 相似,因为那使每个守护程序不需要接受自己的连接。Linux(UNIX)的简单程度真是不可思议!
嘀嗒滴答 于 2006-10-02 21:29:13发表:
TCP 封装器简介
tcp_wrappers 包提供了一个名为 tcpd 的很小的守护程序,该程序由 inetd 而不是实际的服务守护程序调用。tcpd 程序将每个进入连接的源地址编入日志,并可以过滤它们而只允许来自可信系统的连接。
要使用 tcpd,可以按下列方式将它插入到 inetd 中:
[code]ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd[/code]
嘀嗒滴答 于 2006-10-02 21:28:44发表:
用手工方式停止/启动 inetd
如果上页中的助手脚本不起作用,老式方法甚至更简单。可以使用 killall 命令停止 inetd:
[code]# killall inetd[/code]
可以在命令行调用 inetd 来简单地再次启动它。它会自动在后台运行:
[code]# /usr/sbin/inetd[/code]
有一个快捷方式无需停止 inetd 就可命令它重新读取配置文件:只要向它发送 HUP 信号:
[code]# killall -HUP inetd[/code]
此刻应该不能 telnet 或 ftp 到这个系统,因为 telnet 和 ftp 被禁用。尝试用 telnet localhost 进行检查。如果需要 telnet 或 ftp 访问,所需做的全部就是重新启用它!
以下是我所遇到的情况:
[code]# telnet localhost
telnet: Unable to connect to remote host: Connection refused[/code]
嘀嗒滴答 于 2006-10-02 21:28:02发表:
使用初始脚本停止/启动 inetd
我们在上页对 /etc/inetd.conf 所做的更改将在重新启动 inetd 程序后才生效。大多数分发版在 /etc/init.d 或 /etc/rc.d/init.d 中有初始脚本:
[code]# /etc/rc.d/init.d/inet stop
Stopping INET services: [ OK ]
# /etc/rc.d/init.d/inet start
Starting INET services: [ OK ][/code]
事实上,通常可以使用“restart”作为快捷方式:
[code]# /etc/rc.d/init.d/inet restart
Stopping INET services: [ OK ]
Starting INET services: [ OK ][/code]
嘀嗒滴答 于 2006-10-02 21:27:30发表:
禁用服务
在 inetd 中禁用服务很简单:只要在 /etc/inetd.conf 注释掉该服务所在的行即可。您可能不希望完全除去该行,以便以后需要时可以引用它。例如,有些系统管理员出于安全性的原因宁愿禁用 telnet(因为连接完全是明文):
[code]# vi /etc/inetd.conf
[comment out undesired line]
# grep ^.telnet /etc/inetd.conf
#telnet stream tcp nowait root /usr/sbin/in.telnetd[/code]
嘀嗒滴答 于 2006-10-02 21:27:05发表:
配置 inetd;/etc/inetd.conf
inetd 的实际配置是在 /etc/inetd.conf 中完成的,配置格式如下:
[code]service-name socket-type protocol wait-flag user server-program[/code]
因为服务是在 inetd.conf 中由服务名称而不是端口指定的,所以,为了符合由 inetd 处理的条件,必须将服务列在 /etc/services 中。
让我们看看 /etc/inetd.conf 一些常见的行。例如,telnet 和 ftp 服务:
[code]# grep ^telnet /etc/inetd.conf
telnet stream tcp nowait root /usr/sbin/in.telnetd
# grep ^ftp /etc/inetd.conf
ftp stream tcp nowait root /usr/sbin/in.ftpd -l -a[/code]
对这两个服务的配置为:使用 TCP 协议,并以 root 用户的身份运行服务器(in.telnetd 或 in.ftpd)。有关 /etc/inetd.conf 中字段的完整说明,请参阅 inetd(8) 手册页。
嘀嗒滴答 于 2006-10-02 21:26:32发表:
配置 inetd:/etc/services
上页提到 inetd 根据类型对进入的连接进行分类。每个进入的连接都在 TCP/IP 头中包含一些标识字段。我们最感兴趣的字段是源地址、目标地址协议和端口号。进入连接由 inetd 根据端口号和协议(通常是 TCP 或 UDP,请查看 /etc/protocols 以获得完整的 inetd 可以提供的服务列表)进行分类。
每行都有如下格式:
[code]service-name port-number/protocol-name aliases # comment[/code]
例如,让我们研究最上面的几项:
[code]# grep ^[^#] /etc/services | head -5
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null[/code]
通常,/etc/services 已经包含所有有用的服务名称和端口。如果您希望添加自己的端口,可以查询已分配端口号列表。