linux服务篇-Xinetd服务

  • Post author:
  • Post category:linux


Xinetd=eXtended InterNET services daemon(扩展互联网服务守护进程=超级互联网守护进程=超级服务),xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理保护多种轻量级Internet服务。它在linux的安全中有着举足轻重的地位。它管理的服务都是一些不是很常用,但是系统中偶尔也会用到的小服务或者该服务没什么好的安全机制,比如:tftp、rsync、cvs、telnet等。它并不是一真正意义上的服务,xinetd相当于rync、cvs等服务的代理人,就像老大照着小弟!它的作用大致可以分为以下几个:访问控制、防止DOS攻击、扩展的日子选项、服务转发、用户交互式体验。


Xinetd


服务作用与特点

作用:     通过xinetd服务来管理一些功能简单的小服务,如telnet,rsync,cvs、tftp服务等等,并为这些服务提供安全访问控制功能

特点:     支持对tcp、udp、RPC服务(但是当前对RPC的支持不够稳定)

基于时间段的访问控制

功能完备的log功能,即可以记录连接成功也可以记录连接失败的行为

能有效的防止DoS攻击(Denial of Services)

能限制同时运行的同一类型的服务器数目

能限制启动的所有服务器数目

能限制log文件大小

将某个服务绑定在特定的系统接口上,从而能实现只允许私有网络访问某项服务

能实现作为其他系统的代理。如果和ip伪装结合可以实现对内部私有网络的访问

从xinetd 2.1.8.8开始支持IPV6

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。


它最大的缺点是对RPC支持的不稳定性,但是可以启动protmap,与xinetd共存来解决这个问题。


Xinetd


守护的常见服务(了解)

原则上任何系统服务都可以使用xinetd,然而最适合的应该是那些常用的网络服务,同时,这个服务的请求数目和频繁程度不会太高。像DNS和Apache就不适合采用这种方式,而像FTP、Telnet、SSH等就适合使用xinetd模式,系统默认使用xinetd的服务可以分为如下几类。

标准Internet服务:telnet(kernal2.6以前版本)、tftp。

信息服务:finger、netstat、systat。

邮件服务:imap、imaps、pop2、pop3、pops。

RPC服务:rquotad、rstatd、rusersd、sprayd、walld。

BSD服务:comsat、exec、login、ntalk、shell、talk。

内部服务:chargen、daytime、echo、servers、services、time。

安全服务:irc。

其他服务:name、tftp、uucp。

Internet网络服务文件中,记录网络服务名和它们对应使用的端口号及协议(/etc/services)。文件中的每一行对应一种服务,它由4个字段组成,中间用Tab键或空格键分隔,分别表示“服务名称”、“使用端口”、“协议名称”及“别名”。在一般情况下,不要修改该文件的内容,因为这些设置都是Internet标准的设置。一旦修改,可能会造成系统冲突,使用户无法正常访问资源。Linux系统的端口号的范围为0~65 535,不同范围的端口号有不同的意义。

0:不使用。

1~1023:系统保留,只能由root用户使用。

1 024~4 999:由客户端程序自由分配。

5 000~65 535:由服务器程序自由分配。


Xinetd


工作原理

Telnet,TFTP,rsync没有常驻内存,如果当我们需要使用这个服务的时候,有Xinetd来唤醒!!!

服务的启动和管理主要有stand alone和super daemon两种。

stand alone由启动脚本启动,脚本一般存储在/etc/init.d/,通过/etc/init.d/[service name] restart 启动。服务直接加载在内存中,响应迅速,适合访问量较大的服务。

super daemon通过超级守护进程—xinetd来控制服务。系统服务托管在xinetd进程下,当有请求访问端口时,xinetd会启动该服务处理访问请求。同时xinetd还提供监控、访问控制等安全特性,缺点是响应速度较慢。

xinetd提供的服务处理模式分为两种,一种是多线程,一种是单线程。

multi-threaded:为每一个允许的访问建立一个daemon提供服务。

single-threaded:为所有访问建立一个daemon提供服务。

