服务器架设篇 - RedHat 9

第七章、限制连外端口口

将 Linux 对外开放的 port ,只要是不需要,就给他关掉!

最近更新时间: 2003/09/19

本文数据主要针对 RedHat 9 的系统进行说明,要注意的是,RedHat 9 与 Red Hat Enterprise Linux (RHEL) 是完全不同的东西!RedHat 9 在 2003 年推出,在 2004 年就不再维护了!这部份网站更新到 2005 年,也没有再维护过! 因此,建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 RedHat 9 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!
为什么我们的主机会回应网络上面的一些要求封包呢?例如我们设置了一部 WWW 主机后,当有来自 Internet 的 WWW 要求时,我们的主机就会予以回应,这是因为我们的主机有激活了 WWW 的监听端口口 (port) 啊!这里就要特别留意了,当我们激活了一个 daemon 时,就可能会造成主机的 Port 在进行 Listen 的动作,此时该 daemon 就是已经对网络上面提供服务了!万一这个 daemon 有漏洞,因为他提供 Internet 的服务,所以就容易被 Internet 上面的 cracker 所入侵了!所以说,仔细的检查自己系统上面的 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/IP 数据吧?对啦! TCP 封包在发送的时候,在 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 这个文件啰!我们在 Linux 常用网络指令里面提到的 netstat 的功能时,有没有加上 -n 这个参数是有影响的!当不加 -n 这个参数时,直接下达『 netstat -tl 』竟然可以告诉我目前正在 LISTEN 的服务名称!嘿嘿!这就是 /etc/services 的功能啦!此外, /etc/services 也是某些服务在启动的时候,设置 port number 的重要依据,例如 Wu-FTP 的端口口就是由这个文件来控管的。来看一看 /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 系统中,服务项目是越少越好!这样可以避免不必要的入侵管道喔!因此,这个时候请了解一下您的系统当中,有没有哪些服务被打开了呢?要了解自己的系统当中的服务项目,最简便的方法就是使用 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 netstat 来查阅一番喔!相信对您的主机会有更大的了解呦!
     
    相信有不少的朋友都会有这个困扰,就是要怎样删除已经创建的连接呢?因为总有些不速之客会连到您的主机来进行一些破坏的工作!或者是您根本不想让对方连接过来!呵呵!还记得 鸟哥的 Linux 私房菜--基础学习篇内的资源管理 里面提到的几个常用的指令吧!?那就是找出那个连接进程的 PID ,然后给他 kill 掉就是了!简单呀!不过,大问题是『我要怎样找出连接的 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 )也就是我们要来砍掉的啦!这个时候,如果要将该连接砍掉时,就直接以 kill 来做吧!
     
    [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 <扫瞄类型> <扫瞄参数> <Hosts 地址与范围>
    参数说明:
    <扫瞄类型>:主要的扫瞄类型有底下几种:
      -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 等等的使用方式
    <Hosts 地址与范围>:这个有趣多了,有几种类似的类型
      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 的功能相当的强大,也是因为如此,所以很多刚在练习的黑客会使用这个软件来进行侦测别人的电脑,这个时候请您特别留意,目前很多的人已经都有『特别的方式』来进行登录的工作!例如以 TCP_Wrappers ( /etc/hosts.allow, /etc/hosts.deny ) 的功能来记录曾经侦测过该 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 路径在哪里?如果您还记得『 鸟哥的 Linux 私房菜 -- 基础学习篇内的认识服务 』那一篇文章的时候,那么应该就会记得我们目前的几个 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
     
    如何!不难吧!简单的很!好了,那么除了直接以文件名称来启动关闭之外,有没有其他较为简易的方式来启动的啦!?当然有!就是使用 service 这个指令说!例如要重新启动 xinetd ,可以这么写:(注: service 这个指令并非所有的 Linux distribution 都存在,仅有 Red Hat 及 Mandrake 上面才会发现这个指令喔!)
     
    • service xinetd restart

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

    上一小节提到的都是立刻生效的服务启动或关闭的方法,那么有没有方法可以在开机启动的时候就设置不要启动呢?您还记得在 基础学习篇--Linux 开机关机进程 那一篇文章吗?开机的进程在经历了:
     
    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 主机对外的连接端口口全部关闭!

  • 前往参考用解答
修改历史:
2002/08/02:首次完成发布
2003/08/21:重新编辑,并且加入课后练习。
2003/09/19:加入参考用解答了。
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计