xinetd托管服务也就是extended internet daemon简写,xinetd执行与inetd相同的功能:它启动提供互联网服务的程序。xinetd不是在系统初始化时启动此类服务器,并在连接请求到达之前处于休眠状态,而是唯一启动的守护进程,它在所有服务端口上侦听其配置文件中列出的服务。当请求传入时,xinetd启动相应的服务器。由于其操作方式,xinetd(以及inetd)也被称为超级服务器。
xinetd配置文件中列出的服务可以分为两组。第一组中的服务称为多线程服务,它们需要为每个新的连接请求分叉一个新的服务器进程。然后,新服务器处理该连接。对于此类服务,xinetd会不断侦听新的请求,以便生成新的服务器。另一方面,第二组包括服务守护进程负责处理所有新连接请求的服务。这种服务称为单线程服务,xinetd将停止处理新的请求,直到服务器死亡。该组中的服务通常基于数据报。
到目前为止,超级服务器存在的唯一原因是通过避免分叉许多可能在其生命周期的大部分时间处于休眠状态的进程来节省系统资源。在实现这一功能的同时,xinetd利用了超级服务器的思想来提供访问控制和日志记录等功能。xinetd服务的主配置文件/etc/xinetd.conf,用于存放被托管的服务的目录:/etc/xinetd.d 。
此博文是以centos7.6操作系统环境为例进行介绍,centos7.6自身是没有安装xinetd的,需要我们手动安装,我们可以使用yum方式进行安装。安装完成后可以使用systemctl管理xinetd服务。
[root@s152 ~]# yum install -y xinetd
…
已安装:
xinetd.x86_64 2:2.3.15-14.el7
完毕!
xinetd不限于/etc/services中列出的服务。因此,任何人都可以使用xinetd启动专用服务器。我们可以查看/etc/services了解xinetd支持的服务:
[root@s153 ~]# cat /etc/services |wc -l
11176
[root@s153 ~]# cat /etc/services |grep telnet
telnet 23/tcp
telnet 23/udp
…
配置xinetd服务的时候,注意配置文件格式,“项 =值”,这个=号前要求空格。如果发现配置的服务托管不起来,可以使用xinetd -d命令检查,如果配置文件语法错误都会有相关提示,根据提示修正即可。

[root@s152 ~]# yum install -y telnet telnet-server
已安装:
telnet.x86_64 1:0.17-66.el7 telnet-server.x86_64 1:0.17-66.el7
完毕
[root@s152 xinetd.d]# cd /etc/xinetd.d/
[root@s152 xinetd.d]# cat telnet-stream
service telnet
{
disable =no
flags =REUSE
wait =no
socket_type =stream
user =root
server =/usr/sbin/in.telnetd
log_on_failure +=USERID
log_type =file /var/log/xinetd_telnet.log
}
[root@s152 xinetd.d]# systemctl restart xinetd


[root@s152 xinetd.d]# cat telnet-stream
service telnet
{
disable =no
flags =REUSE
wait =no
socket_type =stream
user =root
server =/usr/sbin/in.telnetd
log_on_failure +=USERID
log_type =file /var/log/xinetd_telnet.log
only_from =192.168.0.0/24
no_access =192.168.0.32
}
从源地址192.168.0.32登录直接被拒绝了,从153主机登录成功。

service
{
...
...
}
| 参数 | 参数说明 | 示例 |
|---|---|---|
| socket_type | 套接字类型stream(TCP),dgram(UDP) | socket_type =stream |
| wait | 是否需要等待一个请求完成以后才能继续接入请求,取值yes或者no,yes表示多线程,no表示单线程 | wait =no |
| user | 运行服务的用户 | user =root |
| server | 以哪个二进制程序启动服务 | server =/usr/sbin/in.telnetd |
| log_on_failure | 失败日志格式,+=表示在默认配置基础上增加一个选项 | log_on_failure |
| disable | 是否启用服务 | disable =no |
| log_type | log日志路径 | log_type =file /var/log/xinetd_telnet.log |
| 参数 | 参数说明 | 示例 |
|---|---|---|
| only_from | 仅允许来自哪些客户机的请求访问,取值可以是IP、地址段、主机名、域名 | only_from = 192.168.1.1 192.168.0.0/24 |
| no_access | 禁止哪些客户机访问,取值同上 | no_access = 192.168.1.1 192.168.0.0/24 |
| access_times | 在哪个时间段内可以被访问 | access_times = hh:mm-hh:mm |
| bind | 监听地址 | bind = value |
| port | 监听端口 | port = value |
| cps | 每秒钟入站连接的个数 | cps = count time |
| count | 每秒钟接受请求数的最大值,当超过这个值时服务会暂时禁用一段时间 | count =1000 |
| time | 暂时禁用的时长 | time 30 |
| per_source | 单个IP最多允许并发发起多少个请求 | per_source = 20 |
| instances | 服务最大并发连接数 | instances = 20000 |