- 浏览: 340663 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
hjl0722:
...
Java中的异或 -
lucd:
f(New.<Person, List<Pet&g ...
第15章泛型 -
liujunhao225:
[Error: could not access: List; ...
mvel的使用 -
superscorpio:
public void testImportInContex ...
mvel的使用 -
yuyangtina:
哦,知道了,是继承的方法。谢谢你的分享。
HttpClient3.x发送Soap请求的方法
什么是 daemon
Linux 主机常常会收到一些要求,不论是来自本机系统的要求或者是网络 Client 端的服务要求,反正只要有要求来的时候,通常就是各式各样的 daemons 负责去唤起应该要工作的 Servers 来工作啦!那么 daemons 目前有两种基本的模式,分别是 stand_alone 与 super daemon 两种方式:
* stand_alone : 就字面上的意思来说,stand alone 就是『独立的启动』的意思,也就是说,该 daemon 启动之后,就直接常驻在内存当中啰!他虽然会一直的占用系统的资源,但最大的优点就是,他会一直启动的啦!所以当有要求来的时候,他就会很快速的响应啰!常常用在这一种 daemon 的网络服务如常见的 httpd 这一个即是一例!
* super daemon : 相对于 stand alone 的执行方式,这一种服务的启动方式则是藉由统一的一个 daemon 来负责唤起该服务!这一个统一负责的 daemon 就是 inet 这支服务啦!不过,在后来的 Linux 发展套件中,则是使用 xinet 这个设定啰!我们这里以 Mandrake 的 xinet 来做说明。当有网络的服务要求来的时候,该要求会先送给 xinet 这个服务,然后 xinet 根据该网络要求送来的数据封包的内容 ( 该内容会记录 IP 与 port ) 来将数据封包送给实际运作的服务!而该服务这个时候才会启动的!最常见到的就是 ftp 这支网络服务啦!这种最大的优点就是当没有数据封包来的时候,该服务不会一直占据系统资源 ( 该服务会在 sleeping 的状态吧! ) ,但是相对的,他的反应时间也会比较慢,因为还要花费一段时间去『唤醒』该服务呀!
那么这两种启动的方式哪一个比较好呢?见仁见智啦!而且还要看该主机的工作负荷与实际的用途说!例如当你的主机是用来作为 WWW 服务器的,那么 httpd 自然就以 stand alone 的启动方式较佳!事实上,我们常常开玩笑的说明 stand alone 与 super daemon 的情况,可以银行的窗口来作为说明的范例!
* stand alone : 在银行里面,假设有一种单一服务的窗口,例如存钱窗口,所以,当你需要存钱的时候,直接前往该窗口,就有『专人』为您服务啦!
* super daemon :在银行里面假设还有另外一种复合型态的窗口,同时提供转帐、资金调度、提款等等的业务,那当你需要其中一项业务的时候,就需要前往该窗口,但是坐在窗口的这个营业员,拿到你的需求单之后,往后面一丢『喂!那个转帐的仁兄!该你的工作了』那么那个仁兄就开始工作去!然而里头还有资金调度与提款等负责业务的仁兄呢?他们在干嘛?嘿嘿!看看报、喝喝茶啰!那么这里就会引出另外一个问题啦!假设银行今天的人潮特别的汹涌,所以这个窗口后面除了你之外还有很多的人!那么想一想,这个窗口是要『一个完成再来下一个』还是『全部都把你们的单据拿来,我全部处理掉』呢?呵呵!是不是不太一样?
o multi-threaded:就是我们提到的,全部的客户之要求都给他拿来,一次给他交办下去,所以一个服务同时会负责好几个程序。
o single-threaded:这个就是目前我们『人类的银行』最常见的方式啦,不论如何,反正一个一个来,第一个没有处理完之前,后面的请排队!嘿嘿!所以如果 client 的要求突然大增的话,那么这些晚到的 client 可得等上一等!
另外,需要注意的是,既然银行里头有这两种窗口同时存在,所以啰,在 Linux 系统里面,这两种 daemon 是可以同时存在的啦!也就是说,某些服务可以使用 stand alone 来启动,而有其它的服务则可以使用 xinet ( 或者是 inet ) 大致的情况就是这样啦!了呼!?
* /etc/services
OOK!这个时候就又发生了另一个问题啰!那么我怎么知道要将我的数据送到那个窗口去!咦!那个窗口不是有写说明说他是干嘛用的吗?所以你要存钱、转帐、或者是进行汇款,都可以在不同的窗口来完成,那么换到实际的网络情况来说呢,因为我们的 TCP 封包里面含有 port 与 IP 对吧!将那些已经监听的 port 想成是这些窗口,如此一来你的 TCP 封包便可以依据不同的需求,而到达不一样的 port 来索取服务了!因此,你的联机是 FTP, WWW, smtp 等等都好,绝对不会被搞错啦!
好了,如果我想要知道这个 port 是由那个服务所启动的呢?在 Linux 系统里面有个档案在说明那个窗口与服务的 ( services and ports ) 对应!呵呵!那就是鼎鼎大名的 /etc/services 这个档案啦!我们取一段常常看到的 port 与相关服务的区段来看一下好了!
[root @test root]# vi /etc/services
.... 略
ftp-data 20/tcp
ftp-data 20/udp
ftp 21/tcp
ftp 21/udp
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
telnet 23/udp
smtp 25/tcp mail
smtp 25/udp mail
nameserver 42/tcp name # IEN 116
nameserver 42/udp name # IEN 116
domain 53/tcp nameserver # name-domain server
domain 53/udp nameserver
.... 略
<daemon name> <port 与型态> < 该服务的说明 >
像上面说的是,第一栏为 daemon 的名称、第二栏为该 daemon 所使用的 port 号码与其网络数据封包传送时候的类型,主要为较稳定的 tcp 封包与较易破损但较快速之 udp 封包!举个例子说,那个 e-mail 的发信协议为 smtp 这个服务,而这个服务的使用之 port 即为 25 啦!就这样!
o 请特别注意!虽然有的时候您可以藉由修改 /etc/services 来更改一个服务的 port 号,不过并不建议如此做,因为很有可能会造成一些协议的错误情况!这里特此说明一番呦!(除非您要架设一个地下网站,否则的话,使用 /etc/services 原先的设定就好啦!)
* Daemon 的命名规则:
每一个服务的开发者,当初在开发他们的服务时,都有特别的故事啦!不过,无论如何,这些服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d ,例如例行性命令的建立的 at, 与 cron 这两个服务,通常会被称为 atd 与 crond,这个 d 代表的就是 daemon 的意思。所以,在资源管理那一章中,我们使用了 ps 与 top 来观察程序时,都会发现到很多的 xxxd 的程序,呵呵!通常那就是一些 daemon 的程序啰!
系统的 Daemons 放在哪里:
好了!那么我们已经知道了 daemon 的作用之后,再来要讨论的是,那么他们启动的 scripts 是放在哪里呀!?呵呵!底下就来说一说啰:
* stand alone : 这个放置在 /etc/rc.d/init.d/ 这个目录里面,几乎所有的 RPM 安装的套件之启动项目都在这里啦!
* super daemon : 这个工作的那一支服务其实就是 xinet 或者是 inet 啦!请注意, xinet 也是一个 daemon 呢!他是 stand alone 启动的,也就是他会一直在监听大家的需求,所以 xinet 的启动 scripts 写在 /etc/rc.d/init.d/xinetd 这个 scripts 里面啰!但是挂在这个 daemon 里头的服务之设定项目呢?嗯!就是写在 /etc/xinetd.conf 与 /etc/xinetd.d/ 这个目录里面的任何档案!
* /etc/rc.d/init.d/*
OK!先来了解一下 stand alone 的 daemon 是怎么启动的呢?!很简单,假如我们要启动 syslog 这支记录登录文件的服务,那么要启动他的话,就直接下达:
o /etc/rc.d/init.d/syslog start
o service syslog start
亦即是档名之后加上 start 即可,或者是使用 Red Hat 才有的这个 service script 来进行启动的功能!如果你还记得我们前几节提到过的 shell scripts 的话,那么或许还记得 case ..... esac 这个有选择性的项目的语法吧!?没错!这几支服务就是以 bash scripts 里头的 case 语法写成的!因此,只要加上后面的参数,如此一来, scripts 就会自动的去找寻执行档来执行啰!如果有兴趣的话,可以在你的系统里面的该目录下开一个档案来观看一下,就知道如何写啰!
* /etc/xinetd.conf
这个档案就是设定 xinet 服务的参数档案啦!
* /etc/xinetd.d/*
这个目录里面的所有档案就是个别挂上 xinet 的所有服务啦!例如赫赫有名的 wu-ftpd 及 telnet 与 pop3 等等!
解析 xinetd.conf
一般而言,在 /etc/rc.d/init.d/ 里面的 scripts 都是发展者之 RPM 所提供的,如果您有兴趣自行发展你的软件的话,那么可以直接以这样的方式来独立启动的!不过,我们也可以经由 super daemon 来管理我们的服务,因为这个 super daemon 可以提供相当多的功能,尤其是安全性方面的功能,所以,我们就来谈一谈如何使用这个东西吧!
先来看一看预设的 /etc/xinetd.conf 这个档案的内容是什么吧!
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
includedir /etc/xinetd.d
内容格式:
service <service_name>
{
<attribute> <assign_op> <value> <value> ...
...
}
在上面的预设范例当中,说明的是:『如果没有指定的 services ( defaults ) 那么就用 {} 里面的设定来执行之!』正常的情况之下有点像上面例子中的黄色字体所示,那个 <> 里头的数据我们先来说明一下:注:那个 assign_op 主要有三种形式,分别如下:
= : 表示后面的设定参数就是这样啦!
+= : 表示后面的设定为『在原来的设定里头加入新的参数』
-+ : 表示后面的设定为『在原来的参数舍弃这里输入的参数!』
用途不太相同,敬请留意呦!好了!底下再来说一说那些 attribute 与 value !
attribute
(功能)
assing_op
(允许的动作)
说明
(范例)
一般设定项目:
disable
yes
no
允许该 server 可以执行或者是不能执行!
当设定为 yes 表示该服务不能执行!
socket_type
stream
dgram
raw
当联机为 TCP 封包时,则使用 stream 类型
当联机为 UDP 封包时,则使用 dgram 类型
raw 代表 server 需要与 IP 直接对谈!
protocol
tcp
udp
...
这个东西说的是,联机的状态使用的是哪一种协议!?各个协议的代号可以参考 /etc/protocols 内容!此外,除非是你自己设定的服务,否则这个可以不用设定啦!
wait
yes
no
这就是我们刚刚提到的 Multi-threaded 与 single-threaded 的方式啦!一般来说,我们希望大家的要求都可以同时被启用,所以可以设定 wait = no
user
UID
root
还记得我们在 账号管理 那一篇提到的 UID 概念吗?对啦!这个 UID 就是那个 UID 啦!要注意的是,假如你的服务启动者不要以 root 为主的话,那么这个地方就可以改变其它的使用者,例如 nobody !这个咚咚也会有安全防护的机制存在!此外,需要注意这个 UID 必须存在于 /etc/passwd 。
group
GID
跟 user 的意思相同!只是这个 GID 的使用者也必须存在于 /etc/group 当中!
instances
number
UNLIMITED
这个是『在同一时间之内,同一个服务可以允许的联机数目』的意思,你可以写入一个『数字』来控制联机数目,也可以使用 UNLIMITED 来告诉系统『没有上限』啰!例如你在同时段之内仅允许 ftp 联机有 30 个,那么这里就可以输入 30 啦!
nice
-19 ~ 19
还记得我们在 程序管理 里面谈到的那个 nice 指令吗?!对啦!这里就是这个东西啰!数字越小( 负值 )代表该程序越优先被执行!
server
program
/usr/sbin/in.ftpd
这个就是指出这个服务的启动程序!例如要启动 ftp 的话,其实就是 in.ftpd 这支程序啦!所以这个时候在这里输入 server = /usr/sbin/in.ftpd
server_args
一些参数
这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 in.ftpd 当中,我们可能就需要输入 -l -a 这个参数说!
log_on_success
PID
HOST
USERID
EXIT
DURATION
在『成功登入』之后,需要记录的项目:PID为纪录该 server 启动时候的 process ID ,HOST 为远程主机的 IP、USERID 为登入者的账号、EXTI 为离开的时候记录的项目、DURATION 为该使用者使用此服务多久?
log_on_failure
HOST
USERID
ATTEMPT
RECORD
当登入失败之后被 syslog 登入的项目:HOST为远程主机的 IP,USERID为登入者账号、ATTEMPT为记录登入失败者企图的意图为何、RECORD为记录远程主机的信息!以及为何本机 server 不能启动的原因!主要有 login, shell, exec, finger 等指令可以使用在这里!( 基本上,可以在 /etc/hosts.allow 或 /etc/hosts.deny 书写内容 )。
进阶设定项目:
env
'name=value'
这一个项目可以让你设定环境变量,环境变量的设定规则可以参考 认识 BASH Shell 。
port
number
这里可以设定不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与 /etc/services 内记载的相同才行!
redirect
IP_Address port
将 client 端对我们 server 的要求,转到另一部主机上去!呵呵!这个好玩呦!例如当有人要使用你的 ftp 时,你可以将他转到另一部机器上面去!那个 IP_Address 就代表另一部远程主机的 IP 啰!
includedir
directory_path
表示将某个目录底下的所有档案都给他塞进来 xinetd.conf 这个设定里头!这东西有用多了,如此一来我们可以一个一个设定不同的项目!而不需要将所有的服务都写在 xinetd.conf 当中!你可以在 /etc/xinetd.conf 发现这个设定呦!
安全控管项目:
bind
IP_Address
这个是设定『允许使用此一服务的适配卡』的意思!举个例子来说,你的 Linux 主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2 不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰!
interface
IP_Address
跟 bind 相同!
only_from
0.0.0.0
192.168.1.0/24
host_name
domain_name
这东西用在安全机制上面,也就是管制『只有这里面规定的 IP 或者是主机名称可以登入!』如果是 0.0.0.0 表示所有的 PC 皆可登入,如果是 192.168.1.0/24 则表示为 C class 的网域!亦即由 192.168.1.1 ~ 192.168.1.255 皆可登入!另外,也可以选择 domain name ,例如 .ev.ncku.edu.tw 就可以杜绝成大环工系的网域 IP 登入你的主机使用该 server !
no_access
0.0.0.0
192.168.1.0/24
host_name
domain_name
跟 only_from 差不多啦!就是用来管理可否进入你的 Linux 主机启用你的 server 服务的管理项目! no_access 表示『不可登入』的 PC 啰!
access_times
00:00-12:00
HH:MM-HH:MM
这个项目在设定『该服务 server 启动的时间』,使用的是 24 小时的设定!例如你的 ftp 要在 8 点到 16 点开放的话,就是: 08:00-16:00。
umask
000
777
022
还记得在 档案权限 里面约略提过的 umask 这个东西吗?呵呵!没错!就是那个鬼玩意儿啰!可以设定使用者建立目录或者是档案时候的属性!系统建议值是 022 。
当然上面的参数不需要每个都设定啦!只要设定需要的就可以啦!而在 /etc/xinetd.conf 这个档案当中,一定会看到『 includedir = /etc/xinetd.d 』这一行!这说明的是,除了 /etc/xinetd.conf 之外,所有在 /etc/xinetd.d 的档案都是可以用来设定的啦!!好了,我们来举个简单的 telnet 的例子吧!那就是 /etc/xinetd.d/telnet 这个档案,如果你的 Mandrake 9.0 当中没有这个档案,那表示还没有安装telnet-server-krb5-1.2.5-1mdk这个套件,请先安装他吧!然后,他的内容有点像这样:
service telnet
{
disable = yes <==服务预设是关闭的
flags = REUSE <==额外使用的参数
socket_type = stream <==使用 tcp 封包常用的联机型态
wait = no <==不需等待,可以同时允许多个联机
user = root <==启动程序的使用者身份
server = /usr/sbin/telnetd <==服务启动的程序
server_args = -a none <==上面那个程序的参数
log_on_failure += USERID <==错误登入时,要记录下来的内容
}
上面的表格中,已经说明了每一项参数的意义!如果原本的默认值你并不满意,那么你可以修改成比较安全与多一点机制。假设你这个 Linux 是一部主机,而且他有两块网络接口,分别是对外的 140.116.44.125 与对内的 192.168.0.254 这两个,如果你想要让对内的接口限制较松,而对外的限制较严格,你可以这样的来设定呢:
# 先针对对内的较为松散的限制来设定:
service telnet
{
disable = no <==预设就是启动 telnet 服务
bind = 192.168.0.254 <==只允许经由这个适配卡的封包进来
only_from = 192.168.0.0/24 <==只允许 192.168.0.0/24 这个网段
的主机联机进来使用 telnet 的服务
instances = UNLIMITED <==同时允许联机不限制!
nice = 0 <==使用的优先级较高
flags = REUSE <==额外使用的参数
socket_type = stream <==使用 tcp 封包常用的联机型态
wait = no <==不需等待,可以同时允许多个联机
user = root <==启动程序的使用者身份
server = /usr/sbin/telnetd <==服务启动的程序
server_args = -a none <==上面那个程序的参数
log_on_failure += USERID <==错误登入时,要记录下来的内容
}
# 再针对外部的联机来进行限制呢!
service telnet
{
disable = no <==预设就是启动 telnet 服务
bind = 140.116.44.125 <==只允许经由这个适配卡的封包进来
only_from = 140.116.0.0/16 <==只允许 140.116.0.0 ~ 140.116.255.255
这个网段联机进来使用 telnet 的服务
only_from = .edu.tw <==重复设定,只有教务界才能联机!
no_access = 140.116.32.{10,26} <==不许这些 PC 登入
access_times = 1:00-9:00 20:00-23:59
<==每天只有这两个时段开放服务
umask = 022 <==建立档案时的预设属性设定
instances = 10 <==同时只允许 10 个联机
nice = 10 <==使用的优先级较低
flags = REUSE <==额外使用的参数
socket_type = stream <==使用 tcp 封包常用的联机型态
wait = no <==不需等待,可以同时允许多个联机
user = root <==启动程序的使用者身份
server = /usr/sbin/telnetd <==服务启动的程序
server_args = -a none <==上面那个程序的参数
log_on_failure += USERID <==错误登入时,要记录下来的内容
}
呵呵!如上面的设定,我们可以将 telnet 的启动项目进行更多的限制!如此一来,将有助于我们的安全防护呢!尤其如果可以针对不同的接口来设定,嘿嘿!就更加的棒啰!不过,请注意喔!如果照上面的设定,那么您的主机上面将会开了两个 23 port 的接口,分别是给两个接口来使用的呢!嗯!真好玩?同样的,你也可以针对自己的喜好来设定你的其它 daemon 使他挂在 xinetd 底下呢!
TCP_Wrappers
好了,接着下来我们要来说一说,除了 xinetd 之外,还有另一个可以抵挡利用某些服务进入 Linux 主机的方法,那就是常常使用的 /etc/hosts.allow 与 /etc/hosts.deny 啰!这个方式是我们常常在使用的方法,这里先提几个比较简单的设定方式!注: TCP_Wrappers 也可以当成一个最内层的防火墙了,因为是最内层,所以当然要设定的比较严格啰!
为什么叫做 TCP_Wrappers 呢?那么 wrappers 有包裹的意思,所以说,这个套件本身的功能就是在分析 TCP 网络数据封包啦!那么刚刚我们稍微提到我们网络的封包数据主要是以 TCP 封包为主,这个 TCP 封包的文件头至少记录了来源与目主机的 IP 与 port ,因此,若藉由分析 TCP 封包,就可以比对看我要不要让这个数据进入到主机里面来啰!所以啦,我们要使用 TCP_Wrappers 来控管的,就是
1. 来源 IP
2. port (就是服务啦)
TCP_Wrappers 设定 TCP 封包是否可以进入的设定档在 /etc/hosts.allow 与 /etc/hosts.deny 当中。因此,基本上,如果一个服务是受到 xinetd 或 TCP_Wrappers 的控制时,那么该服务就会受限于 hosts.allow 与 hosts.deny 的管理了!而如果你自己安装的套件当中( 亦即使用 Tarball 安装的方式之套件 ),除非有自行定义支持 TCP_Wrappers 的功能 ,否则就无法使用这个玩意啰!嘿嘿!
那么这两个档案是干嘛用的?刚刚不是提过哪!他主要是用来规范 TCP 封包的规则的,所以呢,里面记录的当然就是:『某些 IP 在特定服务中是否能够进入主机』!那么要怎么写?这两个档案的内容基本的语法是:
<service> : <IP, domain, hostname...> : <allow|deny>
所以我们要先找出来那个 service_name 才行,例如以我们刚刚的 telnet 为例,那个 service_name 是什么呢?其实指的就是上表中 server 这个设定后面接的程序名称啦!所以, telnet 在 Mandrake 底下的名称为 telnetd ( 注意,在其它的 distribution 中,这个名称可能会变,例如 Red Hat 或 OpenLinux 都是以 in.telnetd 为名!所以这里请参考您的系统里面的设定而定!)。因此,如果你不想让 140.116.44.202 这个地址及 140.116.32.0/255.255.255.0 这个 C class 的网域进入你的主机的话,那么可以这样在 /etc/hosts.deny 里面设定:
[root @test root]# vi /etc/hosts.deny
telnetd: 140.116.44.202 : deny
telnetd: 140.116.32.0/255.255.255.0 : deny
这样一来,对方就无法以 telnet 进入你的主机啦!方便吧!不过,既然如此,为什么要设定成 /etc/hosts.allow 及 /etc/hosts.deny 两个档案呢?呵呵!基本上,他们两个的关系为:
1. 当档案 /etc/hosts.allow 存在时,则先以此档案内之设定为准;
2. 而在 /etc/hosts.allow 没有规定到的事项,将在 /etc/hosts.deny 当中继续设定!
也就是说, /etc/hosts.allow 的设定优先于 /etc/hosts.deny 啰!了解了吗?基本上,只要 hosts.allow 也就够了,因为我们可以将 allow 与 deny 都写在同一个档案内,只是这样一来似乎显得有点杂乱无章,因此,通常我们都是:
1. 允许进入的写在 /etc/hosts.allow 当中;
2. 不许进入的则写在 /etc/hosts.deny 当中。
再强调一次,那个 service_name 『必需』跟你的 xinetd 或者是 /etc/rc.d/init.d/* 里面的程序名称要相同。好了,我们还是以 telnet 为例子来说明好了,现在假设一个比较安全的流程来设定,就是:
1. 只允许 140.116.44.0/255.255.255.0 与 140.116.79.0/255.255.255.0 这两个网域,及 140.116.141.99 这个主机可以进入我们的 telnet 服务器;
2. 此外,其它的 IP 全部都挡掉!
这样则首先可以设定 /etc/hosts.allow 这个档案成为:
[root @test root]# vi /etc/hosts.allo
telnetd: 140.116.44.0/255.255.255.0 : allow
telnetd: 140.116.79.0/255.255.255.0 : allow
telnetd: 140.116.141.99 : allow
再来,设定 /etc/hosts.deny 成为『全部都挡掉』的状态:
[root @test root]# vi /etc/hosts.deny
telnetd: ALL : deny
那个 ALL 代表『全部』的意思!呵呵!很棒吧!那么有没有更安全的设定,例如,当当有其它人扫瞄我的 telnet port 时,我就将他的 IP 记住!以做为未来的查询与认证之用!那么你可以将 /etc/hosts.deny 这个档案改成这个样子:
[root @test root]# vi /etc/hosts.deny
telnetd: ALL : spawn (echo Security notice from host `/bin/hostname`; \
echo; /usr/sbin/safe_finger @%h ) | \
/bin/mail -s "%d-%h security" root & \
: twist ( /bin/echo -e "\n\nWARNING connection not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登入,您的联机将会被纪录,并且作为以后的参考\n\n ". )
在上面的例子中,黄色字体字『 root 』,可以写成你的个人账号或者其它 e-mail ,以免很少以 root 身份登入 Linux 主机时,容易造成不知道的情况,另外,最后几行,亦即 :twist 之后的那几行为同一行。如此一来,当未经允许的计算机尝试登入你的主机时,对方的屏幕上就会显示上面的最后一行,并且将他的 IP 寄到 root (或者是你自己的信箱)那里去!(注:某些没有安装 tcp_wrappers 的套件之 distribution 中,由于没有 safe_finger 等程序,所以无法执行相关的功能,这点还请多加注意呢!)
系统开启的服务
好了,现在假设您已经知道了 daemons 的启动档案放置的目录,也知道了服务与 port 的对应,那么要如何查询目前系统上面已经启动了的服务呢?不要再打混了!已经学过了 ps 与 top 应该要会应用才对耶!呵呵!没错,可以使用 ps 与 top 来找寻已经启动了的服务的程序与他的 PID 呢!不过,我们怎么知道该服务启动的 port 是哪一个?呵呵!好问题!可以直接使用 netstat 这个网络状态观察指令来检查我们的 port 呢!甚至他也可以帮我们找到该 port 的程序呢( PID )!好了,那么我们就来试看看这个指令的用法吧!
* netstat
[root @test /root]# netstat [-r] [-i interface]
[root @test /root]# netstat [-antulp]
参数说明:
-r :显示出 route 的意思;
-i :显示出 interface 的内容,跟 ifconfig 类似啦!
-a :显示出目前所有的网络联机状态!
-n :预设情况中,显示出的 host 会以 host name 来显现,若为 n 则可以使 port 与 host 都以数字显示
-t :仅显示 tcp 封包的联机行为
-u :仅显示 udp 的封包联机状态
-l :仅显示 LISTEN 的内容
-p :同时显示此一联机的 PID 喔!(注意:只有 root 才能行使此功能!)
范例:
[root @test /root]# netstat -r <==嘿嘿!显示出目前的路由表!
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
140.116.141.253 * 255.255.255.255 UH 40 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 40 0 0 eth0
192.168.0.0 * 255.255.255.0 U 40 0 0 eth0
127.0.0.0 * 255.0.0.0 U 40 0 0 lo
default 140.116.141.253 0.0.0.0 UG 40 0 0 ppp0
[root @test /root]# netstat -i eth0 <==看看底下显示出的内容,是否跟 ifconfig eth0 类似呀!?
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 077199373 0 0 169616342 0 0 0 BMRU
lo 16436 0 1130485 0 0 0 1130485 0 0 0 LRU
[root @test /root]# netstat -an <==显示所有的联机状态,并且以数字型态显示
[root @test /root]# netstat -tul<==显示 LISTEN 的及 tcp 与 udp 的联机状态,如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:mysql *:* LISTEN
tcp 0 0 *:netbios-ssn *:* LISTEN
tcp 0 0 *:pop3 *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 *:ftp *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
udp 0 0 *:netbios-ns *:*
注意:上面的 LISTEN 表示该 port 是已经在 监听 网络服务啦!而左边的 tcp 指的是 tcp 封包!
[root @test /root]# netstat -anp | more<==这个指令很常下达!请记得呦!
netstat 可是很了不起的指令,一定要学会的!尤其他可以让我们了解目前的你的主机的联机状态!与开启的 port 有哪些!所以一定得学会才行呀!如果你分别下达:
netstat -a | more
netstat -an | more
一定会发现有点奇怪?怎么有的 port 会以服务名称(例如上面例子里的 pop3 ...)有的会以 port 号码来显示呢!?嘿嘿!那就是 /etc/services 以及 -n 这个参数的用途啦!你可以发现的是,如果 netstat -a 时,显示出来的 port 号码在 /etc/services 存在对应的服务名称的时候,那么预设他就会显示出该服务名称啦!但是若在 /etc/services 找不到档案的话,那么自然就还是以 port 号码来显示的!那么加上了 -n 参数后,不论如何,他都会以 port 及 IP 来显示啦!
另外,那个 -p 也很有用呦!尤其是在一些莫名其妙的联机出现时,可以用 netstat –anp | more查到 PID ,然后再以我们之前谈到的 系统资源管理 部分,利用 kill 来杀掉该 PID 的程序! 此外,使用 netstat –tlp 也可以得到目前在 LISTEN 的 port 的服务名称,嘿嘿!那样就可以知道该 port 是那个程序来启动的!很便利ㄋㄟ?
o Proto:指的是封包或者是通讯协议啦! tcp , udp 是常见的呦!
o Local Address:本地端的 IP 与 Port 号,如果 /etc/services 存在对应服务名称,就以服务名称显示;
o Foreign Address :监听哪一个地区与 port ;
o state:状态列就很多啦!基本的有:
+ LISTEN :亦即监听状态中的 port !
+ ESTABLISHED:已建立联机的联机情况
+ TIME_WAIT:该联机在目前已经是等待的状态了!随时有可能会断线呦!
善用 netstat 可以查得相当多的网络信息!尤其在关闭本机的 port 时!假设我要将 ftp 关闭掉,那么要使用 ntsysv, chkconfig 以及看一下 /etc/rc.d/rc.local 里头的设定啰!请注意,这个时候仅是将『开机预设启动关闭』而已,并没有实际关闭目前的服务,假设您发现 ftp 还在启动的项目,你要将他关闭,那么就必须:
1. 使用 ntsysv 或 chkconfig 将 wu-ftpd 前面的符号关闭掉;
2. 跳出之后,以 /etc/rc.d/init.d/xinet restart 或者是 service xinet restart 来重新启动 xinet 这个服务;
3. 再以 netstat -a | more 看一下 ftp 是否还在 LISTEN 呢?
这样才能关闭呢!同理可证啰!要关闭 sshd 怎么关?!嘿嘿!自己测试看看啰!(注意:事实上,在 Linux 系统中,要『开或关某个 port 』,就是需要『启动或关闭某个服务』啦!因此,你可以找出某个 port 对应的服务,程序对应的服务,进而启动或关闭他,那么那个经由该服务而启动的 port ,自然就会关掉了!)
各个服务的简单说明
底下是一些 linux 系统上面常见的 daemons ,大家可以参考看看呦!
服务名称
# 参数档
# 预设使用 port 号
# 说明
# 是否需要执行
anacron
# /etc/anacrontab
# 没有使用 port 号
# 当你的 Linux 主机并不是全天候开机的时候,这个 anacron 就可以帮你执行在『 crontab 』既定的时间内没有执行的工作!举个例子来说,当你的主机在晚上 12:00 会自动关闭,但是偏偏 crontab 这个例行性工作是在 4:00 工作,这个时候例行性工作不是都没有做到吗?嗯! anacron 就可以使用啦!
# 如果主机已经 24 小时开机,而且执行了 cron ,那么这个程序就不需要启动了。
apmd
* /etc/sysconfig/apmd
* 没有使用 port 号
* apmd 是 Adventage Power Management daemon 的缩写,顾名思义,可以用来了解系统的『电池电量』,如果对于手提式计算机才有需要吧我想!
* 基本上,我们使用的桌上型或者是一直开机的机型,大致上不需要使用此一 daemon。
arpwatch
* /etc/sysconfig/arpwatch
* 没有使用
* 这是用来持续监测网络卡的『 Hardware IP (MAC) 与 Software IP (TCP/IP 那个 IP) 』对应的 daemon,还可以提供 e-mail 通知系统管理员呦!
* 一般的主机不太需要这个 daemon 啦!
atd
* /etc/at.allow, /etc/at.deny
* 没有使用 port 号
* 这个总该不陌生了吧!就是单一使用的例行性命令啰!如果忘记了!赶紧去查看一下!
* 这个通常需要启动啦!不过,如果你一般都是使用 cron ,那么这个东西不启动影响也不很大!
autofs
* /etc/rc.d/init.d/autofs
* 没有使用 port 号
* 这个东西使用在自动挂载一些装置的 daemon
* 不需要开启!
xinet
chargen
chargen-udp
* 这东西主要的 port 号是 19 号;
* 主要的功能在于提供类似远程打字的咚咚吧!我也不是很懂说....
* 一般来说,不用启动啦!
crond
* /etc/crontab
* 没有使用 port
* 用来执行 例行性命令 的 daemon!
* 务必启动!
xinet
daytime
daytime-udp
* 这东西使用 13 port 号!
* 用来作为 daytime 的服务(我也不清楚,请来信告知耶!)
* 不用启动
xinet
echo
echo-udp
* 使用 port 7
* 不用启动啦!
xinet
finger
* /etc/xinetd.d/finger
* port 79
* 最大的功能就是让远程的使用者可以查看本地端的使用者信息
* 由于有安全上的顾虑,没有必要的话,不要启动!
gpm
* /etc/sysconfig/mouse
* 没有使用 port 号
* 在文字模式里面可以使用 mouse 来从事『复制、贴上、移动光标』等等的功能!
* 没必要的话,建议是『关闭』!
httpd
* /etc/httpd/conf/httpd.conf
* 使用 80 port 以及(或) 443
* 这个就是鼎鼎大名的 WWW 主机服务开启的程序啦!
* 看你的需求啰!有 WWW 则必须要启动!
Linux 主机常常会收到一些要求,不论是来自本机系统的要求或者是网络 Client 端的服务要求,反正只要有要求来的时候,通常就是各式各样的 daemons 负责去唤起应该要工作的 Servers 来工作啦!那么 daemons 目前有两种基本的模式,分别是 stand_alone 与 super daemon 两种方式:
* stand_alone : 就字面上的意思来说,stand alone 就是『独立的启动』的意思,也就是说,该 daemon 启动之后,就直接常驻在内存当中啰!他虽然会一直的占用系统的资源,但最大的优点就是,他会一直启动的啦!所以当有要求来的时候,他就会很快速的响应啰!常常用在这一种 daemon 的网络服务如常见的 httpd 这一个即是一例!
* super daemon : 相对于 stand alone 的执行方式,这一种服务的启动方式则是藉由统一的一个 daemon 来负责唤起该服务!这一个统一负责的 daemon 就是 inet 这支服务啦!不过,在后来的 Linux 发展套件中,则是使用 xinet 这个设定啰!我们这里以 Mandrake 的 xinet 来做说明。当有网络的服务要求来的时候,该要求会先送给 xinet 这个服务,然后 xinet 根据该网络要求送来的数据封包的内容 ( 该内容会记录 IP 与 port ) 来将数据封包送给实际运作的服务!而该服务这个时候才会启动的!最常见到的就是 ftp 这支网络服务啦!这种最大的优点就是当没有数据封包来的时候,该服务不会一直占据系统资源 ( 该服务会在 sleeping 的状态吧! ) ,但是相对的,他的反应时间也会比较慢,因为还要花费一段时间去『唤醒』该服务呀!
那么这两种启动的方式哪一个比较好呢?见仁见智啦!而且还要看该主机的工作负荷与实际的用途说!例如当你的主机是用来作为 WWW 服务器的,那么 httpd 自然就以 stand alone 的启动方式较佳!事实上,我们常常开玩笑的说明 stand alone 与 super daemon 的情况,可以银行的窗口来作为说明的范例!
* stand alone : 在银行里面,假设有一种单一服务的窗口,例如存钱窗口,所以,当你需要存钱的时候,直接前往该窗口,就有『专人』为您服务啦!
* super daemon :在银行里面假设还有另外一种复合型态的窗口,同时提供转帐、资金调度、提款等等的业务,那当你需要其中一项业务的时候,就需要前往该窗口,但是坐在窗口的这个营业员,拿到你的需求单之后,往后面一丢『喂!那个转帐的仁兄!该你的工作了』那么那个仁兄就开始工作去!然而里头还有资金调度与提款等负责业务的仁兄呢?他们在干嘛?嘿嘿!看看报、喝喝茶啰!那么这里就会引出另外一个问题啦!假设银行今天的人潮特别的汹涌,所以这个窗口后面除了你之外还有很多的人!那么想一想,这个窗口是要『一个完成再来下一个』还是『全部都把你们的单据拿来,我全部处理掉』呢?呵呵!是不是不太一样?
o multi-threaded:就是我们提到的,全部的客户之要求都给他拿来,一次给他交办下去,所以一个服务同时会负责好几个程序。
o single-threaded:这个就是目前我们『人类的银行』最常见的方式啦,不论如何,反正一个一个来,第一个没有处理完之前,后面的请排队!嘿嘿!所以如果 client 的要求突然大增的话,那么这些晚到的 client 可得等上一等!
另外,需要注意的是,既然银行里头有这两种窗口同时存在,所以啰,在 Linux 系统里面,这两种 daemon 是可以同时存在的啦!也就是说,某些服务可以使用 stand alone 来启动,而有其它的服务则可以使用 xinet ( 或者是 inet ) 大致的情况就是这样啦!了呼!?
* /etc/services
OOK!这个时候就又发生了另一个问题啰!那么我怎么知道要将我的数据送到那个窗口去!咦!那个窗口不是有写说明说他是干嘛用的吗?所以你要存钱、转帐、或者是进行汇款,都可以在不同的窗口来完成,那么换到实际的网络情况来说呢,因为我们的 TCP 封包里面含有 port 与 IP 对吧!将那些已经监听的 port 想成是这些窗口,如此一来你的 TCP 封包便可以依据不同的需求,而到达不一样的 port 来索取服务了!因此,你的联机是 FTP, WWW, smtp 等等都好,绝对不会被搞错啦!
好了,如果我想要知道这个 port 是由那个服务所启动的呢?在 Linux 系统里面有个档案在说明那个窗口与服务的 ( services and ports ) 对应!呵呵!那就是鼎鼎大名的 /etc/services 这个档案啦!我们取一段常常看到的 port 与相关服务的区段来看一下好了!
[root @test root]# vi /etc/services
.... 略
ftp-data 20/tcp
ftp-data 20/udp
ftp 21/tcp
ftp 21/udp
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
telnet 23/udp
smtp 25/tcp mail
smtp 25/udp mail
nameserver 42/tcp name # IEN 116
nameserver 42/udp name # IEN 116
domain 53/tcp nameserver # name-domain server
domain 53/udp nameserver
.... 略
<daemon name> <port 与型态> < 该服务的说明 >
像上面说的是,第一栏为 daemon 的名称、第二栏为该 daemon 所使用的 port 号码与其网络数据封包传送时候的类型,主要为较稳定的 tcp 封包与较易破损但较快速之 udp 封包!举个例子说,那个 e-mail 的发信协议为 smtp 这个服务,而这个服务的使用之 port 即为 25 啦!就这样!
o 请特别注意!虽然有的时候您可以藉由修改 /etc/services 来更改一个服务的 port 号,不过并不建议如此做,因为很有可能会造成一些协议的错误情况!这里特此说明一番呦!(除非您要架设一个地下网站,否则的话,使用 /etc/services 原先的设定就好啦!)
* Daemon 的命名规则:
每一个服务的开发者,当初在开发他们的服务时,都有特别的故事啦!不过,无论如何,这些服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d ,例如例行性命令的建立的 at, 与 cron 这两个服务,通常会被称为 atd 与 crond,这个 d 代表的就是 daemon 的意思。所以,在资源管理那一章中,我们使用了 ps 与 top 来观察程序时,都会发现到很多的 xxxd 的程序,呵呵!通常那就是一些 daemon 的程序啰!
系统的 Daemons 放在哪里:
好了!那么我们已经知道了 daemon 的作用之后,再来要讨论的是,那么他们启动的 scripts 是放在哪里呀!?呵呵!底下就来说一说啰:
* stand alone : 这个放置在 /etc/rc.d/init.d/ 这个目录里面,几乎所有的 RPM 安装的套件之启动项目都在这里啦!
* super daemon : 这个工作的那一支服务其实就是 xinet 或者是 inet 啦!请注意, xinet 也是一个 daemon 呢!他是 stand alone 启动的,也就是他会一直在监听大家的需求,所以 xinet 的启动 scripts 写在 /etc/rc.d/init.d/xinetd 这个 scripts 里面啰!但是挂在这个 daemon 里头的服务之设定项目呢?嗯!就是写在 /etc/xinetd.conf 与 /etc/xinetd.d/ 这个目录里面的任何档案!
* /etc/rc.d/init.d/*
OK!先来了解一下 stand alone 的 daemon 是怎么启动的呢?!很简单,假如我们要启动 syslog 这支记录登录文件的服务,那么要启动他的话,就直接下达:
o /etc/rc.d/init.d/syslog start
o service syslog start
亦即是档名之后加上 start 即可,或者是使用 Red Hat 才有的这个 service script 来进行启动的功能!如果你还记得我们前几节提到过的 shell scripts 的话,那么或许还记得 case ..... esac 这个有选择性的项目的语法吧!?没错!这几支服务就是以 bash scripts 里头的 case 语法写成的!因此,只要加上后面的参数,如此一来, scripts 就会自动的去找寻执行档来执行啰!如果有兴趣的话,可以在你的系统里面的该目录下开一个档案来观看一下,就知道如何写啰!
* /etc/xinetd.conf
这个档案就是设定 xinet 服务的参数档案啦!
* /etc/xinetd.d/*
这个目录里面的所有档案就是个别挂上 xinet 的所有服务啦!例如赫赫有名的 wu-ftpd 及 telnet 与 pop3 等等!
解析 xinetd.conf
一般而言,在 /etc/rc.d/init.d/ 里面的 scripts 都是发展者之 RPM 所提供的,如果您有兴趣自行发展你的软件的话,那么可以直接以这样的方式来独立启动的!不过,我们也可以经由 super daemon 来管理我们的服务,因为这个 super daemon 可以提供相当多的功能,尤其是安全性方面的功能,所以,我们就来谈一谈如何使用这个东西吧!
先来看一看预设的 /etc/xinetd.conf 这个档案的内容是什么吧!
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
includedir /etc/xinetd.d
内容格式:
service <service_name>
{
<attribute> <assign_op> <value> <value> ...
...
}
在上面的预设范例当中,说明的是:『如果没有指定的 services ( defaults ) 那么就用 {} 里面的设定来执行之!』正常的情况之下有点像上面例子中的黄色字体所示,那个 <> 里头的数据我们先来说明一下:注:那个 assign_op 主要有三种形式,分别如下:
= : 表示后面的设定参数就是这样啦!
+= : 表示后面的设定为『在原来的设定里头加入新的参数』
-+ : 表示后面的设定为『在原来的参数舍弃这里输入的参数!』
用途不太相同,敬请留意呦!好了!底下再来说一说那些 attribute 与 value !
attribute
(功能)
assing_op
(允许的动作)
说明
(范例)
一般设定项目:
disable
yes
no
允许该 server 可以执行或者是不能执行!
当设定为 yes 表示该服务不能执行!
socket_type
stream
dgram
raw
当联机为 TCP 封包时,则使用 stream 类型
当联机为 UDP 封包时,则使用 dgram 类型
raw 代表 server 需要与 IP 直接对谈!
protocol
tcp
udp
...
这个东西说的是,联机的状态使用的是哪一种协议!?各个协议的代号可以参考 /etc/protocols 内容!此外,除非是你自己设定的服务,否则这个可以不用设定啦!
wait
yes
no
这就是我们刚刚提到的 Multi-threaded 与 single-threaded 的方式啦!一般来说,我们希望大家的要求都可以同时被启用,所以可以设定 wait = no
user
UID
root
还记得我们在 账号管理 那一篇提到的 UID 概念吗?对啦!这个 UID 就是那个 UID 啦!要注意的是,假如你的服务启动者不要以 root 为主的话,那么这个地方就可以改变其它的使用者,例如 nobody !这个咚咚也会有安全防护的机制存在!此外,需要注意这个 UID 必须存在于 /etc/passwd 。
group
GID
跟 user 的意思相同!只是这个 GID 的使用者也必须存在于 /etc/group 当中!
instances
number
UNLIMITED
这个是『在同一时间之内,同一个服务可以允许的联机数目』的意思,你可以写入一个『数字』来控制联机数目,也可以使用 UNLIMITED 来告诉系统『没有上限』啰!例如你在同时段之内仅允许 ftp 联机有 30 个,那么这里就可以输入 30 啦!
nice
-19 ~ 19
还记得我们在 程序管理 里面谈到的那个 nice 指令吗?!对啦!这里就是这个东西啰!数字越小( 负值 )代表该程序越优先被执行!
server
program
/usr/sbin/in.ftpd
这个就是指出这个服务的启动程序!例如要启动 ftp 的话,其实就是 in.ftpd 这支程序啦!所以这个时候在这里输入 server = /usr/sbin/in.ftpd
server_args
一些参数
这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 in.ftpd 当中,我们可能就需要输入 -l -a 这个参数说!
log_on_success
PID
HOST
USERID
EXIT
DURATION
在『成功登入』之后,需要记录的项目:PID为纪录该 server 启动时候的 process ID ,HOST 为远程主机的 IP、USERID 为登入者的账号、EXTI 为离开的时候记录的项目、DURATION 为该使用者使用此服务多久?
log_on_failure
HOST
USERID
ATTEMPT
RECORD
当登入失败之后被 syslog 登入的项目:HOST为远程主机的 IP,USERID为登入者账号、ATTEMPT为记录登入失败者企图的意图为何、RECORD为记录远程主机的信息!以及为何本机 server 不能启动的原因!主要有 login, shell, exec, finger 等指令可以使用在这里!( 基本上,可以在 /etc/hosts.allow 或 /etc/hosts.deny 书写内容 )。
进阶设定项目:
env
'name=value'
这一个项目可以让你设定环境变量,环境变量的设定规则可以参考 认识 BASH Shell 。
port
number
这里可以设定不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与 /etc/services 内记载的相同才行!
redirect
IP_Address port
将 client 端对我们 server 的要求,转到另一部主机上去!呵呵!这个好玩呦!例如当有人要使用你的 ftp 时,你可以将他转到另一部机器上面去!那个 IP_Address 就代表另一部远程主机的 IP 啰!
includedir
directory_path
表示将某个目录底下的所有档案都给他塞进来 xinetd.conf 这个设定里头!这东西有用多了,如此一来我们可以一个一个设定不同的项目!而不需要将所有的服务都写在 xinetd.conf 当中!你可以在 /etc/xinetd.conf 发现这个设定呦!
安全控管项目:
bind
IP_Address
这个是设定『允许使用此一服务的适配卡』的意思!举个例子来说,你的 Linux 主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2 不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰!
interface
IP_Address
跟 bind 相同!
only_from
0.0.0.0
192.168.1.0/24
host_name
domain_name
这东西用在安全机制上面,也就是管制『只有这里面规定的 IP 或者是主机名称可以登入!』如果是 0.0.0.0 表示所有的 PC 皆可登入,如果是 192.168.1.0/24 则表示为 C class 的网域!亦即由 192.168.1.1 ~ 192.168.1.255 皆可登入!另外,也可以选择 domain name ,例如 .ev.ncku.edu.tw 就可以杜绝成大环工系的网域 IP 登入你的主机使用该 server !
no_access
0.0.0.0
192.168.1.0/24
host_name
domain_name
跟 only_from 差不多啦!就是用来管理可否进入你的 Linux 主机启用你的 server 服务的管理项目! no_access 表示『不可登入』的 PC 啰!
access_times
00:00-12:00
HH:MM-HH:MM
这个项目在设定『该服务 server 启动的时间』,使用的是 24 小时的设定!例如你的 ftp 要在 8 点到 16 点开放的话,就是: 08:00-16:00。
umask
000
777
022
还记得在 档案权限 里面约略提过的 umask 这个东西吗?呵呵!没错!就是那个鬼玩意儿啰!可以设定使用者建立目录或者是档案时候的属性!系统建议值是 022 。
当然上面的参数不需要每个都设定啦!只要设定需要的就可以啦!而在 /etc/xinetd.conf 这个档案当中,一定会看到『 includedir = /etc/xinetd.d 』这一行!这说明的是,除了 /etc/xinetd.conf 之外,所有在 /etc/xinetd.d 的档案都是可以用来设定的啦!!好了,我们来举个简单的 telnet 的例子吧!那就是 /etc/xinetd.d/telnet 这个档案,如果你的 Mandrake 9.0 当中没有这个档案,那表示还没有安装telnet-server-krb5-1.2.5-1mdk这个套件,请先安装他吧!然后,他的内容有点像这样:
service telnet
{
disable = yes <==服务预设是关闭的
flags = REUSE <==额外使用的参数
socket_type = stream <==使用 tcp 封包常用的联机型态
wait = no <==不需等待,可以同时允许多个联机
user = root <==启动程序的使用者身份
server = /usr/sbin/telnetd <==服务启动的程序
server_args = -a none <==上面那个程序的参数
log_on_failure += USERID <==错误登入时,要记录下来的内容
}
上面的表格中,已经说明了每一项参数的意义!如果原本的默认值你并不满意,那么你可以修改成比较安全与多一点机制。假设你这个 Linux 是一部主机,而且他有两块网络接口,分别是对外的 140.116.44.125 与对内的 192.168.0.254 这两个,如果你想要让对内的接口限制较松,而对外的限制较严格,你可以这样的来设定呢:
# 先针对对内的较为松散的限制来设定:
service telnet
{
disable = no <==预设就是启动 telnet 服务
bind = 192.168.0.254 <==只允许经由这个适配卡的封包进来
only_from = 192.168.0.0/24 <==只允许 192.168.0.0/24 这个网段
的主机联机进来使用 telnet 的服务
instances = UNLIMITED <==同时允许联机不限制!
nice = 0 <==使用的优先级较高
flags = REUSE <==额外使用的参数
socket_type = stream <==使用 tcp 封包常用的联机型态
wait = no <==不需等待,可以同时允许多个联机
user = root <==启动程序的使用者身份
server = /usr/sbin/telnetd <==服务启动的程序
server_args = -a none <==上面那个程序的参数
log_on_failure += USERID <==错误登入时,要记录下来的内容
}
# 再针对外部的联机来进行限制呢!
service telnet
{
disable = no <==预设就是启动 telnet 服务
bind = 140.116.44.125 <==只允许经由这个适配卡的封包进来
only_from = 140.116.0.0/16 <==只允许 140.116.0.0 ~ 140.116.255.255
这个网段联机进来使用 telnet 的服务
only_from = .edu.tw <==重复设定,只有教务界才能联机!
no_access = 140.116.32.{10,26} <==不许这些 PC 登入
access_times = 1:00-9:00 20:00-23:59
<==每天只有这两个时段开放服务
umask = 022 <==建立档案时的预设属性设定
instances = 10 <==同时只允许 10 个联机
nice = 10 <==使用的优先级较低
flags = REUSE <==额外使用的参数
socket_type = stream <==使用 tcp 封包常用的联机型态
wait = no <==不需等待,可以同时允许多个联机
user = root <==启动程序的使用者身份
server = /usr/sbin/telnetd <==服务启动的程序
server_args = -a none <==上面那个程序的参数
log_on_failure += USERID <==错误登入时,要记录下来的内容
}
呵呵!如上面的设定,我们可以将 telnet 的启动项目进行更多的限制!如此一来,将有助于我们的安全防护呢!尤其如果可以针对不同的接口来设定,嘿嘿!就更加的棒啰!不过,请注意喔!如果照上面的设定,那么您的主机上面将会开了两个 23 port 的接口,分别是给两个接口来使用的呢!嗯!真好玩?同样的,你也可以针对自己的喜好来设定你的其它 daemon 使他挂在 xinetd 底下呢!
TCP_Wrappers
好了,接着下来我们要来说一说,除了 xinetd 之外,还有另一个可以抵挡利用某些服务进入 Linux 主机的方法,那就是常常使用的 /etc/hosts.allow 与 /etc/hosts.deny 啰!这个方式是我们常常在使用的方法,这里先提几个比较简单的设定方式!注: TCP_Wrappers 也可以当成一个最内层的防火墙了,因为是最内层,所以当然要设定的比较严格啰!
为什么叫做 TCP_Wrappers 呢?那么 wrappers 有包裹的意思,所以说,这个套件本身的功能就是在分析 TCP 网络数据封包啦!那么刚刚我们稍微提到我们网络的封包数据主要是以 TCP 封包为主,这个 TCP 封包的文件头至少记录了来源与目主机的 IP 与 port ,因此,若藉由分析 TCP 封包,就可以比对看我要不要让这个数据进入到主机里面来啰!所以啦,我们要使用 TCP_Wrappers 来控管的,就是
1. 来源 IP
2. port (就是服务啦)
TCP_Wrappers 设定 TCP 封包是否可以进入的设定档在 /etc/hosts.allow 与 /etc/hosts.deny 当中。因此,基本上,如果一个服务是受到 xinetd 或 TCP_Wrappers 的控制时,那么该服务就会受限于 hosts.allow 与 hosts.deny 的管理了!而如果你自己安装的套件当中( 亦即使用 Tarball 安装的方式之套件 ),除非有自行定义支持 TCP_Wrappers 的功能 ,否则就无法使用这个玩意啰!嘿嘿!
那么这两个档案是干嘛用的?刚刚不是提过哪!他主要是用来规范 TCP 封包的规则的,所以呢,里面记录的当然就是:『某些 IP 在特定服务中是否能够进入主机』!那么要怎么写?这两个档案的内容基本的语法是:
<service> : <IP, domain, hostname...> : <allow|deny>
所以我们要先找出来那个 service_name 才行,例如以我们刚刚的 telnet 为例,那个 service_name 是什么呢?其实指的就是上表中 server 这个设定后面接的程序名称啦!所以, telnet 在 Mandrake 底下的名称为 telnetd ( 注意,在其它的 distribution 中,这个名称可能会变,例如 Red Hat 或 OpenLinux 都是以 in.telnetd 为名!所以这里请参考您的系统里面的设定而定!)。因此,如果你不想让 140.116.44.202 这个地址及 140.116.32.0/255.255.255.0 这个 C class 的网域进入你的主机的话,那么可以这样在 /etc/hosts.deny 里面设定:
[root @test root]# vi /etc/hosts.deny
telnetd: 140.116.44.202 : deny
telnetd: 140.116.32.0/255.255.255.0 : deny
这样一来,对方就无法以 telnet 进入你的主机啦!方便吧!不过,既然如此,为什么要设定成 /etc/hosts.allow 及 /etc/hosts.deny 两个档案呢?呵呵!基本上,他们两个的关系为:
1. 当档案 /etc/hosts.allow 存在时,则先以此档案内之设定为准;
2. 而在 /etc/hosts.allow 没有规定到的事项,将在 /etc/hosts.deny 当中继续设定!
也就是说, /etc/hosts.allow 的设定优先于 /etc/hosts.deny 啰!了解了吗?基本上,只要 hosts.allow 也就够了,因为我们可以将 allow 与 deny 都写在同一个档案内,只是这样一来似乎显得有点杂乱无章,因此,通常我们都是:
1. 允许进入的写在 /etc/hosts.allow 当中;
2. 不许进入的则写在 /etc/hosts.deny 当中。
再强调一次,那个 service_name 『必需』跟你的 xinetd 或者是 /etc/rc.d/init.d/* 里面的程序名称要相同。好了,我们还是以 telnet 为例子来说明好了,现在假设一个比较安全的流程来设定,就是:
1. 只允许 140.116.44.0/255.255.255.0 与 140.116.79.0/255.255.255.0 这两个网域,及 140.116.141.99 这个主机可以进入我们的 telnet 服务器;
2. 此外,其它的 IP 全部都挡掉!
这样则首先可以设定 /etc/hosts.allow 这个档案成为:
[root @test root]# vi /etc/hosts.allo
telnetd: 140.116.44.0/255.255.255.0 : allow
telnetd: 140.116.79.0/255.255.255.0 : allow
telnetd: 140.116.141.99 : allow
再来,设定 /etc/hosts.deny 成为『全部都挡掉』的状态:
[root @test root]# vi /etc/hosts.deny
telnetd: ALL : deny
那个 ALL 代表『全部』的意思!呵呵!很棒吧!那么有没有更安全的设定,例如,当当有其它人扫瞄我的 telnet port 时,我就将他的 IP 记住!以做为未来的查询与认证之用!那么你可以将 /etc/hosts.deny 这个档案改成这个样子:
[root @test root]# vi /etc/hosts.deny
telnetd: ALL : spawn (echo Security notice from host `/bin/hostname`; \
echo; /usr/sbin/safe_finger @%h ) | \
/bin/mail -s "%d-%h security" root & \
: twist ( /bin/echo -e "\n\nWARNING connection not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登入,您的联机将会被纪录,并且作为以后的参考\n\n ". )
在上面的例子中,黄色字体字『 root 』,可以写成你的个人账号或者其它 e-mail ,以免很少以 root 身份登入 Linux 主机时,容易造成不知道的情况,另外,最后几行,亦即 :twist 之后的那几行为同一行。如此一来,当未经允许的计算机尝试登入你的主机时,对方的屏幕上就会显示上面的最后一行,并且将他的 IP 寄到 root (或者是你自己的信箱)那里去!(注:某些没有安装 tcp_wrappers 的套件之 distribution 中,由于没有 safe_finger 等程序,所以无法执行相关的功能,这点还请多加注意呢!)
系统开启的服务
好了,现在假设您已经知道了 daemons 的启动档案放置的目录,也知道了服务与 port 的对应,那么要如何查询目前系统上面已经启动了的服务呢?不要再打混了!已经学过了 ps 与 top 应该要会应用才对耶!呵呵!没错,可以使用 ps 与 top 来找寻已经启动了的服务的程序与他的 PID 呢!不过,我们怎么知道该服务启动的 port 是哪一个?呵呵!好问题!可以直接使用 netstat 这个网络状态观察指令来检查我们的 port 呢!甚至他也可以帮我们找到该 port 的程序呢( PID )!好了,那么我们就来试看看这个指令的用法吧!
* netstat
[root @test /root]# netstat [-r] [-i interface]
[root @test /root]# netstat [-antulp]
参数说明:
-r :显示出 route 的意思;
-i :显示出 interface 的内容,跟 ifconfig 类似啦!
-a :显示出目前所有的网络联机状态!
-n :预设情况中,显示出的 host 会以 host name 来显现,若为 n 则可以使 port 与 host 都以数字显示
-t :仅显示 tcp 封包的联机行为
-u :仅显示 udp 的封包联机状态
-l :仅显示 LISTEN 的内容
-p :同时显示此一联机的 PID 喔!(注意:只有 root 才能行使此功能!)
范例:
[root @test /root]# netstat -r <==嘿嘿!显示出目前的路由表!
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
140.116.141.253 * 255.255.255.255 UH 40 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 40 0 0 eth0
192.168.0.0 * 255.255.255.0 U 40 0 0 eth0
127.0.0.0 * 255.0.0.0 U 40 0 0 lo
default 140.116.141.253 0.0.0.0 UG 40 0 0 ppp0
[root @test /root]# netstat -i eth0 <==看看底下显示出的内容,是否跟 ifconfig eth0 类似呀!?
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 077199373 0 0 169616342 0 0 0 BMRU
lo 16436 0 1130485 0 0 0 1130485 0 0 0 LRU
[root @test /root]# netstat -an <==显示所有的联机状态,并且以数字型态显示
[root @test /root]# netstat -tul<==显示 LISTEN 的及 tcp 与 udp 的联机状态,如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:mysql *:* LISTEN
tcp 0 0 *:netbios-ssn *:* LISTEN
tcp 0 0 *:pop3 *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 *:ftp *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
udp 0 0 *:netbios-ns *:*
注意:上面的 LISTEN 表示该 port 是已经在 监听 网络服务啦!而左边的 tcp 指的是 tcp 封包!
[root @test /root]# netstat -anp | more<==这个指令很常下达!请记得呦!
netstat 可是很了不起的指令,一定要学会的!尤其他可以让我们了解目前的你的主机的联机状态!与开启的 port 有哪些!所以一定得学会才行呀!如果你分别下达:
netstat -a | more
netstat -an | more
一定会发现有点奇怪?怎么有的 port 会以服务名称(例如上面例子里的 pop3 ...)有的会以 port 号码来显示呢!?嘿嘿!那就是 /etc/services 以及 -n 这个参数的用途啦!你可以发现的是,如果 netstat -a 时,显示出来的 port 号码在 /etc/services 存在对应的服务名称的时候,那么预设他就会显示出该服务名称啦!但是若在 /etc/services 找不到档案的话,那么自然就还是以 port 号码来显示的!那么加上了 -n 参数后,不论如何,他都会以 port 及 IP 来显示啦!
另外,那个 -p 也很有用呦!尤其是在一些莫名其妙的联机出现时,可以用 netstat –anp | more查到 PID ,然后再以我们之前谈到的 系统资源管理 部分,利用 kill 来杀掉该 PID 的程序! 此外,使用 netstat –tlp 也可以得到目前在 LISTEN 的 port 的服务名称,嘿嘿!那样就可以知道该 port 是那个程序来启动的!很便利ㄋㄟ?
o Proto:指的是封包或者是通讯协议啦! tcp , udp 是常见的呦!
o Local Address:本地端的 IP 与 Port 号,如果 /etc/services 存在对应服务名称,就以服务名称显示;
o Foreign Address :监听哪一个地区与 port ;
o state:状态列就很多啦!基本的有:
+ LISTEN :亦即监听状态中的 port !
+ ESTABLISHED:已建立联机的联机情况
+ TIME_WAIT:该联机在目前已经是等待的状态了!随时有可能会断线呦!
善用 netstat 可以查得相当多的网络信息!尤其在关闭本机的 port 时!假设我要将 ftp 关闭掉,那么要使用 ntsysv, chkconfig 以及看一下 /etc/rc.d/rc.local 里头的设定啰!请注意,这个时候仅是将『开机预设启动关闭』而已,并没有实际关闭目前的服务,假设您发现 ftp 还在启动的项目,你要将他关闭,那么就必须:
1. 使用 ntsysv 或 chkconfig 将 wu-ftpd 前面的符号关闭掉;
2. 跳出之后,以 /etc/rc.d/init.d/xinet restart 或者是 service xinet restart 来重新启动 xinet 这个服务;
3. 再以 netstat -a | more 看一下 ftp 是否还在 LISTEN 呢?
这样才能关闭呢!同理可证啰!要关闭 sshd 怎么关?!嘿嘿!自己测试看看啰!(注意:事实上,在 Linux 系统中,要『开或关某个 port 』,就是需要『启动或关闭某个服务』啦!因此,你可以找出某个 port 对应的服务,程序对应的服务,进而启动或关闭他,那么那个经由该服务而启动的 port ,自然就会关掉了!)
各个服务的简单说明
底下是一些 linux 系统上面常见的 daemons ,大家可以参考看看呦!
服务名称
# 参数档
# 预设使用 port 号
# 说明
# 是否需要执行
anacron
# /etc/anacrontab
# 没有使用 port 号
# 当你的 Linux 主机并不是全天候开机的时候,这个 anacron 就可以帮你执行在『 crontab 』既定的时间内没有执行的工作!举个例子来说,当你的主机在晚上 12:00 会自动关闭,但是偏偏 crontab 这个例行性工作是在 4:00 工作,这个时候例行性工作不是都没有做到吗?嗯! anacron 就可以使用啦!
# 如果主机已经 24 小时开机,而且执行了 cron ,那么这个程序就不需要启动了。
apmd
* /etc/sysconfig/apmd
* 没有使用 port 号
* apmd 是 Adventage Power Management daemon 的缩写,顾名思义,可以用来了解系统的『电池电量』,如果对于手提式计算机才有需要吧我想!
* 基本上,我们使用的桌上型或者是一直开机的机型,大致上不需要使用此一 daemon。
arpwatch
* /etc/sysconfig/arpwatch
* 没有使用
* 这是用来持续监测网络卡的『 Hardware IP (MAC) 与 Software IP (TCP/IP 那个 IP) 』对应的 daemon,还可以提供 e-mail 通知系统管理员呦!
* 一般的主机不太需要这个 daemon 啦!
atd
* /etc/at.allow, /etc/at.deny
* 没有使用 port 号
* 这个总该不陌生了吧!就是单一使用的例行性命令啰!如果忘记了!赶紧去查看一下!
* 这个通常需要启动啦!不过,如果你一般都是使用 cron ,那么这个东西不启动影响也不很大!
autofs
* /etc/rc.d/init.d/autofs
* 没有使用 port 号
* 这个东西使用在自动挂载一些装置的 daemon
* 不需要开启!
xinet
chargen
chargen-udp
* 这东西主要的 port 号是 19 号;
* 主要的功能在于提供类似远程打字的咚咚吧!我也不是很懂说....
* 一般来说,不用启动啦!
crond
* /etc/crontab
* 没有使用 port
* 用来执行 例行性命令 的 daemon!
* 务必启动!
xinet
daytime
daytime-udp
* 这东西使用 13 port 号!
* 用来作为 daytime 的服务(我也不清楚,请来信告知耶!)
* 不用启动
xinet
echo
echo-udp
* 使用 port 7
* 不用启动啦!
xinet
finger
* /etc/xinetd.d/finger
* port 79
* 最大的功能就是让远程的使用者可以查看本地端的使用者信息
* 由于有安全上的顾虑,没有必要的话,不要启动!
gpm
* /etc/sysconfig/mouse
* 没有使用 port 号
* 在文字模式里面可以使用 mouse 来从事『复制、贴上、移动光标』等等的功能!
* 没必要的话,建议是『关闭』!
httpd
* /etc/httpd/conf/httpd.conf
* 使用 80 port 以及(或) 443
* 这个就是鼎鼎大名的 WWW 主机服务开启的程序啦!
* 看你的需求啰!有 WWW 则必须要启动!
发表评论
-
xp访问linux的工具
2012-05-17 16:46 893从windows访问linux,除了samba之外,日常操作用 ... -
SCP和SSH
2012-04-18 11:12 6651一、ssh简介 传统的FTP、POP、Telent是不 ... -
shell中的变量
2012-03-08 17:56 1008变量 1.变量标识符可以使字母、下划线和数字,开头不能使数字 ... -
程序管理
2012-01-29 16:26 1080背景工作管理: ... -
RPM
2012-01-29 16:14 1066一、概述 以原始码 ... -
df和du
2011-12-30 11:31 844ls列出目标目录中所有的子目录和文件 -i 打印出每个文件的i ... -
连接文件
2011-12-30 11:31 971Linux 文件系统最重 ... -
ext2文件系统
2011-12-30 11:29 1034EXT2通过一个inode 结构来描叙文件系统中文件并 ... -
用户管理
2011-12-23 15:41 906ctrl+w删除单词 ctrl+u删除 ... -
压缩解压缩
2011-12-22 17:15 1034*.Z compress程序压缩的文件 *.bz2: bzip ... -
sed命令用法
2011-12-21 17:47 1433sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理 ... -
mv的用法
2012-11-23 00:21 1124mv 是移动文件或目录 到另一个目录 例如: mv tes ... -
su命令
2011-12-19 15:46 1160su切换用户身份 su - :表示要切换到root,且使用r ... -
Shell脚本
2011-12-19 15:45 1382管理整个硬件的是核心 ... -
Linux命令中的注意事项
2011-12-19 15:44 8471.不像dos,linux中的命令时大小写敏感的; 2.cd后 ... -
Linux基本命令
2011-12-19 15:08 1089ctrl+R 反向搜索命令 输入关键字,会寻找与改关键字相关 ...
相关推荐
在易语言中,我们可以通过特定的语法和函数来实现对操作系统各种功能的调用,包括获取系统服务列表以及修改系统服务状态。本文将深入探讨如何使用易语言实现这些功能,并结合描述和标签,重点关注在Windows操作系统...
在Windows操作系统中,系统服务是后台运行的程序,它们提供了操作系统的核心功能,如网络连接、设备驱动、用户界面等。C#是一种强大的编程语言,它允许开发者与Windows API交互,从而获取并操作这些系统服务的信息。...
全国生态系统服务评价数据集是一个全面反映中国生态状况的重要资源,主要涵盖了生物多样性、固碳、农产品提供、防风固沙、土壤保持以及水源涵养等多个关键领域的评估信息。这个数据集利用了地理信息系统(GIS)技术...
系统服务是操作系统的核心组成部分,它们在后台运行,提供各种功能和支持,确保计算机系统的正常运作。然而,过多或不必要的系统服务可能会占用宝贵的系统资源,导致电脑运行缓慢。因此,"系统服务优化.服务项设置...
在Windows操作系统中,系统服务是后台运行的程序,它们为操作系统和用户应用程序提供核心功能,如网络连接、硬件驱动支持和安全服务等。"win系统服务修改程序"是一款专用于管理和修改这些服务的小巧工具,它允许用户...
系统服务是操作系统的核心组成部分,它们在后台运行,提供操作系统与应用程序之间的重要功能,如网络连接、硬件管理等。"系统服务安装卸载工具"是一种专门用于管理这些服务的实用程序,尤其适用于Windows XP、2000和...
系统服务工具是IT管理员在日常工作中经常会接触到的一种实用软件,主要功能是对计算机中的系统服务进行安装、卸载或管理。本文将深入探讨“手工安装或卸载系统服务工具”的相关知识点,以及如何利用名为SRVINSTW.EXE...
总结起来,使用C++将exe添加到系统服务并设置为开机启动,需要深入理解Windows服务的工作原理,熟悉Windows API,以及具备良好的编程和错误处理技巧。通过实践和学习,你可以创建出高效且安全的服务管理工具。
在Windows操作系统中,系统服务是后台运行的程序,它们为操作系统和用户应用程序提供核心功能,如网络连接、硬件管理、安全服务等。然而,并非所有服务对于每个用户都是必需的,有些服务可能会消耗不必要的资源,...
标题中的“vb制作系统服务源程序”指的是使用Visual Basic(VB)编程语言开发的系统服务应用程序。系统服务是在操作系统后台运行的程序,通常在用户登录之前启动,为其他应用程序或系统提供必要的功能和支持。 在...
在IT领域,系统服务删除和安装是日常维护和优化计算机操作系统的常见操作。系统服务是Windows操作系统中的一个重要组成部分,它们负责后台的自动化任务和功能,为操作系统和其他软件提供支持。然而,有时候为了提升...
在Windows XP和Windows 2003操作系统中,系统服务起着至关重要的作用。它们是操作系统的核心组件,负责执行各种后台任务,如网络连接、硬件驱动支持和系统稳定性。本资源包聚焦于如何管理和优化这些服务,特别是通过...
"生态系统服务理论" 生态系统服务理论是指人类直接或间接从生态系统得到的利益,主要包括向经济社会系统输入有用物质和能量、担当和转化来自经济社会系统的废弃物,以及直接向人类社会成员提供办事(如人们普遍享用...
标题中的“VB6.0创建系统服务程序精品源码,带描述”指的是使用Visual Basic 6.0(VB6.0)开发的一个高质量的源代码示例,它能够创建Windows系统服务并允许在服务控制管理器中显示详细的描述信息。在Windows操作系统...
在IT领域,系统服务管理是操作系统中的核心组成部分,它负责管理和控制系统的各种服务。系统服务管理单元VC++指的是使用Visual C++(简称VC++)编写的用于管理这些服务的工具或库。VC++是Microsoft公司开发的一种...
在Android操作系统中,系统服务和广播是至关重要的两个概念,它们构成了Android系统运行的基础框架,为应用程序提供了丰富的功能和交互方式。以下是对这两个主题的详细解释。 **Android系统服务** 系统服务是...
在Windows XP操作系统中,系统服务是支持操作系统运行的重要组成部分,它们负责执行各种后台任务,如网络连接、设备驱动、系统安全等。然而,并非所有服务都对普通用户来说是必要的,有些服务可能只会消耗系统资源而...
易语言源码易语言注册表与系统服务模块专业版2.0源码.rar 易语言源码易语言注册表与系统服务模块专业版2.0源码.rar 易语言源码易语言注册表与系统服务模块专业版2.0源码.rar 易语言源码易语言注册表与系统服务...
Visual C++源代码 76 如何获取系统服务程序路径信息Visual C++源代码 76 如何获取系统服务程序路径信息Visual C++源代码 76 如何获取系统服务程序路径信息Visual C++源代码 76 如何获取系统服务程序路径信息Visual ...
Windows系统服务管理工具是一款专为Windows操作系统设计的实用程序,用于方便用户添加、删除或管理系统服务。在Windows环境中,服务是一种在后台运行的程序,它们通常在用户登录之前就开始执行,为操作系统或应用...