Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2595962
  • 博文数量: 867
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 9800
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 14:44
文章分类

全部博文(867)

文章存档

2007年(6)

2006年(861)

我的朋友

分类: LINUX

2006-08-04 10:40:40

 

 

为什么我们的主机会响应网络上面的一些要求封包呢?例如我们设定了一部 WWW 主机后,当有来自 Internet 的 WWW 要求时,我们的主机就会予以响应,这是因为我们的主机有启用了 WWW 的监听埠口 (port) 啊!这里就要特别留意了,当我们启用了一个 daemon 时,就可能会造成主机的 Port 在进行 Listen 的动作,此时该 daemon 就是已经对网络上面提供服务了!万一这个 daemon 有漏洞,因为他提供 Internet 的服务,所以就容易被 Internet 上面的 cracker 所入侵了!所以说,仔细的检查自己系统上面的 port 到底开了多少个,并且予以严格的管理,才能够降低被入侵的可能性啊!

 
什么是埠口( port ):
  :总共有多少埠口?哪些是保留的 port ?
  :Server/Client 联机建立的 TCP 三向交握
  :安不安全
如何观察埠口:
  :使用 netstat
  :使用 nmap
如何关闭或启动一个埠口:
设定开机时启动服务的方法:
安全性: 关闭所有对外开放的 port
课后练习:


什么是埠口( port ):

在开始这个章节之前,我们先来聊一聊什么是埠口 ( port ) 呢?常常在网络上听说『我的主机开了多少的 port ,会不会被入侵呀!?』或者是说『开那个 port 会比较安全?又,我的服务应该对应什么 port 呀!?』呵呵!很神奇吧!怎么一部主机上面有这么多的奇怪的 port 呢?这个 port 有什么作用呢?!事实上,一部主机的 port 可分为『监听, LISTEN』与『随机取用的 high port』 :
 

    • 所谓的 LISTEN 就是您的主机有启动某些服务,那么这个服务就会在 Linux 系统上面启用一个 port 以监听来自 Internet 的要求!例如以 FTP 的服务来说好了,如果您的主机有启用 FTP 这个服务的话,那么主机就会启用 port 21 喔!而且 port 21 是一直启用的,直到 FTP 这个服务关闭为止!
       
    • 那么万一我的主机是要对外主动的联机呢?举例来说好了,我的 Linux 要对外面的 WWW 主机要求数据 ( WWW 主机预设的 port number 为 80 ) ,那么我的 Linux 总是需要启用一个 port 来对外联机吧?!不然数据封包怎么传递?那么启用的 port number 是多少呢?呵呵!Linux 主机会『随机』取用一个没有被使用的大于 1024 以上的 port 来进行这次的联机行为。

 
所以,您应该知道 Server/Client 之间的数据传送其实是 port 与 port 之间的递送喔!那就是我们在网络基础里面谈到的 socket pair 当中的一环啰。那么数据透过这些 port 来进行传送的时候,会不会跑错地方啊?!还记得我们在里头提到的 资料吧?对啦! 封包在传送的时候,在 TCP 封包的表头 (header) 不是会填有来源与目的之 IP 及 port 吗?在这里您可以这样想,由于每种网络的服务功能都不相同,因此有必要将不同的封包送给不同的服务来处理,所以啰,当您的主机同时开启了 FTP 与 WWW 服务的时候,那么别人送来的数据封包,就会依照 TCP 表头上面的 port 号码来给 FTP 这个服务或者是 WWW 这个服务来处理,当然就不会搞乱啰! ( 注:嘿嘿!有些很少接触到网络的朋友,常常会问说:『咦!为什么您的计算机同时有 FTP、WWW、E-Mail 这么多服务,但是人家传数据过来,您的计算机怎么知道如何判断?计算机真的都不会误判吗?!』现在知道为什么了吗?!对啦!就是因为 port 不同嘛!您可以这样想啦,有一天,您要去银行存钱,那个银行就可以想成是『主机』,然后,银行当然不可能只有一种业务,里头就有相当多的窗口,那么您一进大门的时候,在门口的服务人员就会问您说:『嗨!您好呀!您要做些什么事?』您跟他说:『我要存钱呀!』,服务员接着就会告诉您:『喝!那么请前往三号窗口!那边的人员会帮您服务!』这个时候您总该不会往其它的窗口跑吧?! ^_^""这些窗口就可以想成是『 port 』啰!所以啦!每一种服务都有特定的 port 在监听!您无须担心计算机会误判的问题呦! )
 


