一、xinetd简介
xinetd托管服务也就是extended internet daemon简写,xinetd执行与inetd相同的功能:它启动提供互联网服务的程序。xinetd不是在系统初始化时启动此类服务器,并在连接请求到达之前处于休眠状态,而是唯一启动的守护进程,它在所有服务端口上侦听其配置文件中列出的服务。当请求传入时,xinetd启动相应的服务器。由于其操作方式,xinetd(以及inetd)也被称为超级服务器。
xinetd配置文件中列出的服务可以分为两组。第一组中的服务称为多线程服务,它们需要为每个新的连接请求分叉一个新的服务器进程。然后,新服务器处理该连接。对于此类服务,xinetd会不断侦听新的请求,以便生成新的服务器。另一方面,第二组包括服务守护进程负责处理所有新连接请求的服务。这种服务称为单线程服务,xinetd将停止处理新的请求,直到服务器死亡。该组中的服务通常基于数据报。
到目前为止,超级服务器存在的唯一原因是通过避免分叉许多可能在其生命周期的大部分时间处于休眠状态的进程来节省系统资源。在实现这一功能的同时,xinetd利用了超级服务器的思想来提供访问控制和日志记录等功能。xinetd服务的主配置文件/etc/xinetd.conf,用于存放被托管的服务的目录:/etc/xinetd.d 。
二、xinetd安装
此博文是以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服务的时候,注意配置文件格式,“项 =值”,这个=号前要求空格。如果发现配置的服务托管不起来,可以使用xinetd -d命令检查,如果配置文件语法错误都会有相关提示,根据提示修正即可。
1、安装telnet-server服务
[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
完毕
2、在xinetd.d目录下创建telnet-stream文件
[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
}
3、重启xinetd服务
[root@s152 xinetd.d]# systemctl restart xinetd
4、检查监听端口
5、登录测试
6、增加访问控制IP限制参数
[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
}
7、再次登录测试
从源地址192.168.0.32登录直接被拒绝了,从153主机登录成功。
四、xinetd主要配置参数说明
1、配置文件样式
service <service_name>
{
<attribute> <assign_op> <value> <value> ...
...
}
- service_name:服务名称
- attribute:服务工作属性
- assign_op:赋值操作符,=或者+=,+=表示在默认配置基础上增加一个选项
- value:值
2、基本参数
参数 | 参数说明 | 示例 |
---|---|---|
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 |
3、访问控制参数
参数 | 参数说明 | 示例 |
---|---|---|
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 |
五、QA
1、配置好telnet服务后无法启动
- 报错信息:无,重启xinetd后,无任何输出,查看xinetd服务状态正常,就是无法启动telnet服务。
- 问题分析:xinetd没有正式托管telnet服务,使用xinetd -d命令可以对服务进行debug日志输出,发现是telnet服务配置文件检查后报错,所以没有启用该服务。
- 解决方案:根据xinetd -d输出中的报错系统修改配置文件,然后重启xinetd服务。
2、使用root密码telnet登录服务器失败
- 报错信息:Login incorrect
- 报错原因:为了安全,禁止使用root账户telnet登录
- 解决方案:切换普通用户登录,登录正常。