Daemon工作状态:

signal-control:只要有客户端请求,就立即执行。如打印机服务(cupsd)

interval-control:每隔一段时间执行。如atd、crond。


1


:确切的说,我们应该说是Telnet或者Rsync等被Xinetd管理的服务的原理。

2:Xinetd超级服务监控着被管理服务的端口,比如说telnet的端口23。

3:客户端要使用Telnet登陆服务器,请求发送到服务器上,Xinetd收到这个请求,查看请求连接端口。

4:发现请求链接的端口是23号,那么将这个连接转发给被管理的telnet服务。

5:telnet服务收到连接后建立连接通讯。

6:剩下的步骤就是Client和Telnet服务之间的通讯。


Xinetd


工作端口

C/S模式,端口873(RSYNC)


安装Xinetd服务

[root@taijitao63 ~]# yum install -y xinetd                        //安装xinetd服务

注意:如果你安装了开发工具等桌面环境之后,在/etc/有xinetd.d这个目录,但是这个是安装rsync生成的,rsync在安装我们桌面环境和开发工具库的时候会装,但是xinetd没有安装!

xinetd服务的主配置文件: /etc/xinetd.conf –保持默认即可

用于存放被托管的服务的目录:/etc/xinetd.d/

# systemctl enable xinetd.service –开机启用xinetd服务

查看服务是否开机启动:

# systemctl list-unit-files –列出各种服务开机是否启动

# systemctl list-unit-files | grep xinetd –列出xinetd服务是否开机启动

# systemctl is-enabled xinetd –列出xinetd服务是否开机启动


Xinetd


配置文件

/etc/xinetd.conf中的每一项具有下列形式:

service service-name

{

……

}

其中service是必需的关键字,且属性表必须用大括号括起来。每一项都定义了由service-name定义的服务。

service-name是任意的,但通常是标准网络服务名,也可增加其他非标准的服务,只要它们能通过网络请求激活,包括localhost自身发出的网络请求。有很多可以使用的属性,稍后将描述必需的属性和属性的使用规则。

操作符可以是=、+=或-=。所有属性可以使用=,其作用是分配一个或多个值,某些属性可以使用+=或-=,其作用分别是将其值增加到某个现存的值表中,或将其值从现存值表中删除。

[root@taijitao63 ~]# vim /etc/xinetd.conf                        //xinetd配置文件位置



defaults




{





#enabled  =    #


启动服务,如果启动 enable=yes



#disabled  =   #


停止服务,disabled=yes(这里动,它包含了/etc/xinetd.d,修改此目录下文件即可)



log_type



=



SYSLOG daemon info


#


指定服务log记录方式(日志等级)



log_on_failure



=



HOST


#


指定失败时登记的信息



log_on_success



=



PID HOST DURATION EXIT


#


指定成功时登记的信息,DURATION登记会话持续期



#no_access =                            #


禁止访问,不能访问xinetd管理的那些服务的……



#only_from =            #


仅允许访问,只能从……访问,可以是ip,ip/掩码位,.example.com



cps



=



50


10


#


服务器最多启用50个进程,如果达到这个数目将停止启动新服务10s,在此期间不接受任何请求



instances



=



50


#


同一个服务的最大连接数,xinetd被管理的服务最大支持多少连接



per_source



=



10


#


同一客户端的最大连接数



#bind =                    #


绑定主机ip地址,多IP的时候用



#mdns = yes             #


支持组播DNS(multicast DNS),目前只有Mac OS X和linux支持。



v6only



=



no


#


仅允许IPv6



groups



=



yes


#


设定组名




umask




=



002


#


设定文件权限掩码



#banner          =                  #


建立连接时就显示该文件信息。



#banner_fail     =                       #


连接失败时,显示文件内的信息。



#banner_success  =                              #


连接成功时,显示文件内的信息。




}



includedir



/



etc



/



xinetd.d


#xinetd


要包含的文件或目录是/etc/xinetd.d,此目录下的配置文件同样生效

日志等级:

debug //报错信息

info // 正常信息

notice //稍微要注意的信息