总共有多少埠口?哪些是保留的 port ?
 
我想,您或许会很好奇,咦!那么通常一般的主机会有多少个 port 呢?!正常来说,所有的 port 是由 1 ~ 65535 这么多个啦!好啦,那么在这些 port 上面有没有保留给系统使用的呢!?是有的!一般而言,只有 root 才可以启用 1 ~ 1023 以内的 port ,这些 port 就是特殊的埠口,是保留给系统来使用的!至于大于 1024 以上的 port 除了给系统随机取用来作为联机的需求之外,也可以用来作为服务的 LISTEN 之用。举例来说,如果您觉得 0~1023 的 port 需要以 root 的身份来启动,这样如果该 port 的程序被入侵了,那么入侵者将拥有 root 的权限,这实在很危险~所以,这个时候您可以以一般身份账号并使用大于 1024 以上的 port 来启用某些服务呢!例如 FTP 的 port 预设为 21 ,您也可以将 FTP 以 10021 的 port number 来启动,并且使用一般身份的账号来启用这个 FTP 的服务,会比较安全一点。不过,这样一来会造成 client 端的困扰,因为一般 FTP Client 软件都是预设以连接到主机的 port 21 来进行联机的,现在您的主机 FTP 改成 10021 了,除非您的 Client 知道这个设定值,否则 Client 软件就无法联机成功了。

 
好了,那么您应该又会说,这些保留的 port ( 或称为 well know )有什么特殊的功能呢?!这些 well know 的埠口其实是目前一些 Internet 上面常见的 Services 所惯用的埠口咯,为了保留给这些埠口给特殊的服务使用,以避免不小心被使用者或者是 Client 端软件给占用了,所以就需要订定这样的保留功能啰。此外,因为这些 port 是目前 Internet 上面所惯用的,所以一些程序开发者在进行软件的开发时,就能够针对这些 well know 的埠口直接来开发,大家也比较容易使用服务器的功能啊!
 
至于这些 well know 的埠口与他所对应的服务 (services) 其实已经在我们的 Linux 系统当中存在一个对照表了,那就是 /etc/services 这个档案啰!我们在 里面提到的 的功能时,有没有加上 -n 这个参数是有影响的!当不加 -n 这个参数时,直接下达『 netstat -tl 』竟然可以告诉我目前正在 LISTEN 的服务名称!嘿嘿!这就是 /etc/services 的功能啦!此外, /etc/services 也是某些服务在启动的时候,设定 port number 的重要依据,例如 的埠口就是由这个档案来控管的。来看一看 /etc/services 的几个主要内容吧!
 

