Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2474757
  • 博文数量: 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 这个服务来处理,当然就不会搞乱啰! ( 注:嘿嘿!有些很少接触到网络的朋友,常常会问说:『咦!为什么您的计算机同时有 FTPWWWE-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 的数字!如上所示,目前我主机上面的服务共开启了:『 pop3imapftpsshsmtp 』等服务 (就是在 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 主机对外的联机端口口全部关闭!

 

阅读(798) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~