warn //警告

err(error)   //错误

crit(critical) //关键错误

alert //警报警惕

emery(emergency) //突发事件,紧急


启用


rsync


服务


(


适用


kernal2.6


以前)

[root@taijitao63 ~]# yum install -y telnet-server tftp-server rsync //都把telnet,tftp,rsync安装上

[root@taijitao63 ~]# vim /etc/xinetd.d/rsync                    //修改服务配置文件,默认没有启用



service rsync


#


服务名




{





disable



=



no


#


此行要改,默认为yes,没有启用



flags



=



IPv6


#


标记参数,可以使用man xinetd.conf查看flags相关参数



socket_type



=



stream


#


数据封装,Stream-TCP数据包,Dgram-UDP数据包,RAW服务器直接访问IP




wait




=



no


#


控制xinetd是每次处理一个连接 (wait=yes),还是每次处理多个连接 (wait=no)。



user



=



root


#


运行身份



server



=




/



usr



/



bin



/



rsync


#


允许访问时运行的可执行程序



server_args



=








daemon


#


和上面的结合结果就是/usr/bin/rsync –daemon



log_on_failure



+=



USERID


#


登陆失败记录用户名(登陆账号)




}


[root@taijitao63 ~]# netstat -antup | grep 873   //直接启动xinetd服务,唤醒rsync服务,服务名xinetd



tcp


0


0



:::



873



:::*



LISTEN


49003



/



xinetd


启用


tftp


服务


TFTP