[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
domain          53/tcp          nameserver      # name-domain server
domain          53/udp          nameserver
bootps          67/tcp                          # BOOTP server
bootps          67/udp
bootpc          68/tcp                          # BOOTP client
bootpc          68/udp
http            80/tcp          www www-http    # WorldWideWeb HTTP
http            80/udp          www www-http    # HyperText Transfer Protocol
hostname        101/tcp         hostnames       # usually from sri-nic
hostname        101/udp         hostnames       # usually from sri-nic
pop2            109/tcp         pop-2   postoffice      # POP version 2
pop2            109/udp         pop-2
pop3            110/tcp         pop-3           # POP version 3
pop3            110/udp         pop-3
sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper TCP
sunrpc          111/udp         portmapper      # RPC 4.0 portmapper UDP
auth            113/tcp         authentication tap ident
auth            113/udp         authentication tap ident
sftp            115/tcp
sftp            115/udp

 


Server/Client 联机建立的 TCP 三向交握
 
除此之外,还记得我们在 那一篇当中稍微提到,如果需要进行网络联机的时候,那个重要的三向交握( Three-Way Handshake )就不能不理解一下:
 

    • 每一个 TCP 联机都必须由一端(通常为 client )发起请求,这个 port 通常是随机选择大于 1024 以上的 port 号来进行!其 TCP 封包会将(且只将) SYN (主动联机)旗标设定起来!这是整个联机的第一个封包;
    • 如果另一端(通常为 Server ) 接受这个请求的话 ( 当然啰,特殊的服务需要以特殊的 port 来进行,例如 FTP 的 port 21 ),则会向请求端送回整个联机的第二个封包!其上除了 SYN 旗标之外同时还将 ACK (确认)旗标也设定起来,并同时在本机端建立资源以待联机之需;
    • 然后,请求端获得服务端第一个响应封包之后,必须再响应对方一个确认封包,此时封包只带 ACK 旗标(事实上﹐后继联机中的所有封包都必须带有 ACK 旗标)﹔
    • 只有当服务端收到请求端的确认( ACK )封包(也就是整个联机的第三个封包)之后﹐两端的联机才能正式建立。这就是所谓的 TCP 联机的『三段式交握( Three-Way Handshake )』的原理。
       

       

经过三向交握之后,呵呵!您的 client 端的 port 通常是高于 1024 的随机取得的 port ,至于主机端则视当时的服务是开启哪一个 port 而定,例如 WWW 选择 80 而 FTP 则以 21 为正常的联机通道!三向交握是相当重要的一个认识喔!因为未来在防火墙的设定上面,这个机制的认知是必须的!
 


安全不安全?
 
那么了解了这些 port 之后,再来您应该还会问到一个问题呀!那就是『我怎么知道哪一个 port 比较安全?』这里可能要先请您了解一下所谓的『 port 』与『 服务 』对于『 安全 』的相关性!真正影响网络安全的并不是 port 这个东西,而是将 port 启动的那个服务才是重点!举个例子来说好了,您应该偶而会听到『Wu-ftpd 这个服务不安全,建议大家改用 proftp 』对吧!请注意呦!那个 Wu-ftpd 与 proftp ( 这两个都是套件的名称 )都是使用 port 21 这个埠口!嘿嘿!但是 proftp 就是比 wu-ftp 稍微安全一点!晓得了吗?没错!对于安全真正有危害的是『某些不安全的服务』而不是『开了哪些 port 』才是!基本上,没有必要的话,一些您想不到或者用不到的 port 都把他关掉了吧!毕竟没有开口总比开了口再来防堵要安全的多吧!! ^_^""!而且服务套件的版本也需要持续的进行更新喔!


如何观察埠口:

好了,我们现在知道这个 port 是什么鬼东西了,再来就是要去『看他到底在干啥?』对吧!没错!再来就是要来了解一下,我们的主机到底是开了多少的 port 呢?如同我们前面说的,您得要先了解一下,我们的『服务』跟『 port 』对应的档案是哪一个?再提醒一次呦!是『 /etc/services 』 啦!好了,那么常见的 port 对应的服务有哪些呢?大概有这些啦!
 

服务名称   port 号   常见套件名称       建议
==================================================================================
ftp      21      Wu-ftp, proftp      不要开放他!
telnet    23      telnet          不要开放他!
smtp     25      sendmail, postfix     除非必要,不然不要启动!
http     80      apache          除非必要,不然不要启动!
pop3     110      imap            除非是 mail 主机,不然不要开放
netbios-ssn 139      SAMBA           除非必要,不然不要启动!
squid    3128      squid           除非必要,不然不要启动!
mysql    3306      MySQL           除非必要,不然不要启动!

 
当然还不只这些哩,更详细的信息您应该到您的 Linux 主机之下的 /etc/services 这个档案去看仔细!好了,那么接下来就是要来察看我们主机的 port 啰!如何察看呢?底下我们介绍两个最常使用的观测指令:
 

    • netstat : 在本机上面以自己的程序监测自己的 port ,无危险;
    • nmap    : 在本机上面,以特殊的侦测程序侦测自己,可能会有违法之虞。

 
见他的大头王!怎么使用 nmap 会违法?呵呵!别担心,由于 nmap 的功能太强大了,所以很多 cracker ( 怪客,网络上面的闲人 ) 会直接以他来侦测别人的主机,这个时候就可能造成违法啦!只要您使用 nmap 的时候不要去侦测别人的计算机主机,那么就不会有问题啦! ^_^"" 底下我们分别来说一说这两个宝贝吧!
 


使用 netstat 指令:
 
如前所述,在做为主机的 Linux 系统中,服务项目是越少越好!这样可以避免不必要的入侵管道喔!因此,这个时候请了解一下您的系统当中,有没有哪些服务被开启了呢?要了解自己的系统当中的服务项目,最简便的方法就是使用 了!这个东西不但简单 ( 每一部 Linux 机器当中预设都会安装的套件喔! ) ,而且功能也是很不错的。这个指令的使用方法在 指令介绍当中提过了,底下我们仅提供如何使用这个工具的方法啰!
 

[root@test root]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0     20 192.168.1.2:ssh       192.168.1.11:1391     ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  10     [ ]         DGRAM                    768    /dev/log
unix  2      [ ]         DGRAM                    304058
unix  2      [ ]         DGRAM                    303994
unix  2      [ ]         DGRAM                    303972
unix  2      [ ]         DGRAM                    70794
unix  2      [ ]         DGRAM                    70743
unix  2      [ ]         DGRAM                    27533
unix  2      [ ]         DGRAM                    895
unix  2      [ ]         DGRAM                    785

 
如上所示,单纯使用 netstat 的时候,仅『列出目前已经接通的服务项目与服务名称』所以您可以看到,由于目前仅有一个 ssh 的联机建立成功,所以就只有显示出一个 ESTABLISHED ( 联机中的意思 ) 的项目。上面第三行以 tcp 开头的那一行,表示『有一个 ssh 的服务开启通道联机中,是由远程 client 的 192.168.1.11 这个 IP 连接到 192.168.1.2 的主机上面的这个 IP ,而 Client 端联机的通道是以 1391 这个通道连接进入 ssh 的服务中的!』。这里这个 ssh 所显示的服务名称就是在 /etc/services 里面记载的啰!那如果我需要将所有的项目都列出来呢?例如说:有哪些 port 目前正在监听呢?!

 

[root@test root]# netstat -a
AActive Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:pop3                  *:*                     LISTEN
tcp        0      0 *:imap                  *:*                     LISTEN
tcp        0      0 *:ftp                   *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 *:smtp                  *:*                     LISTEN
tcp        0     20 192.168.1.2:ssh         192.168.1.11:1391       ESTABLISHED
udp        0      0 *:1238                  *:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  10     [ ]         DGRAM                    768    /dev/log
unix  2      [ ]         DGRAM                    304058
unix  2      [ ]         DGRAM                    303994
unix  2      [ ]         DGRAM                    303972
unix  2      [ ]         DGRAM                    70794
unix  2      [ ]         DGRAM                    70743
unix  2      [ ]         DGRAM                    27533
unix  2      [ ]         DGRAM                    895
unix  2      [ ]         DGRAM                    785

 
如上所示,加入 -a ( all )就是说将所有在机器上所有的 port 的状态列出的意思,不过,服务的名称已经使用 /etc/services 里面的名称了,而不是使用 port 的数字!如上所示,目前我主机上面的服务共开启了:『 pop3、imap、ftp、ssh、smtp 』等服务 (就是在 tcp 封包里头的具有 LISTEN 的那几个咚咚啰!) 至于已经建立的服务就只有 ssh 这一个啰!那如果我想要知道 port 的号码呢?呵呵,就使用底下的指令吧!
 

[root@test root]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
tcp        0     20 192.168.1.2:22          192.168.1.11:1391       ESTABLISHED
udp        0      0 0.0.0.0:1238            0.0.0.0:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  10     [ ]         DGRAM                    768    /dev/log
unix  2      [ ]         DGRAM                    304058
unix  2      [ ]         DGRAM                    303994
unix  2      [ ]         DGRAM                    303972
unix  2      [ ]         DGRAM                    70794
unix  2      [ ]         DGRAM                    70743
unix  2      [ ]         DGRAM                    27533
unix  2      [ ]         DGRAM                    895
unix  2      [ ]         DGRAM                    785

 
如上所示,我接通的服务通道只有 22 这一个,而其它的您可以参照上面的指令输出结果来对照,所以您就可以知道啰:pop3 为 110 而 imap 为 143 呵呵!就是这样啰!因此,透过此一指令,就可以轻易的了解目前主机的运作状况与服务状态啰!当然啰, netstat 的用途不止于此,您可以使用 man 来查阅一番喔!相信对您的主机会有更大的了解呦!
 
相信有不少的朋友都会有这个困扰,就是要怎样删除已经建立的联机呢?因为总有些不速之客会连到您的主机来进行一些破坏的工作!或者是您根本不想让对方联机过来!呵呵!还记得 里面提到的几个常用的指令吧!?那就是找出那个联机程序的 PID ,然后给他 掉就是了!简单呀!不过,大问题是『我要怎样找出联机的 PID 呀!?』呵呵!由于 PID 的管理与整体的系统资源有关,这个时候,虽然可以使用 netstat 来观察 PID ,不过只有 root 可以观察到联机状态的 PID 号码呦!( 注:还记得资源管理提及的 PID 概念吗?就是说,在 Linux 系统之内,每个『程序』系统都会给予一个号码来管理!这个就是 PID 啰!)
 

[root@test root]# netstat -ap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:ssh                   *:*                     LISTEN      32149/sshd
tcp        0    284 140.116.141.19:ssh      192.168.1.11:1391       ESTABLISHED 24751/sshd
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  7      [ ]         DGRAM                    944    509/syslogd         /dev/log
unix  2      [ ]         DGRAM                    3035915 16648/xinetd
unix  2      [ ]         DGRAM                    739227 5951/pppoe
unix  2      [ ]         DGRAM                    739189 5949/pppd
unix  2      [ ]         DGRAM                    1070   628/crond
unix  2      [ ]         DGRAM                    953    514/klogd
unix  2      [ ]         STREAM     CONNECTED     690    1/init [3]

 
看到上面那个斜体字的联机建立的网络状态了吗?嘿嘿!最后面一栏就是显示那个 PID/Program name ,那个 PID ( 上面是 24751 )也就是我们要来砍掉的啦!这个时候,如果要将该联机砍掉时,就直接以 来做吧!
 

[root@test root]# kill -9 24751

 
这样就能将该联机给他『踢出去』您的主机啦!! ^_^""
 


使用 nmap 套件:注意安全!
 

在本机上面观察 port 最好是使用 netstat 啦!因为他安全又可靠!但是,由于可能有某些 port 会寻找不到,或者不晓得那些 port 是干嘛用的,尤其是 /etc/services 里头没有提到的几个 port 对应的服务!这个时候怎么办?!没关系,不要紧,我们这个时候可以使用那个很流行的『黑客指令』,就是 nmap 这个东西啦!nmap 的套件说明之名称为:『Network exploration tool and security scanner』,顾名思义,这个东西是被系统管理员用来管理系统安全性查核的工具!他的具体描述当中也提到了, nmap 可以经由内部自行定义的几个 port 对应的指纹数据,来查出该 port 的服务为何,所以我们也可以藉此了解我们主机的 port 到底是干嘛用的!如果您是安装 Linux 是 Red Hat 版本的话,那么这个 nmap 套件应该已经安装妥当了,万一没有这个套件的话,也可以来到底下的网站下载:

 

 

[root@test root]# nmap <扫瞄类型> <扫瞄参数> 地址与范围>
参数说明:
<扫瞄类型>:主要的扫瞄类型有底下几种:
  -sT:扫瞄 TCP 封包已建立的联机 connect() !
  -sS:扫瞄 TCP 封包带有 SYN 卷标的数据
  -sP:以 ping 的方式进行扫瞄
  -sU:以 UDP 的封包格式进行扫瞄
  -sO:以 IP 的协议 ( protocol ) 进行主机的扫瞄
<扫瞄参数>:主要的扫瞄参数有几种:
  -PT:使用 TCP 里头的 ping 的方式来进行扫瞄,可以获知目前有几部
     计算机存活(较常用)
  -PI:使用实际的 ping (带有 ICMP 封包的) 来进行扫瞄
  -p :这个是 port range ,例如 1024-, 80-1023, 30000-60000 等等的使用方式
地址与范围>:这个有趣多了,有几种类似的类型
  192.168.0.100  :直接写入 HOST IP 而已,仅检查一部;
  192.168.0.0/24 :为 C Class 的型态,
  192.168.*.*  :嘿嘿!则变为 B Class 的型态了!扫瞄的范围变广了!
  192.168.0.0-50,60-100,103,200 :这种是变形的主机范围啦!很好用吧!
范例:

例题一:扫瞄单一部计算机!
[root@test root]# nmap localhost  
# 没有加上任何参数,由 nmap 的预设参数来进行扫瞄
Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
Interesting ports on vbird.adsldns.org (127.0.0.1):
(The 1539 ports scanned but not shown below are in state: closed)
Port       State       Service
21/tcp     open        ftp
22/tcp     open        ssh
23/tcp     open        telnet
Nmap run completed -- 1 IP address (1 host up) scanned in 1 second
# 由上面可以看出我的系统目前共有 21, 22, 23 这三个 port 开放!而且
# 各 port 对应的服务也被查出来了!

例题二:扫瞄单一部计算机的较少数 port 号码!
[root@test root]# nmap -p 1024-65535 localhost
# 仅扫瞄较少数的 port 啦!
Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
Interesting ports on pc510.ev.ncku.edu.tw (127.0.0.1):
(The 64511 ports scanned but not shown below are in state: closed)
Port       State       Service
3306/tcp   open        mysql <==只有这个 port 被找出来啰!
Nmap run completed -- 1 IP address (1 host up) scanned in 11 seconds

例题三:直接以 Ping 的方式扫瞄数个计算机!
[root @test /root]# nmap -PT 192.168.1.171-177 
# 看到了吧!扫瞄一个区段的活着的计算机!

Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
Interesting ports on linux172 (192.168.1.172):
(The 1536 ports scanned but not shown below are in state: closed)
Port       State       Service
110/tcp    open        pop-3
135/tcp    open        loc-srv
139/tcp    open        netbios-ssn
445/tcp    open        microsoft-ds
1025/tcp   open        listen
1110/tcp   open        nfsd-status

Interesting ports on linux174 (192.168.1.174):
(The 1537 ports scanned but not shown below are in state: closed)
Port       State       Service
110/tcp    open        pop-3
135/tcp    open        loc-srv
139/tcp    open        netbios-ssn
445/tcp    open        microsoft-ds
1025/tcp   open        listen

Interesting ports on linux176 (192.168.1.176):
(The 1537 ports scanned but not shown below are in state: closed)
Port       State       Service
110/tcp    open        pop-3
135/tcp    open        loc-srv
139/tcp    open        netbios-ssn
445/tcp    open        microsoft-ds
1025/tcp   open        listen

Nmap run completed -- 7 IP addresses (3 hosts up) scanned in 1 second
瞧!我要侦测的只有七部计算机,所以这七部计算机只会响应给我啰!而其中只有三部有启动,所以当然就只会有三段响应啦!这个方式蛮适合一次扫瞄您的子网域内的所有计算机呢! ^_^"

 

请特别留意,这个 nmap 的功能相当的强大,也是因为如此,所以很多刚在练习的黑客会使用这个软件来进行侦测别人的计算机,这个时候请您特别留意,目前很多的人已经都有『特别的方式』来进行登录的工作!例如以 的功能来记录曾经侦测过该 port 的主机 IP!这个软件用来『侦测自己机器的安全性』是很不错的一个工具,但是如果用来侦测别人的主机,可是可能会『吃上官司』的!特别留意!!


如何关闭或启动一个埠口:

既然已经知道了有多少个 port 被启动或关闭,那么接着下来当然就是要将一些不安全的服务给他关闭啰!呵呵!那么该如何关闭呢?请注意:『开或关一个 port 的方式是:开启或关闭一个服务即可!』例如您要关闭 port 21 这个较为危险的 ftp 的埠口,那么就是将 wu-ftp 或者是 proftp 关掉就对啦!关掉他自然就连同 port 也关掉啰! ^_^"" 所以说,当您侦测完了 port 之后,接着下来就是找出该 port 的对应的服务,将该服务给关掉,就会把 port 关啦!嗯!我们来试试看关掉一个 25 port 好了!由于 25 port 是由 sendmail 来进行 smtp 的启动的,那么我们就先来启动他:
 

[root@test root]# /etc/rc.d/init.d/sendmail start
Starting sendmail:                                         [  OK  ]
[root@test root]# netstat -an|more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
tcp        0      0 192.168.1.2:22          192.168.1.11:3175       ESTABLISHED
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  8      [ ]         DGRAM                    944    /dev/log
unix  2      [ ]         DGRAM                    3161529
unix  2      [ ]         DGRAM                    3160038
unix  2      [ ]         DGRAM                    739227
unix  2      [ ]         DGRAM                    739189
unix  2      [ ]         DGRAM                    1070
unix  2      [ ]         DGRAM                    953
unix  2      [ ]         STREAM     CONNECTED     690
# 看!那个 127.0.0.1:25 出现了!!
 
[root@test root]# /etc/rc.d/init.d/sendmail stop
Shutting down sendmail:                                    [  OK  ]

 
那如果要关闭的话,就停止 sendmail 呀!直接以上面的方式关闭呀!这样就好啰!这样您再以 netstat -an 看一下,呵呵! port 25 就被关掉喔!很简单吧!当然,您也可以藉由 netstat -anp 找到 PID 之后,以 kill 指令来关闭也是可以的!
 
OK
!那么启动服务的 scripts 路径在哪里?如果您还记得『 』那一篇文章的时候,那么应该就会记得我们目前的几个 port 启动的路径预设都放置在:
 

    • /etc/rc.d/init.d
    • /etc/xinetd.d

 
这两个路径底下,那个 /etc/rc.d/init.d 是以 RPM 来安装套件的时候,一定会存在的目录,这个目录记录了所有的服务的启动之 scripts ,这也就是刚刚为何我会以
/etc/rc.d/init.d/sendmail start 来启动我的 sendmail 服务的原因啰!至于那个 /etc/xinetd.d 目录下的档案,就是挂在 xinetd 这个 super daemon 服务底下的服务套件啦!最常见的有 FTP, Telnet, POP3, IMAP 等等,都是由 xinetd 统一统筹来进行整理!所以,当您要启动 telnet 时,就直接到 /etc/xinetd.d 里面去,然后将 telnet 这个档案的 disable = yes 改成 disable = no ,然后『重新启动 xinetd 这个服务!』没错!我没有写错!就是 xinetd !因为我刚刚提过啦,由于 telnet 是由 xinetd 统一统筹的,所以要启动 telnet 自然就是将 xinetd 重新启动即可!
 

    • /etc/rc.d/init.d/xinetd restart

 
如何!不难吧!简单的很!好了,那么除了直接以文件名称来启动关闭之外,有没有其它较为简易的方式来启动的啦!?当然有!就是使用 这个指令说!例如要重新启动 xinetd ,可以这么写:(注: service 这个指令并非所有的 Linux distribution 都存在,仅有 Red Hat 及 Mandrake 上面才会发现这个指令喔!)
 

    • service xinetd restart

设定开机时启动服务的方法:

上一小节提到的都是立刻生效的服务启动或关闭的方法,那么有没有方法可以在开机启动的时候就设定不要启动呢?您还记得在 那一篇文章吗?开机的程序在经历了:
 

    1. BIOS
    2. MBR
    3. Linux Loader
    4. Kernel, init ( 取得 run-level ),
    5. /etc/rc.d/,
    6. /etc/modules.conf,
    7. /etc/rc.d/rc[0-6].d,
    8. /etc/rc.d/rc.local

 
等等程序后,就是开机完毕啦!那个系统就成功的启动啦!而其中启动服务的项目在哪里呢?呵呵!就是在第七步骤,以我为例,通常我都是以文字接口 登入我的系统,文字接口的 run-level 为 3 ,所以这个时候我就可以在 /etc/rc.d/rc3.d 里头找到我的服务的启动项目啦!就是 S 开头的档案!这些相关的概念如果忘记的话,请在前往 那一章节去读一读去!那么如果不要启动一些服务的话,很简单呀!就是将该服务的对应档案( 指 S 开头的档案 )删除就可以啦! ^_^""
 
但是我要自己一个档案一个档案去删除他吗?!呵呵!当然不需要啦! Red Hat 与 Mandrake 等较流行的 Linux distribution 很细心的写了几支程序来帮您搞定他!那就是:
 

 
这三支程序的使用方式我已经在基础学习篇介绍过了,这里就不再啰唆啰!请前往基础学习篇-- 里头看看吧!
 
那么是否要将所有 Linux 预设的服务都关闭呢?呵呵!请注意呦!『不是将所有的服务都关掉就是安全的!』因为系统还有很多的项目是『一定要启动的!』否则将会反而变的不安全呢!底下列出来一些完全没有对外开放 port 的,但却是系统必需要的服务项目,这些项目请『务必』不要关闭了!
 

服务名称      服务内容说明
===============================================================================
atd        在 里头提到的,单一次预约命令执行的服务,务必启动!
cron        在 里头提到的,循环执行的命令,务必启动!
iptables      这个是防火墙软件,无论如何,先启动他吧!
keytables     设定键盘的上面的字母的格式!当然需要读入了!不然如何控制!
network      您总该不会不想要有网络吧?!所以这个也请启动啰!
random       快速的将系统的状态在随机的时间内存到映象文件当中,对于系统
          相当重要!因为在开机之后,系统会迅速的回复到关机之前的状态!
syslog       在 里面提过很多次了!相当重要的服务!务必启动!
xinetd       对啦!另一个服务管理员 super daemon!也是必须要启动的项目之一!
xfs        如果您是使用 run-level 为 5 的图形接口,那么这个也必须要启动啦

 
没错!不要怀疑!只要这些就可以啦!这几个服务是必须要启动的!至于其它服务则都先不用启动!例如 sendmail 啦!其它林林总总的数据,都先摆着!我们会在后续的章节当中提到如何启动这些服务的啦!


安全性: 关闭所有对外开放的 port

在您安装了 Linux 之后呢,相信有很多的朋友会开始想要作一些很炫的服务,例如 WWW 或者是 mail 亦或是 FTP 的服务,但是,这些服务都有潜在性的危险喔,很多的黑客就是利用您开启的这些服务来进行网站的破坏!基本上,比较麻烦的是『特洛伊木马』这一类的后门程序,以您的网站做为中继站去攻击黑客想要攻击的目标。所以啰,灌完了 Linux 之后,先将一些不必要的程序或服务移除吧!以保障您的网络安全!其中,更重要的则是将所有的对外的 port 都先关起来!有需要的才开启!好了,利用我们刚刚提到的几个方法将您的对外的 port 都关起来吧!
 

1. 使用 ntsysv 设定开机时启动的服务项目:
[root@test root]# ntsysv
只要选择底下几个服务即可(注意!我是以 Red Hat 的文字接口为基础的)
atd, cron, iptables, keytables, network, random, syslog, xinetd
如果是 Mandrake 的话,就得要使用 chkconfig 了!

2. 重新开机让设定生效:
[root@test root]# reboot

3. 观察目前的 port 开启多少个?
[root@test root]# netstat -an | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  7      [ ]         DGRAM                    944    /dev/log
unix  2      [ ]         DGRAM                    3162963
unix  2      [ ]         DGRAM                    739227
unix  2      [ ]         DGRAM                    739189
unix  2      [ ]         DGRAM                    1070
unix  2      [ ]         DGRAM                    953
unix  2      [ ]         STREAM     CONNECTED     690

 
这样一来,所有的对外窗口将暂时的全部关闭了!好了,准备要来玩架站啰!一个一个的启动我们的 port 吧! ^_^


课后练习:

  • 如何观察您 Linux 主机上面已经有多少 port 被打开了?
  • 如何观察程序?
  • 请问 LISTEN 的 port 与 daemon 的关系为何?
  • 请解释三向交握的原理与封包传输的方向。
  • 请问 stand alone 与 super daemon 各是什么?
  • 请问您的 Linux 主机 (不论是那个 distributions ) 有关 daemon 启动与关闭的 scripts 与档案放置在那个目录下?
  • 请将您的 linux 主机对外的联机端口口全部关闭!

 

阅读(877) | 评论(0) | 转发(0) |
0

上一篇:裁减linux内核

下一篇:分析linux的内核链表

给主人留下些什么吧!~~