(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。默认使用UDP!


[root@taijitao63 ~]# vim /etc/xinetd.d/tftp



disable



=



no


#


修改此行,yes改no


[root@taijitao63 ~]# service xinetd restart


[root@taijitao63 ~]# netstat -antup | grep xinetd



tcp


0


0



:::



23



:::*



LISTEN


49687



/



xinetd



tcp


0


0



:::



873



:::*



LISTEN


49687



/



xinetd



udp


0


0


0



.



0



.



0



.



0



:



69


0



.



0



.



0



.



0



:*



49687



/



xinetd

修改日志等级

[root@taijitao63 ~]# vim /etc/xinetd.conf

log_type        = SYSLOG local2 info

[root@taijitao63 ~]# vim /etc/rsyslog.conf

local2.*                                                /var/log/xinetd.log

重启 xinetd,rsyslog

[root@taijitao63 ~]# /usr/sbin/xinetd -filelog /var/log/a.log -f /etc/xinetd.conf


自定义托管服务

例1:以sshd服务为例,sshd拖管到xinetd下。

sshd服务也有配置文件,为/etc/ssh/sshd_config;但此配置文件功能有限,可以选择拖管sshd服务,来实现额外的功能。

托管前先关闭ssh本身提供的服务

# systemctl stop sshd.service –关闭ssh服务

# systemctl disable sshd.service –设置为开机不启动

(注意:如果你关闭xinetd之后,需要把ssh服务重新启动,不然你不能通过ssh远程连接)

配置ssh被xinetd托管

# vim /etc/xinetd.d/ssh –默认是没有这个文件的,需要创建

service ssh                             # 代表被托管服务的名称

{

disable = no                    # 是否禁用托管服务,no表示开启托管服务

log_on_failure += USERID        # 设置失败时,UID添加到系统登记表

socket_type = stream            # socket连接方式,这个是属于本地方式,对ssh无效

server_args = –daemon          # 设置服务启动时需要的参数

cps = 25 30                     # 每秒25个入站连接,如果超过限制,则等待30秒。主要用于对付拒绝服务***

protocol = tcp                  # 代表ssh走的是tcp协议连接

wait = no                       # 是否并发,这个参数对ssh无效

user = root                     # 以什么用户进行启动

server = /usr/sbin/sshd         # 被托管服务的启动脚本

server_args = -i                # 启动脚本的参数

}

重启xinetd服务验证

# systemctl restart xinetd.service –重新启动xinetd服务

# lsof -i:22 –ssh的默认端口为22,可以通过/etc/services查看各个服务的端口

–查看22端口的进程,由sshd变为了xinetd就表示你拖管成功了

[root@taijitao ~]# lsof -i :22

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

sshd    7174 root    5u  IPv4  50286      0t0  TCP taijitao.example.com:ssh->192.168.1.1:39136 (ESTABLISHED)

sshd    7176 root    5u  IPv4  50286      0t0  TCP taijitao.example.com:ssh->192.168.1.1:39136 (ESTABLISHED)

xinetd  9750 root    5u  IPv6 246683      0t0  TCP *:ssh (LISTEN)


例2:

在例1 的基础上加上对IP或网段的访问控制功能

这个是ssh服务本身不具备的功能(除非写iptables)

# vim /etc/xinetd.d/ssh

service ssh

{

disable = no

log_on_failure += USERID

socket_type = stream

server_args = –daemon

cps = 25 30

protocol = tcp

wait = no

user = root

server = /usr/sbin/sshd

server_args = -i

only_from = 192.168.1.0/24              # 表示允许1网段访问

no_access = 192.168.1.20 192.168.1.200  # 表示只能1网段访问,但1网段里的20和200这两IP不能访问

}

重启xinetd服务验证

# systemctl restart xinetd.service –重新启动xinetd服务

修改后重新启动xinetd服务再去客户端进行测试

# ifconfig ens33 –查看客户端IP

# ssh 192.168.1.88 –ssh连接服务器

IP为192.168.1.88的拒绝客户端远程连接。因为在服务器里面做了xinetd托管设置:192.168.1.20的IP不能连接服务器。


例3:在例2 的基础再加一些功能(man xinetd.conf)

1、控制这个服务最多只能3个连接,每个源IP只能1个连接;

2、控制只能9:00到18:00才能ssh连接;

3、指定日志记录到/var/log/xinetd_ssh.log里。

# vim /etc/xinetd.d/ssh

service ssh

{

disable = no

log_on_failure += USERID

socket_type = stream

server_args = –daemon

cps = 25 30

protocol = tcp

wait = no

user = root

server = /usr/sbin/sshd

server_args = -i

only_from = 192.168.1.0/24

no_access = 192.168.1.20 192.168.1.200

instances = 3                                   # 最大连接数为3

per_source = 1                                  # 每个源IP只能有1个连接

access_times = 9:00-18:00                      # 只能9:00到18:00才能ssh连接

log_type = file /var/log/xinetd_ssh.log        # 指定日志记录到/var/log/xinetd_ssh.log里

}

# systemctl restart xinetd.service –重新启动xinetd服务

修改好以后大家在客户端进行测试,修改时间,查看log_type指定的路径下是否有xinetd_ssh.log。这里就不一一举列验证了。


例4:修改ssh服务的连接端口

(1)修改ssh服务的连接端口

# vim /etc/xinetd.d/ssh

service ssh

{

disable = no

log_on_failure += USERID

socket_type = stream

server_args = –daemon

cps = 25 30

protocol = tcp

wait = no

user = root

server = /usr/sbin/sshd

server_args = -i

only_from = 192.168.1.0/24

no_access = 192.168.1.20 192.168.1.200

instances = 3

per_source = 1

access_times = 9:00-18:00

log_type = file /var/log/xinetd_ssh.log

port = 7722                             # 指定ssh的连接端口为7722

}

(2)将ssh服务的端口改为7722

# vim /etc/services –修改ssh服务端口

ssh 7722/tcp # The Secure Shell (SSH) Protocol –将ssh的tcp端口改为7722

ssh 7722/udp # The Secure Shell (SSH) Protocol –将ssh的udp端口改为7722

注意:这个端口7722不能和其他服务的端口相同,可以在/etc/services文件中查找是否有只有ssh的端口为7722。

端口改了以后,客户端访问是要使用ssh 192.168.1.88 -p 7722,但我自己连自己不用加-p 7722,因为我默认就是用7722来连接。这也就是说/etc/services里的端口也决定了你做为客户端去访问别人的默认端口。

重启xinetd服务后通过lsof -i:7722来查看ssh是否被托管

(3)配置文件改动后需要重启xinetd服务

# systemctl restart xinetd.service –重新启动xinetd服务

(4)验证以上配置的参数是否生效

服务器:自己连接自己,不需加端口号

客户端:需要加端口号

(5)测试完后将端口改回22

# vim /etc/services –修改ssh服务端口

ssh 22/tcp # The Secure Shell (SSH) Protocol –将ssh的tcp端口改回22

ssh 22/udp # The Secure Shell (SSH) Protocol –将ssh的udp端口改回22

# systemctl restart xinetd.service –重新启动xinetd服务

xinetd防止拒绝服务攻击(Denial of Services)的原因

xinetd能有效地防止拒绝服务攻击(Denial of Services)的原因如下。

1.限制同时运行的进程数

通过设置instances选项设定同时运行的并发进程数:


Instances=20

当服务器被请求连接的进程数达到20个时,xinetd将停止接受多出部分的连接请求。直到请求连接数低于设定值为止。

2.限制一个IP地址的最大连接数

通过限制一个主机的最大连接数,从而防止某个主机独占某个服务。


per_source=5

这里每个 IP地址的连接数是5个。

3.限制日志文件大小,防止磁盘空间被填满

许多攻击者知道大多数服务需要写入日志。入侵者可以构造大量的错误信息并发送出来,服务器记录这些错误,可能就造成日志文件非常庞大,甚至会塞满硬盘。同时会让管理员面对大量的日志,而不能发现入侵者真正的入侵途径。因此,限制日志文件大小是防范拒绝服务攻击的一个方法。


log_type FILE.1 /var/log/myservice.log 8388608 15728640

这里设置的日志文件FILE.1临界值为8MB,到达此值时,syslog文件会出现告警,到达15MB,系统会停止所有使用这个日志系统的服务。

4.限制负载

xinetd 还可以使用限制负载的方法防范拒绝服务攻击。用一个浮点数作为负载系数,当负载达到这个数目的时候,该服务将暂停处理后续的连接。


max_load = 2.8

上面的设定表示当一项系统负载达到2.8时,所有服务将暂时中止,直到系统负载下降到设定值以下。

注意:

要使用这个选项,编译时应加入“–with-loadavg”,xinetd将处理max-load配置选项,从而在系统负载过重时关闭某些服务进程,来实现防范某些拒绝服务攻击。

5.限制所有服务器数目(连接速率)

xinetd 可以使用cps选项设定连接速率,下面的例子:


cps = 25 60

上面的设定表示服务器每秒最多启动25个连接,如果达到这个数目将停止启动新服务60秒。在此期间不接受任何请求。

6.限制对硬件资源的利用

通过rlimit_as和rlimit_cpu两个选项可以有效地限制一种服务对内存、中央处理器的资源占用:


rlimit_as = 8M


rlimit_cpu=20

上面的设定表示对服务器硬件资源占用的限制,最多可用内存为8MB,CPU每秒处理20个进程。

xinetd的一个重要功能是它能够控制从属服务可以利用的资源量,通过设置可以达到这个目的,有助于防止某个xinetd服务占用大量资源,从而导致“拒绝服务”情况的出现。

利用xinetd设置sensor陷阱,隔离恶意访问

许多暴露在公网的服务器都承担了巨大的安全风险,时时可可都可能被扫描、被攻击。当有人连接管理员不希望被访问的端口时,xinetd可以记录这个端口,并拒绝这个家伙对服务器中xinetd所托管服务端口的访问请求,这样他就跟你的服务器无缘了。

Xinetd.conf参数中有一项deny_time是用来设置拒绝时间的,flags选项用来为服务添加标志,不同的标志有不同的功能,具体如下:


Deny_time =

直到xinetd重启 | 仅记录日志 | 拒绝X分钟


Flags=SENSOR

//记录访问服务的IP地址,添加到作用于全局的no_access列表中,使得请求过该服务的IP在deny_time过期之前一直都拒绝访问。



版权声明:本文为taoxicun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。