since2012/04/23

     
 
简易 Firewall 架设
本文已不再维护,更新文章请参考此处
最近更新日期:2003/08/25
在谈完了基本的网络安全观念之后,这个章节主要就要针对『防火墙』来进行介绍了!目前的防火墙机制主要是以 Linux Kernel 2.4 版的 iptables 为主的,而 iptables 可以使用指令来下达,也可以透过编写 shell script 来进行指令的整合。鸟哥本人比较习惯使用 scripts 来进行 iptables 的机制规划呢!除了 iptables 之外,事实上,比较简单的还有 TCP Wrappers 这个玩意儿,他则主要是针对某些服务来进行管理的吶!本章的内容主要就是在介绍这两个重要的防火墙软件了!

大标题的图示防火墙:
    网络安全除了随时注意套件的漏洞,以及网络上的安全通报之外,您最好能够依据自己的环境来订定防火墙机制,这样对于您的网络环境,会比较有保障一点喔!那么什么是防火墙呢?说穿了,其实防火墙就是在管制进入到我们网域内的主机(或者可以说是网域)的资料封包的一种机制,例如我们在前一章节认识网络安全当中提到的 iptables 就是一种防火墙机制了。当然了,更广义的来说,只要能够分析与过滤进入我们管理之网域的封包资料,就可以称为防火墙, 所以这个防火墙又可以分为硬件防火墙与本机的软件防火墙啊!硬件防火墙也就是一些厂商设计好的硬件,里面的系统软件已经设定好了封包数据的过滤机制,因为 他几乎单纯就是用来进行网络安全管理的,所以称为硬件防火墙。至于软件防火墙呢?那就是我们这个章节要来谈论的啊!软件防火墙本身就是在保护系统网络安全 的一套软件(或称为机制),例如 iptables 与 TCP Wrappers 都可以称为软件防火墙。无论怎么分,反正防火墙就是用来保护我们网络安全的咚咚就对啦!呵呵!我们这个章节主要在介绍 Linux 系统本身提供的软件防火墙的功能,那就是 iptables 与 TCP Wrappers 喔!
     

    为何需要防火墙
     
    因为不希望常常在网络上面看到『唉呀!我依据某某网页的信息架设了一个 Linux 主机,为什么过了一个星期之后,以 root 的密码无法登入我的主机?』,还有一种说法『唉呦!我的 Linux 主机为什么无法查询登录文件了?为什么被 ISP 警告说我的 mail server 被列为黑名单了,为什么被侦测到说我有攻击人家?我都没有做坏事呀!?』呵呵!很伤脑筋对不对~没错啦!网络安全果然是很麻烦!又得要天天照顾他,又得要 随时更新到最新版的套件!唉~麻烦吶!但是网络安全却又是一个网管人员的基本知识要求,一个具有良好的防火墙措施的主机,可以让一个网管人员过的更开心 呀!
     
    要晓得的是,我们是一般的小家庭,所以主机即使被 Cracker 入侵,只要在对方利用我们的 IP 干坏事之前就将主机给他关掉的话,还能稍微保护一下自己,但是若您是一个大型企业的主机,而且还提供有关信用卡啦,个人用户的信息啦等等的讯息时,那么可 不能说关机就关机的,这个时候怎么办?如果您没有设定紧急应变手则,没有良好的登录档案分析习惯,也没有实时回报系统在帮您侦测您的主机,嘿嘿!那总损失 除了金额之外,还包括公司的信誉,那可是很可怕的呦!由国外的分析可以发现,几乎主机被入侵之后,损失的除了金钱之外,还有主机维护的时间、软硬件重新设 定的费用等等,相当可观的一笔费用呀~
     
    所以啦!架设一部具有较为安全的主机,对我们来说,也是相当重要的,怎么说呢?别以为我们是一般的 ADSL 拨接的小站就无所谓呦!等到真的被入侵之后,然后您的主机被利用来作坏事,然后利用您的主机作坏事的那个人又将他的登录信息杀掉,让人家找不到他,嘿嘿!到时候吃官司的可会是您!别以为 ADSL 拨接制的带宽不足呢!要使用您的主机来做事那也不需要多大的带宽,只要能连上 Internet ,只要能再藉由您的主机向外面扩散,嘿嘿!再怎么小的带宽都有人会利用的!『千万不要小看系统的安全性~
     

    防火墙的主要类别
     
    除了以软件及硬件作为防火墙的分类之外,基本上,我们也可以使用防火墙对于封包的抵挡机制来进行分类。主要可以分为两大类,分别是代理服务器 (Proxy) 以及 IP Filter 。在代理服务器方面,由名称我们就可以知道,代理服务器仅是代理 Client 端去向 Internet 要求数据,所以呢, Proxy 其实已经将可代理的协议限制的很少很少,并且由于内部与外部计算机的并不能直接互通,所以可以达到良好的保护效果;另一种则是上面提到的 IP fileter 啦!利用封包过滤的方式来达到防火墙的目的!
     
    • Proxy :

    • 这是属于网络『应用层』的咚咚了,这个 Proxy ( 代理服务器 ) 基本上就是一种『服务』喔!他的功能可以如下图来表示:
       

      图一、Proxy 主机的示意图
       
      当 Client 有要求的时候, Proxy Server 会帮 Client 去外面捉取数据,然后再将数据丢回给 Client 端!请注意,此时真正出去 Internet 的,其实是 Proxy Server ,而不是 Client 端呦!( 这个跟 NAT 服务并不太一样,会在后续的 NAT主机设定时再提到。) 由于 Client 端并不是直接出去,加上 Proxy Server 一般仅开放 80 及 21, 20 port 而已,因此可以较为安全!相对的,对于 Client 端的限制自然就较多了!更详细的 Proxy 说明我们会在后续的代理服务器章节中提到。
       
    • IP fileter :

    • 直接以 IP filter 来进行封包的过滤!这个时候会由 TCP 的 header 分析起来,再决定是否可以让该 TCP 封包进入主机。因为是分析 TCP/IP 的封包,所以使用到的网络协议是比较底层的信息喔,因为底层的信息相当的复杂,包括了网络卡的硬件地址(MAC)、软件地址、TCP, UDP, ICMP 等封包的 Header 讯息、TCP 封包的三向交握观念等等,所以 IP Filter 可以达成的功能可就大的多了!另外,一般我们谈到的 Linux 上的防火墙大多指的就是 iptables 这个 IP Filter 机制了,他利用一些封包过滤的规则设定,来定义出什么数据可以接收,什么数据需要剔除,以达到保护主机的目的喔!
     
    在这个章节中,我们先不谈 Proxy 这个东西,仅来分析一下最基础的两个防火墙机制,一个是 iptables ,另一个则是 TCP_Wrappers !
     

    防火墙的一般线路布线与抵挡技巧
     
    由前面的说明当中,您应该可以了解到一件事,那就是防火墙除了可以『保护防火墙机制(iptables)本身所在的那部主机』之外,还可以『保护防火墙后面的主机或 PC』。呵呵!没错!防火墙的功能可是很大的喔!除了可以帮助我们抵御外来的主动联机之外,也可以帮我们控管网络流量,并且,在简单的局域网络规划中, Firewall 搭配 Router ( 就是 NAT 主机的架构 ) 也是相当常见的一种规划!这种规划对于内部私有网域的安全也有一定程度的保护作用呢!底下我们稍微谈一谈目前常见的防火墙规划:
     
    • 单一 Linux 主机兼任防火墙功能:

    • 我们的网域里面仅有一部 Linux 主机,该主机负责我们整个 LAN 里面所有个人计算机对外的联机,所以他也是我们 LAN 里面的 Router 。该防火墙一般会有两个接口,一个对内一个对外,同时,您也可以直接在 Linux 防火墙上面架设网站,这是目前针对小型的企业所常见的网络配置状态。在这样的配置状态中,所有的 PC 都会经过 Firewall 的封包过滤之后,才能将数据封包送出或者是收受,而如果 Internet 上面出现问题,您只要管理 Firewall 那部主机,就可以很轻易的将来自 Internet 的不良封包抵挡掉喔!管理一部防火墙就能够造福整个 LAN 里面的 PC,很划算吧! ^_^!而且,在 Firewall 上面可以同时架设 Proxy ,用来控制 Client 端的 WWW 联机状态,呵呵!控制的更详尽吶!(注:也可以加设网络流量监控软件,例如 MRTG 来分析带宽喔!)基本上,这样的配置好处为:
      • 安全维护在内部可以开放的权限较大!
      • 安全机制的设定可以针对 Linux 主机来维护即可!
      • 对外只看的到 Linux 主机,所以对于内部可以达到有效的安全防护!
       

      图二、单一 Linux 防火墙主机
       
    • 单一 Linux 防火墙,但 LAN 内另设防火墙:

    • 一般来说,我们的防火墙对于 LAN 的防备都不会设定的很严格,因为是我们自己的 LAN 嘛!所以是信任网域之一啰!不过,最常听到的入侵方法也是使用这样的一个信任漏洞!因为您不能保证所有使用企业内部计算机的用户都是公司的员工,也无法保证您的员工不会『搞破坏!』呵呵!所以,如果您有特别重要的部门需要更安全的保护网络环境,那么将 LAN 里面再加设一个防火墙,将安全等级分类,那么将会让您的重要数据获得更佳的保护喔!
       

      图三、LAN 里面加设防火墙的配置
       
    • 在防火墙后端的主机设定:

    • 还有一种更有趣的设定,那就是将提供网络服务的服务器放在防火墙后面,这有什么好处呢?如下图四所示,Web, Mail 与 FTP 都是透过防火墙连到 Internet 上面去,所以,底下这四部主机在 Internet 上面的 Public IP 都是一样的!(这个观念我们会在 NAT 主机的时候再次的强调)只是透过防火墙的封包分析后,将 WWW 的要求封包转送到 Web 主机,将 Mail 送给 Mail Server 去处理而已(透过 port 的不同来转递)。好了,因为四部主机在 Internet 上面看到的 IP 都相同,但是事实上却是四部不同的主机,而当有攻击者想要入侵您的 FTP 主机好了,他使用各种分析方法去进攻的主机,其实是『防火墙』那一部,攻击者想要攻击您内部的主机,除非他能够成功的搞定您的防火墙,否则就很难入侵您的内部主机呢!不过,这种架构下所进行的设定就得包含 port 的转递,对于新手来说,设定上有一定的难度,鸟哥个人不太建议新手这么做,还是等以后有经验之后再来玩这种架构吧!
       

      图四、架设在防火墙后端的主机服务器
     
    上面就是目前比较常见的几种防火墙的配置方法。那么如何进行封包的抵挡设定呢?再来复习一下一个数据封包的内容,如下图所示:
     

    图五、一般数据封包所含有的基础信息
     
    由于防火墙可以分析网络上传送过来的数据封包,并取得分析该资料封包的表头数据,亦即可以分析上面图示中的目的地与来源地的 IP, port, 是否主动联机等等的其他信息!所以经由分析这些资料后,我们不难发现抵挡的方法可以有几个动作:
     
    • 拒绝让封包进入主机的某些 port

    • 这个应该不难了解吧!例如您的 port 20-21 这个 FTP 相关的 port ,您只要开放给内部网络的话,所以不对 Internet 开放,那么当 Internet 来的封包想要进入您的 port 20-21 的话,就可以将该数据封包丢掉!因为我们可以分析的到该封包所带有的 port 号码呀!
       
    • 拒绝让某些来源 IP 的封包进入

    • 例如您已经发现某个 IP 主要都是来自攻击行为的主机,那么只要来自该 IP 的资料封包,就将他丢弃!这样也可以达到基础的安全呦!
       
    • 拒绝让带有某些特殊旗标( flag )的封包进入

    • 最常拒绝的就是带有 SYN 的主动联机的旗标了!只要一经发现,嘿嘿!您就可以将该封包丢弃呀!
       
    • 分析硬件地址(MAC)来提供服务:

    • 如果您的局域网络里面有比较捣蛋的但是又具有比较高强的网络功力的高手时,如果您使用 IP 来抵挡他使用网络的权限,而他却懂得反正换一个 IP 就好了,都在同一个网域内嘛!同样还是在搞破坏~怎么办?!没关系,我们可以死锁他的网络卡硬件地址啊!因为 MAC 是焊在网络卡上面的,所以您只要分析到该使用者所使用的 MAC 之后,可以利用防火墙将该 MAC 锁住,呵呵!除非他能够一换再换他的网络卡来取得新的 MAC,否则换 IP 是没有用的啦!
       
    当然还有很多的技巧,这里我们就不多提了!底下好好的来谈一谈怎样建置一个简单的 firewall 主机吧!此外,我预计使用两层防火墙,分别是 iptables 与 TCP_Wrappers ,其中,两者的相关性为:
     

    图六、封包进入主机的流程
     
    也就是说,资料封包会先经过 iptables 才会经过 TCP_Wrappers 的作用!

    防火墙的使用限制
     
    什么?!设定防火墙之后还不安全啊?!那当然啦!谁说设定了防火墙之后您的系统就一定安全?!那可不一定啊!防火墙虽然可以防止不受欢迎的封包进入我们的网络当中,不过,某些情况下,他并不能保证我们的网络一定就很安全。举几个例子来谈一谈:
     
    • 防火墙并不能很有效的抵挡病毒或木马程序:假设您已经开放了 WWW 的服务,那么您的 WWW 主机上面,防火墙一定得要将 WWW 服务的 port 开放给 Client 端登入才行吧!否则您的 WWW 主机设定了等于没有用对吧!也就是说,只要进入您的主机的封包是要求 WWW 数据的,就可以通过您的防火墙。那好了,『万一您的 WWW 服务器软件有漏洞,或者本身向您要求 WWW 服务的该封包就是病毒在侦测您的系统』时,您的防火墙可是一点办法也没有啊!因为本来设定的规则就是会让他通过啊!尤其前一两年的 Nimda 病毒就是攻击 WWW 主机的,他是透过入侵 WWW 主机的 80 port ,呵呵!所以说,防火墙对于病毒并不能很有效就是了。

    •  
    • 防火墙对于来自内部 LAN 的攻击较无承受力:一般来说,我们对于 LAN 里面的主机都没有什么防火墙的设定,因为是我们自己的 LAN 啊,所以当然就设定为信任网域了!不过, LAN 里面总是可能有些网络小白啊,虽然他们不是故意要搞破坏,但是他们就是不懂嘛!所以就乱用网络了。这个时候就很糟糕,因为 Firewall 对于内部的规则设定通常比较少,所以就容易造成内部员工对于网络误用或滥用的情况。为了避免这种情况的发生,呵呵!身为系统管理员的您
     
    所以啦,在您的 Linux 主机实地上网之前,还是得先:
     
    • 关闭几个不安全的服务;
    • 升级几个可能有问题的套件;
    • 架设好最起码的安全防护--防火墙--
     
    其他相关的讯息请到 认识网络安全--主机防护计划 里面去看一看怎么增加自身的安全吧!

大标题的图示Linux 的封包过滤机制
    终于可以谈到主题了!^_^!底下我们就要来谈一谈,什么是 Linux 的封包过滤机制!
     

    Linux 核心版本与防火墙机制
     
    Linux 在封包过滤机制是慢慢演进形成目前的 iptables 的,在核心不为 2.4 的时代,使用的防火墙机制是不同的!
     
    • Version 2.0:使用 ipfwadm 这个防火墙机制;
    • Version 2.2:使用的是 ipchains 这个防火墙机制;
    • Version 2.4:主要是使用 iptables 这个防火墙机制,而为了兼容于 ipchains ,因此在 Version 2.4 版本中,同时将 ipchains 编译成为模块,好让用户仍然可以使用来自 2.2 版的 ipchains 的防火墙规划。
     
    由上面的说明中,可以知道 Linux 上面的防火墙机制是依据不同核心而变的,而因为目前我们看到的新的 Linux 版本之核心都是 2.4.xx 版本,所以使用的防火墙机制当然就是以 iptables 为准了。此外,还要特别留意的是,核心为 2.4 版本的 Linux 同时支持 ipchains 这个在核心 2.2 版的防火墙机制,然而不幸的是,『iptables 与 ipchains 两者不能同时执行!』,所以如果您发现您的系统已经在执行 ipchains 了,那么就得将 ipchains 这个模块移除之后,才能够使用 iptables ,反之亦然喔!
     
    无论如何,在核心为 2.4.xx 的系统上面,还是比较建议使用 iptables ,因为 iptables 功能比较强大而且在规则设定上面比较简单,此外,还具有其他支持的外挂模块,而虽然 2.4 同时支持 ipchains ,不过在 2.2 上面支持 ipchains 的模块都不再 2.4 上面存在了,所以,当然选择功能更强的 iptables 咯。那么如何知道我的 Linux 核心版本?呵呵!使用 uname 这个指令就对了!
     

    iptables 的表格与封包进入的流程
     
    只要是防火墙机制,通常都是以『针对封包的分析规则来规范每种封包的通过与否,以及应该进行的动作』,同样的道理,iptables 的工作方向,必须要依规则的顺序来分析封包,举个简单的例子,假设我有十条防火墙规则好了,那么当 Internet 来了一个封包想要进入我的主机,那么防火墙会怎么分析这个封包呢?我们以底下的图示来说明好了:
     

    图七、封包过滤的规则动作
     
    上面图七的 Rule 是规则的意思,『这些规则是有顺序的』,至于 Action 则是动作的意思,通常针对封包的动作有 ACCEPT/DROP (接受/丢弃) 两种动作。什么是『规则的顺序呢』?让我们看一下上面的例子,当 TCP 封包通过了 Rule 1 ,刚好符合 Rule 1 的规定,那么 TCP 封包就会进行 Action 1 ,而不会理会 Rule 2 以后的规则了!而如果 TCP 不符合 Rule 1 的规定,那么就会进入第二条规则 (Rule 2) 来检查,....一直到 Rule 10 的时候,该 TCP 封包都没有符合的规则可以进行,那么此时就会以『预设动作 ( 封包政策, Policy )』来让 TCP 封包进行通过与否的动作。所以啦,当您的规则的顺序排列错误时,就会产生很大的困扰!怎么说呢?我们再举个例子好了,假设您的 Linux 主机提供了 WWW 的服务,那么自然就要针对 port 80 来启用通过的封包规则,但是您发现 IP 来源为 192.168.100.100 老是恶意的尝试入侵您的系统,所以您想要将该 IP 拒绝往来,最后,所有的非 WWW 的封包都给他丢弃,就这三个规则来说,您要如何设定防火墙检验顺序呢?
     
    1. Rule 1 先抵挡 192.168.100.100 ;
    2. Rule 2 再让要求 WWW 服务的封包通过;
    3. Rule 3 将所有的封包丢弃。
     
    这样的排列顺序就能符合您的需求,不过,万一您的顺序排错了,变成:
     
    1. Rule 1 先让要求 WWW 服务的封包通过;
    2. Rule 2 再抵挡 192.168.100.100 ;
    3. Rule 3 将所有的封包丢弃。
     
    此时,那个 192.168.100.100 『可以使用您的 WWW 服务』喔!因为只要他对您的主机送出 WWW 要求封包,就可以使用您的 WWW 主机功能了,因为您的规则顺序定义第一条就会让他通过,而不去考虑第二条规则!这样可以理解规则顺序的意义了吗?!现在再来想一想,如果 Rule 1 变成了『将所有的封包丢弃』,Rule 2 才设定『WWW 服务封包通过』,请问,我的 client 可以使用我的 WWW 服务吗?!呵呵!答案是『否~』想通了吗?! ^_^
     
    事实上,图七就是 iptables 的『一张表格里面的一条链(chains)』,您可以想象一下, iptables 的规则都是写在『表格, table』里面的,而每个表格又依据封包的行进路线,而可大略分为三条链:『进入、输出、转递』等。在 iptables 里面有两个经常用到的内建表格 (build-in table) ,分别是针对主机的 filter 以及针对防火墙后端的主机设定的 nat 两个,这两个表格又分别具有三条链,分别是:
     
    • filter:主要跟 Linux 本机有关,这个是预设的 table 喔!
      • INPUT:主要与封包想要进入我们 Linux 本机有关;
      • OUTPUT:主要与我们 Linux 本机所要送出的封包有关;
      • FORWARD:这个咚咚与 Linux 本机比较没有关系,他可以封包『转递』到后端的计算机中,与 nat 这个 table 相关性很高。
       
    • nat:主要跟 NAT 主机的设定有关
      • PREROUTING:在进行路由判断之前所要进行的规则
      • POSTROUTING:在进行路由判断之后所要进行的规则
      • OUTPUT:与发送出去的封包有关
     
    所以说,如图七的规则订定至少就会有六组吶!那么这六条链有什么相关性呢?这得需要由封包的行进路线来说明:
     
    • 封包想要进入本机:

    • 当有封包想要进入我们 Linux 本机时,该封包会经过两条链,分别得先通过 nat 的 PREROUTING 链,再通过 filter 的 INPUT 链才能进入本机使用我们本机的资源。事实上,如果仅考虑本机的话,那么 nat 的 PREROUTING 预设政策就给他通过,仅考虑 filter 的 INPUT 即可
       

      图八、进入本机封包所需通过的 table 与 chains
       
    • 封包想要进入本机后端的计算机:

    • 当封包想要进入本机后端的计算机时,也就是说,其实该数据封包不是要使用本机的资源,所以如同底下的图九所示,封包并不会进入本机喔!而且,此时封包的流通与 nat 的 PREROUTING, POSTROUTING 以及 filter 的 FORWARD 是有关系的!这点要特别特别注意啊!
       

      图九、进入本机后端的计算机时,封包所需通过的 table 与 chains
    • 由本机发送的封包:

    • 呵呵!iptables 不只可以管制由外而内的封包,同时也可以管制由内而外的讯息呢!当封包由本机传送出去时,会通过 nat 与 filter 的 OUTPUT 链,还会有 POSTROUTING 的检查喔!事实上,如果不考虑我们本机后端的计算机,那么仅要使用 filter 的 OUTPUT 链即可
       

      图十、本机发送出的封包所需通过的 table 与 chains
     
    一般来说,如果您的防火墙是设在 Linux 本机上面,并且您的 Linux 本机并没有启用 NAT 的功能,那么您只需要考虑 filter 这个 table 的 INPUT 与 OUTPUT 这两条链就可以了!简化的很多喔!但是如果您的 Linux 主机还有考虑到 NAT 的功能,那么 nat table 的 PREROUTING 与 POSTROUTING 还有 filter table 的 FORWARD 就得需要好好的设定一番了!底下我们就来谈一谈,那么要怎么设定 iptables 的规则语法吧!
     

    iptables 的语法
     
    事实上, iptables 就是一个可以加载的模块,在开始进行 iptables 的设定之前,先确认一下,由于 ipchains 与 iptables 是不能同时存在的,所以先检查一下 ipchains 是否不小心被加载到系统当中了呢?
     
    [root@test root]# lsmod
    # 若有发现 ipchains 的字样,表示系统不小心加载了 ipchains 了,请使用:
    [root@test root]# rmmod ipchains
    # 这样就能够移除 ipchains 了!然后加载 iptables 吧!
    [root@test root]# modprobe ip_tables
     
    上头的 ip_tables 就是 iptables 的模块了!加载之后,我们就可以使用 iptables 的语法了!因为 iptables 的语法相当的多,所以底下我将这些语法分成规则清除、定义政策以及新增与插入规则三部分来说明:(注:防火墙的设定是相当重要的工作,另外,他的设定过程当中常常会有『测试』的意味在里面,因为是测试,有的时候我们会不小心『将自己的联机封包挡住了!』,导致无法联机,所以,『设定防火墙的时候,尽量在本机前面设定,不要利用远程联机服务来设定,否则很容易产生自己将自己挡掉的重大问题!』)
     

      清除规则与观察规则
       
      iptables 在一开始的时候,应该是没有规则的,不过,可能因为您在安装的时候就有选择系统自动帮您建立防火墙机制,此时系统就会有默认的防火墙规则了!好了,无论如何,我们先来看看目前本机的防火墙规则是如何吧!?
       
      [root@test root]# iptables [-t tables] [-L] [-n]
      参数说明:
      -t:后面接 iptables 的 table ,例如 nat 或 filter ,如果没有 -t table 
        的话,那么预设就是 -t filter 这个 table 喔!
      -L:列出目前的 table 的规则
      -n:不进行 IP 与 HOSTNAME 的转换,屏幕显示讯息的速度会快很多!
      范例:
       
      [root@test root]# iptables -L -n
      Chain INPUT (policy ACCEPT)
      target     prot opt source               destination
       
      Chain FORWARD (policy ACCEPT)
      target     prot opt source               destination
       
      Chain OUTPUT (policy ACCEPT)
      target     prot opt source               destination
       
      # 仔细看到上面,因为没有加上 -t 的参数,所以默认就是 filter 这个表格,
      # 在这个表格当中有三条链,分别是 INPUT, OUTPUT 与 FORWARD ,而且因为
      # 没有规则,所以规则里面都是空的!同时注意一下,在每个 chain 的后面 () 
      # 里面,会发现有 policy 对吧!那就是『预设动作(政策)』咯!以上面来看,
      # 虽然我们启动了 iptables ,但是我们没有设定规则,然后政策又是 ACCEPT,
      # 所以『任何封包都会接受』的意思喔!
       
      [root@test root]# iptables -t nat -L -n
      Chain PREROUTING (policy ACCEPT)
      target     prot opt source               destination

      Chain POSTROUTING (policy ACCEPT)
      target     prot opt source               destination

      Chain OUTPUT (policy ACCEPT)
      target     prot opt source               destination
       
      # 与 filter 类似的, nat 这个表格里面有的则是 PREROUTING, POSTROUTING
      # 以及 OUTPUT 三条链啊!

       
      至于要清除规则的话,就得要这样下达指令了!
       
      [root@test root]# /sbin/iptables [-t tables] [-FXZ]
      参数说明:
      -F :清除所有的已订定的规则;
      -X :杀掉所有使用者建立的 chain (应该说的是 tables )啰;
      -Z :将所有的 chain 的计数与流量统计都归零
      范例:
      [root@test root]# /sbin/iptables -F
      [root@test root]# /sbin/iptables -X
      [root@test root]# /sbin/iptables -Z
      [root@test root]# /sbin/iptables -t nat -F 
      # 请注意,如果在远程联机的时候,『这三个指令必须要用 scripts 来连续执行』,
      # 不然肯定『会让您自己被主机挡在门外!』
       
      一般来说,我们在重新定义防火墙的时候,都会先将规则给他清除掉。还记得我们前面谈到的,防火墙的『规则顺序』是有特殊意义的,所以啰,当然先清除掉规则,然后一条一条来设定会比较容易一点啦!
       

      定义政策
       
      清除规则之后,再接下来就是要设定规则的政策啦!还记得政策指的是什么吗?『当您的封包不在您设定的规则之内时,则该封包的通过与否,以 Policy 的设定为准』,通常这个政策在 filter 这个 table 的 INPUT 链方面可以定义的比较严格一点,而 FORWARD 与 OUTPUT 则可以订定的松一些!通常我都是将 INPUT 的 policy 定义为 DROP 啦!全部都挡掉再说!
       
      [root@test root]# /sbin/iptables [-t tables] [-P] [INPUT,OUTPUT,FORWARD| PREROUTING,OUTPUT,POSTROUTING] [ACCEPT,DROP]
      参数说明:
      -P   :定义政策( Policy )。注意,这个 P 为大写啊!
      INPUT :封包为输入主机的方向;
      OUTPUT :封包为输出主机的方向;
      FORWARD:封包为不进入主机而向外再传输出去的方向;
      PREROUTING :在进入路由之前进行的工作;
      OUTPUT   :封包为输出主机的方向;
      POSTROUTING:在进入路由之后进行的工作。
      范例:
      [root@test root]# /sbin/iptables -P   INPUT DROP
      [root@test root]# /sbin/iptables -P  OUTPUT ACCEPT
      [root@test root]# /sbin/iptables -P FORWARD ACCEPT
      [root@test root]# /sbin/iptables -t nat -P  PREROUTING ACCEPT
      [root@test root]# /sbin/iptables -t nat -P      OUTPUT ACCEPT
      [root@test root]# /sbin/iptables -t nat -P POSTROUTING ACCEPT
      # 除了 INPUT 之外,其他都给他设定为接受啰!在上面的设定之后,
      # 我们的主机发出的封包可以出去,但是任何封包都无法进入,
      # 包括回应给我们送出封包的响应封包(ACK)也无法进入喔! ^_^
       

      增加与插入规则
       
      好了,接下来准备要来定义规则了!请注意,在这个小节里面我们完全都针对 Linux 本机来进行设定 ( 就是仅针对 filter table 啰! ),至于 NAT 后面的主机,我们一部分留到 NAT 主机设定再谈,一部分留在本章最后面的进阶篇再谈,这里先学基础的就好了!要设定 iptables 规则的基本语法如下:
       
      [root@test root]# iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD] \
      > [-io interface] [-p tcp,udp,icmp,all] [-s IP/network] [--sport ports]  \
      > [-d IP/network] [--dport ports] -j [ACCEPT,DROP]
      参数说明:
      -A  :新增加一条规则,该规则增加在最后面,例如原本已经有四条规则,
          使用 -A 就可以加上第五条规则!
      -I  :插入一条规则,如果没有设定规则顺序,默认是插入变成第一条规则,
          例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5
       INPUT :规则设定为 filter table 的 INPUT 链
       OUTPUT :规则设定为 filter table 的 OUTPUT 链
       FORWARD:规则设定为 filter table 的 FORWARD 链
       
      -i     :设定『封包进入』的网络卡接口
      -o    :设定『封包流出』的网络卡接口
       interface :网络卡接口,例如 ppp0, eth0, eth1....
       
      -p  :请注意,这是小写呦!封包的协定啦!
       tcp :封包为 TCP 协定的封包;
       upd :封包为 UDP 协定的封包;
       icmp:封包为 ICMP 协定、
       all :表示为所有的封包!
       
      -s     :来源封包的 IP 或者是 Network ( 网域 );
      --sport:来源封包的 port 号码,也可以使用 port1:port2 如 21:23
           同时通过 21,22,23 的意思
      -d     :目标主机的 IP 或者是 Network ( 网域 );
      --dport:目标主机的 port 号码;
       
      -j   :动作,可以接底下的动作;
       ACCEPT :接受该封包
       DROP  :丢弃封包
       LOG  :将该封包的信息记录下来 (默认记录到 /var/log/messages 档案)
       
      范例:
       
      范例一:所有的来自 lo 这个界面的封包,都予以接受
      [root@test root]# iptables -A INPUT -i lo -j ACCEPT
      # 注意一下,因为 -d, --dport, -s, --sport 等等参数都没有设定,这表示:
      # 不论封包来自何处或去到哪里,只要是来自 lo 这个界面,就予以接受!
      # 这个观念挺重要的,就是『没有设定的规定,则表示该规定完全接受』的意思!
      # 例如这个案例当中,关于 -s, -d...等等的参数没有规定时!
       
      范例二:来自 192.168.0.1 这个 IP 的封包都予以接受:
      [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.1 -j ACCEPT
      # 新增一条规则,只要是来自于 192.168.0.1 的封包,不论他要去哪里,
      # 使用的是那个协议 (port) 主机都会予以接受的意思~
       
      范例三:来自 192.168.1.0 这个 C Class 的网域的任何一部计算机,就予以接受!
      [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -j ACCEPT
      # 这个是网域的写法喔!稍微注意一下的是,在范例二当中我们仅针对一个 IP ,
      # 至于这个范例当中,则是针对整个网域来开放吶!而网域的写法可以是:
      # 192.168.1.0/24 也可以是 192.168.1.0/255.255.255.0 都能够接受喔!
       
      范例四:来自 192.168.1.25 的封包都给他丢弃去!
      [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.25 -j DROP
       
      范例五:只要是想进入本机的 port 21 的封包就给他丢弃
      [root@test root]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
       
      范例六:来自 192.168.0.24 这个 IP 的封包,想要到我的 137,138,139 埠口时,都接受
      [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.24  \
      > --dport 137:139 -j ACCEPT
       
      范例七:只要是接触到我主机的 port 25 就将该封包记录 (LOG) 下来
      [root@test root]# iptables -A INPUT -p tcp --dport 25 -j LOG
      # 还是请特别注意到『规则的顺序排列』的问题喔!
       
      如上面的基本语法所示,我们的 iptables 可以规定封包『来自哪里、要去哪里、使用什么协议(port number)』等等的信息呢!所以他的功能就真的是挺强大的啊!而除了上述的功能之外,我们不是谈过,好像还可以使用网络卡的硬件地址(MAC)来进行分析吗?而且,那个 ping 的指令响应封包的 ICMP 协议也可以进行设定喔!此外,TCP 封包 Header 上面的 SYN 旗目标功能与否,也能够设定呢!底下谈一谈这些更深入的规则喔!
       
      iptables 的其他相关参数说明:
       
      [!] --syn :这个设定仅能用于 -p tcp 的规则中,因为 TCP 封包有 syn 的旗标存
        在啊!当 TCP 封包存有 syn 旗标,表示这个联机是对方『主动』连过来的!
        若于 --syn 之前加上 ! 表示该封包不带有 syn 的意思~(刚好相反之意!)
       
      范例一:将来自 192.168.100.200 的主动联机封包丢弃:
      [root@test root]# iptables -A INPUT -p tcp -i eth0 -s 192.168.1.235  \
      > --syn -j DROP
       
      --icmp-type:可以管制 ICMP 封包的某些类型!还记得我们在 网络基础 里面
        谈到的 ICMP 的某些类型吧!对啦!如果您不想要让对方 ping 到您的机器,
        就是利用这个项目啦!
       
      范例二:别的主机 ping 我们主机时,我们主机不予以回应
      [root@test root]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
      # 当您下达这样的指令后,就表示未来别人对您使用 ping 的时候,
      # 我们的主机将不会响应,所以对方主机就会显示我们主机『无法连接』的状态!
       
      -m :表示封包的状态,状态有底下数种:
       -m mac --mac-source aa:bb:cc:dd:ee:ff 
         这个就是我们上面提到的可以控制『网络卡卡号, MAC』的设定方法啰!
         那个 aa:bb:cc:dd:ee:ff 就是网络卡的 MAC !
       -m state --state <状态>
         有数种状态,状态有:
         INVALID:无效的封包,例如数据破损的封包状态
         ESTABLISHED:已经联机成功的联机状态;
         NEW:想要新建立联机的封包状态;
         RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关,
          可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,
          因为设定了他之后,只要未来由本机发送出去的封包,即使我们没有设定
          封包的 INPUT 规则,该有关的封包还是可以进入我们主机喔!
          可以简化相当多的设定规则啦!
       
      范例三:让 bb:cc:dd:aa:ee:ff 网络卡无法使用我们主机的资源
      [root@test root]# iptables -A INPUT -p all -m mac --mac-source \
      > 01:01:01:01:02:01 -j DROP
      # 这种方式可以用来管制网络卡卡号喔!就不怕别人使用 IP 搞怪了!
       
      范例四:让已经建立或者是与我们主机有关的响应封包通过,但是让不合法的,
          以及想要尝试新建立的封包被抵挡在外!
      [root@test root]# iptables -A INPUT -p tcp -m state  \
      > --state ESTABLISHED,RELATED -j ACCEPT
      [root@test root]# iptables -A INPUT -p tcp -m state  \
      > --state INVALID,NEW -j DROP
      # 需要设定两条喔!至于封包状态则可以使用逗号隔开!逗号两边不要有空格
       
      -j <动作>:除了比较常见的 ACCEPT 与 DROP 之外,还有哪些动作?
       REDIRECT --to-ports <port number>
         这个也挺常见的,基本上,就是进行本机上面 port 的转换就是了!
         不过,特别留意的是,这个动作仅能够在 nat table 的 PREROUTING 以及
         OUTPUT 链上面实行而已喔!(关于联机流程,请参考图八)
       MASQUERADE:封包伪装
         这个就是 NAT 主机最重要的一个机制啦!进行封包的伪装!
       
      范例五:将要求与 80 联机的封包转递到 8080 这个 port 
      [root@test root]# iptables -t nat -A PREROUTING -p tcp  --dport 80 \
      > -j REDIRECT --to-ports 8080
      # 这玩意最容易在您使用了非正规的 port 来进行某些 well known 的协议,
      # 例如使用 8080 这个 port 来启动 WWW ,但是别人都以 port 80 来联机,
      # 所以,您就可以使用上面的方式来将对方对您主机的联机传递到 8080 啰!
       
      范例六:进行封包的伪装,将来自 192.168.0.0/24 的封包的来源 IP 伪装成为
          本机的 ppp0 那个界面的 IP
      [root@test root]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
      > -o ppp0 -j MASQUERADE
       

      纪录与回复防火墙规则
       
      刚刚上面我们谈了很多的设定了,那么我该如何观察目前主机上面的防火墙规则呢?我们可以使用『iptables -L -n 』来观察,不过,该指令所显示的信息其实还是不太足够的!这个时候,我们其实可以使用底下的两个指令来将目前主机上面的防火墙机制『储存』下来,在下次想要将这个规则『回复』的时候,就能够直接利用指令将规则直接回复喔!
       
      [root@test root]# iptables-save > filename
      # 将目前的防火墙机制储存成 filename 那个档案!该档案为 ASCII 格式,
      # 您可以进入查阅一下喔!
      [root@test root]# iptables-restore < filename
      # 将 filename 那个防火墙档案 (注意!并不是 shell scripts 的格式) 的规则
      # 读入目前的 Linux 主机环境中!
       
      利用 iptables-save 与 iptables-restore 也可以很轻松的管理好我们的防火墙系统吶!

大标题的图示一个简单的防火墙设定:
    要实际设定防火墙之前,最好『先用笔将您所需要的规则与开放的服务设计一下』然后再来设计!而比较严密的防火墙规划特点就是:
     
      拒绝所有,开放特定的设定方法较佳!
      
    也就是将 Policy 设定为 DROP 而将其他的服务一个一个的启动,这样会比较好的啦! ^_^!
     

    我的防火墙规则的草拟
     
    我这里提一个蛮简单的防火墙规划,我的硬件联机如上面的 图二 所示的那样,亦即只有一部 Linux 主机,而我的网络设定为:
     
    • 外部网络使用 ppp0:由于是拨接的,所以实际对外是 ppp0 这一个界面;
    • 内部网络使用 eth0 :这个 eth0 使用在内部网络的连接上面,而且网域为 192.168.1.0/24 这个 C Class;
    • 主机开放的服务:目前我的主机虽然只有开放 NAT ,但是未来还会增加一些服务,目前我假设我的主机预计会有的对 Internet 上面启用的服务有:
      • NAT
      • WWW
      • SSH
      • SMTP
      • POP3
      • IMAP
      • DNS
      • FTP, Telnet, DHCP, NFS 都只对内部网域开放!
     
    我们草拟的规则为:『关闭所有的,开放特定的』的模式,所以在政策上面( Policy )则选择 DROP !而您也晓得, iptables 所订定的规则为一条一条分析比对下去的,所以我们在 安排防火墙的规则 上面就显得特别的重要了!为了预防某些动作被搞混乱了,加上未来我们要以这个简易的防火墙进行更进一步的设定规划,所以这里我们需要用一个简单的流程图来示意!特别留意:这里我们总共用了三个档案,我放置的目录在我 Linux 系统底下的 /usr/local/virus/iptables 里面,档名分别为:
     
    • iptables.rule :设定规则的档案,包括清除防火墙规则、加载模块、设定一些服务的登入与否等等!
    • iptables.deny :设定恶意 IP 或网段的档案,里面完全都是抵挡的 IP 段落语法!
    • iptables.allow:可以想成是一些自己设定的后门啦!因为我们不知道哪一天会出到外头去!这个时候,一个严格的防火墙说不定会挡死自己,所以需要加上一些 IP 的开放啰!
     
    注意:每次修改完了任何一个档案,要立刻生效的话,请执行 iptables.rule 即可!而整个的流程有点像底下这样:
     

    图十一、简单的防火墙规划流程
     
    上面是我个人建议的小小流程,原则上,内部与主机的开放度很高,因为 Output 与 Forward 是完全开放不理的!对于小家庭的主机是可以接受的,因为我们内部的计算机数量不多,而且人员都是熟悉的,所以不需要特别加以控管!但是:『在大企业的内部,这样的规划是很不合格的,因为您不能保证内部所有的人都可以按照您的规定来使用 Network !』也就是说『家贼难防』呀!因此,连 Output 与 Forward 都需要特别加以管理才行!
     

    规则设定
     
    事实上,我们在设定防火墙的时候,不太可能会一个一个指令的输入,通常是利用 shell scripts 来帮我们达成这样的功能吶!底下是利用上面的流程图所规划出来的防火墙 scripts ,您可以参考看看,但是您需要将环境修改成适合您自己的环境才行喔!
     
    [root@test root]# mkdir -p /usr/local/virus/iptables
    [root@test root]# cd /usr/local/virus/iptables
    [root@test iptables]# vi iptables.rule
    #!/bin/bash
    #
    # ========================================================
    # 程序说明:
    # 欢迎使用 iptables.rule 这个 script 来建立您的防火墙!
    # 这支 script 还需要您的额外设定方可适合您的主机环境!
    # 基本规则定义为『拒绝所有,开放特定』的模式!
    #
    # 使用说明:
    # 请先将这个 scripts 的权限更改为可执行:
    #       chmod 755 iptables.rule
    # 在将这个程序放置在 /usr/local/virus/iptables 目录下:
    #       mkdir -p /usr/local/virus/iptables
    #       mv /完整的路径/iptables.rule /usr/local/virus/iptables
    # 执行测试:
    #       /usr/local/virus/iptables/iptables.rule
    #       iptables -L -n   (这个动作在检查防火墙规则)
    # 将底下这一行加入 /etc/rc.d/rc.local 当中
    #       /usr/local/virus/iptables/iptables.rule
    # 取消防火墙:
    #       iptables -F
    #       iptables -X
    #       iptables -t nat -F
    #       iptables -t nat -X
    #
    # ========================================================
    # 版权宣告:
    # 这支程序为 GPL 授权,任何人皆可使用,
    # 然,若使用本 scripts 发生问题时,
    # 本人不负任何责任
    # VBird <vbird@tsai.adsldns.org>
    # ========================================================
    # 历史纪录:
    # 2002/08/20    VBird   首次释出
    # 2003/04/26    VBird   加入砍站软件的相关执行档案!
    # 2003/08/25    VBird   修改 INPUT 的 Policy 成为 DROP
    # ========================================================

    # 0.0 Please key in your parameters
    # 这个 EXTIF 后面接的为『对外可连上 Internet 的网络接口』,
    # 一般来说,如果是拨接的 ADSL ,那么底下就是 ppp0 ,
    # 如果是固定制的 IP ,那么应该就是 eth0 啰!
    # The interface that connect Internet
      EXTIF="ppp0"

    # 底下这个 INIF 为对内的网络卡接口,
    # 如果您的 Linux 并没有对内连接的网络卡,那么底下请改成
    # INIF=""
    # 另外,如果INIF 不是 "" 的时候,请务必将您的内部网域
    # 填入 INNET 中!因为 INNET 为内部网域的设定值!
    # the inside interface. if you don't have this one
    # and you must let this be black ex> INIF=""
      INIF="eth0"
      INNET="192.168.1.0/24"        # This is for NAT's network

    # 1.0 测试您的核心版本与防火墙模块
      kver=`uname -r | cut -c 1-3`
      if [ "$kver" != "2.4" ] && [ "$kver" != "2.5" ]; then
            echo "Your Linux Kernel Version may not be suported by this script!"
            echo "This scripts will not be runing"
            exit
      fi
      ipchains=`lsmod | grep ipchains`
      if [ "$ipchains" != "" ]; then
            echo "unload ipchains in your system"
            rmmod ipchains 2> /dev/null
      fi

    # 2.0 加载适当的模块
      PATH=/sbin:/bin:/usr/sbin:/usr/bin
      export PATH EXTIF INIF INNET
      modprobe ip_tables            > /dev/null 2>&1
      modprobe iptable_nat          > /dev/null 2>&1
      modprobe ip_nat_ftp           > /dev/null 2>&1
      modprobe ip_nat_irc           > /dev/null 2>&1
      modprobe ip_conntrack         > /dev/null 2>&1
      modprobe ip_conntrack_ftp     > /dev/null 2>&1
      modprobe ip_conntrack_irc     > /dev/null 2>&1

    # 3.0 先清除所有的防火墙规则
      /sbin/iptables -F
      /sbin/iptables -X
      /sbin/iptables -Z
      /sbin/iptables -F -t nat
      /sbin/iptables -X -t nat
      /sbin/iptables -Z -t nat
      /sbin/iptables -P INPUT   DROP
      /sbin/iptables -P OUTPUT  ACCEPT
      /sbin/iptables -P FORWARD ACCEPT
      /sbin/iptables -t nat -P PREROUTING  ACCEPT
      /sbin/iptables -t nat -P POSTROUTING ACCEPT
      /sbin/iptables -t nat -P OUTPUT      ACCEPT

    # 4.0 先允许信任网域,这包含 lo 这个内部循环接口,
    #     以及刚刚指定的内部接口网域!
    #     当然,重点是可以启动您的 Linux 成为 NAT 主机的啦!
      /sbin/iptables -A INPUT -i lo   -j ACCEPT
      if [ "$INIF" != "" ]; then
            /sbin/iptables -A INPUT -i $INIF -j ACCEPT
            echo "1" > /proc/sys/net/ipv4/ip_forward
            /sbin/iptables -t nat -A POSTROUTING -s $INNET -o $EXTIF -j MASQUERADE
      fi

    # 5.0 开始加载信任与拒绝的网域设定的档案,
    #     底下两个档案可以自行建立喔!
      if [ -f /usr/local/virus/iptables/iptables.deny ]; then
            sh /usr/local/virus/iptables/iptables.deny
      fi
      if [ -f /usr/local/virus/iptables/iptables.allow ]; then
            sh /usr/local/virus/iptables/iptables.allow
      fi

    # 6.0 底下这个档案若存在,则执行!请注意,
    #     这个档案与杜绝砍站的软件有关喔!
      if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
            sh /usr/local/virus/httpd-err/iptables.http
      fi

    # 7.0 允许 ICMP 封包与允许已建立的联机通过!
      /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      AICMP="0 3 3/4 4 11 12 14 16 18"
      for tyicmp in $AICMP
      do
            /sbin/iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
      done

    # 8.0 Allow services特别留意底下的服务,将您主机没有开放的服务关闭吧!
      /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport  22 -j ACCEPT        # SSH
      /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport  25 -j ACCEPT        # SMTP
      /sbin/iptables -A INPUT -p UDP -i $EXTIF --dport  53 -j ACCEPT        # DNS
      /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport  53 -j ACCEPT        # DNS
      /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport  80 -j ACCEPT        # WWW
      /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport 110 -j ACCEPT        # POP3
      /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport 113 -j ACCEPT        # auth

     
    特别留意我上面的标注的粗体字部分,因为每个人的环境都不相同,因此您必须要设定属于您自己的环境参数才行!不然,出了问题不要怪我啊!....再来看一下关于 iptables.allow 的内容是如何?假如我要让一个 140.116.44.0/24 这个网域进入我的主机的话,那么这个档案的内容可以写成这样:
     
    [root@test iptables]# vi iptables.allow
    #!/bin/bash
    #
    # This program is used to allow some IP or hosts to access your Server
    #
    # HISTORY
    # 2002/08/20 first release by VBird

    /sbin/iptables -A INPUT  -i $EXTIF -s 140.116.44.0/24 -j ACCEPT

    [root@test iptables]# vi iptables.deny
    #!/bin/bash
    #
    # This script will deny some IPs that I don't want it IN
    #
    # HISTORY
    # 2002/08/20    revise        by VBird

    /sbin/iptables -A INPUT   -i $EXTIF -s 140.115.236.8   -j DROP
    /sbin/iptables -A INPUT   -i $EXTIF -s 140.120.13.237  -j DROP

     
    请特别注意,若您有新的 port 或者是没有开启某些 port 的时候,请在您的 iptables.rule 里面的第 8 步骤,新增加其他的 port 的服务,这样就可以啦!不过,还是如同前面我们所说的,这个 firewall 仅能提供基本的安全防护,其他的相关问题,还需要再测试测试呢!此外,如果您希望一开机就自动执行这个 script 的话,请将这个档案的完整档名写入 /etc/rc.d/rc.local 当中,有点像底下这样:
     
    [root@test /root]# vi /etc/rc.d/rc.local
    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.

    touch /var/lock/subsys/local

    #1. adsl connectting.           2002/04/06      VBird
            /usr/sbin/adsl-start
    #2. Starting the NAT Server     2002/04/06      VBird
            /usr/local/nat/nat.sh
    #3. Starting firewall settings  2002/08/20      VBird
            /usr/local/virus/iptables/iptables.rule

    上面的三个档案可以在底下的网站上取得下载:
    http://linux.vbird.org/download/index.php#firewall_iptables


大标题的图示TCP_Wrappers:
    在前一章认识网络安全当中,我们谈到数据封包进入主机之前会通过的程序,第一道就是刚刚我们上面提到的 iptables ,那第二道大概就是 TCP Wrappers 啰!TCP Wrappers 有点类似 TCP 包裹的检验程序,其实这个 TCP Wrappers 也可以将他想成是另外一个防火墙就是了!事实上,这个 TCP Wrappers 其实是由 tcpd 这支程序所控制的,他可以协助主机来分析『某个服务的封包』呢!此外,目前的 xinetd 也含有类似的功能,所以虽然 xinetd 没有使用 tcpd 这支程序,但是仍然可以具有相同的分析功能
     

    什么是 TCP Wrappers 与他的抵挡机制
     
    刚刚说到,TCP Wrappers 的抵挡机制其实是以 tcpd 这支程序为主,而这支程序的主要参数文件在 /etc/hosts.allow 以及 /etc/hosts.deny 两个档案当中,『当某个软件支持 tcpd (TCP Wrappers) 的功能,则当网络封包尝试向该服务要求数据时,该网络封包将接受 TCP Wrappers 的检验,而检验的参数设定则是取自 /etc/hosts.allow 以及 /etc/hosts.deny两个档案』。所以啰,如果您要使用 TCP Wrappers 来管理某个程序时,需要特别留意该程序是否有支持 TCP Wrappers 喔!好了,那么这里有两个档案需要来设定,那么那个档案先被使用呢?
     
    • 在预设的状态下,/etc/hosts.allow 这个档案的设定内容会先被读取;
    • 然后才会读取 /etc/hosts.deny 的内容。
     
    那么这两个档案如何设定呢?简单的语法如下
     
    旧版的使用 tcpd 程序的语法
    <服务名称> :  <IP/network> : <action>
    # 特别注意, network 可以使用 192.168.0.0/255.255.255.0 ,
    # 但不可使用 192.168.0.0/24 !
     
    范例一:
    [root@test root]# vi /etc/hosts.allow
    in.telnetd: 127.0.0.1 : allow
    in.telnetd: 192.168.1.0/255.255.255.0 : allow
    in.telnetd: .ncku.edu.tw : allow
    in.ftpd:    127.0.0.1 : allow
    # 允许的 127.0.0.1 这个 IP 使用本机的 telnet 及 ftp 这两个服务!
    # 请特别注意,那个『服务名称』其实就是『程序文件名』喔!
     
    [root@test root]# vi /etc/hosts.deny
    in.telnetd: 192.168.2.3 : deny
    # 将来自 192.168.2.3 对于使用本机 telnet 的权限关掉!
     
    # 特别注意,这个语法在 xinetd 里面时,<action> 已经被拿掉了!
    # 所以,目前您可以使用这样的格式:
    [root@test root]# vi /etc/hosts.allow
    in.telnetd: 127.0.0.1 
    in.telnetd: 192.168.1.0/255.255.255.0 
    in.telnetd: .ncku.edu.tw 
    # 事实上,这也是 TCP Wrappers 支持的格式,所以建议您直接使用此格式即可,
    # 亦即不需要加上 allow 或者是 deny 的动作,因为在 hosts.allow 里面的
    # 规则就是 allow 而在 hosts.deny 里面的规则就是 deny 的意思!
     
    在上面的语法当中,最重要的莫过于找出『服务名称』!举个例子来说,未来我们会介绍 ssh 这个远程联机服务器,而这个服务器的启动的 binary 可执行文件为 sshd 这个文件名的程序,所以您要让某些来源的 IP 或主机名通过 TCP Wrappers 的检验时,就必须要:
     
      sshd: 192.168.0.100
     
    并且同时需要注意 SSH 是否有支持 TCP Wrappers 喔!重要重要!此外,您也可以使用 ALL 来代表『所有的服务』或者是『所有的来源』,例如在 /etc/hosts.deny 里面加入:
     
      ALL: ALL
     
    代表『不论何种服务、不论来自哪里的封包,全部都给他挡掉!』。
     

    TCP Wrapperes 的规则说明
     
    上面稍微提了一下 TCP Wrappers 的使用方法,其中最需要注意的是:封包的检验是先以 /etc/hosts.allow 为主,然后再以 /etc/hosts.deny 来管理!所以通常我们设定的方法就是:
     
    • 在 /etc/hosts.allow 里面针对某些服务与封包来源开启他们使用的权限;
    • 在 /etc/hosts.deny 里面将该服务的其他来源都挡掉!
     
    注意喔!如果您在 /etc/hosts.deny 里面没有设定抵挡的话,那么 TCP Wrappers 预设的动作是『可以通过检验,并进入主机』喔!举例来说,同样的以 SSH, Telnet 与 FTP 为例,如果您只想要让『信任的主机』登入的话,那么也可以在里头进行规划!好了!这里我们以私有网段 192.168.1.0/24 可以取用 Telnet 及 FTP 的 hosts 有 192.168.1.2, 192.168.1.10, 192.168.1.20 这三部计算机,及来自 Internet 上面可以取用 SSH 的主机为 xxx.yyy.zzz.qqq 这个主机,及 192.168.1.0/24 全部的计算机!则您的两个档案可以写成这样:
     
    [root@test root]# vi /etc/hosts.allow
    # 先写关于 telnet, ftp 及 sshd 开放的资料
    in.telnetd: 192.168.1.2, 192.168.1.10, 192.168.1.20 
    in.ftpd:    192.168.1.2, 192.168.1.10, 102.168.1.20
    sshd:       192.168.1.0/255.255.255.0, xxx.yyy.zzz.qqq 
    # 每个 IP 或者主机之间,可以利用逗号或空格来隔开!
     
    [root@test root]# vi /etc/hosts.deny
    # 将上面的三个服务都关掉啦!
    in.telnetd: ALL 
    in.ftpd:    ALL 
    sshd:       ALL
     
    # 特别注意,很多朋友喜欢在 /etc/hosts.deny 里面加入这一行:
    ALL: ALL
    # 来抵挡所有的服务与所有的来源!不过,我个人是不太建议这样做的!
    # 因为很多时候,当您架设好网站之后,却发现老是无法让 Client 联机成功,
    # 很多经验告诉我们,最大的问题就是出现在 ALL : ALL 这一行!
     
    其中,还有更高竿的 /etc/hosts.deny 的写法,这是关于当有来自不明人士使用类似 nmap 扫 port 软件来扫瞄您的主机时,他的 IP 会被记录下喔!(注意,底下的写法就需要有 TCP Wrappers 的辅助了!这包括了 safe_finger 这个指令!单纯的使用 xinetd 是无法达到底下的功能的!所以,请安装 tcp_wrappers 这个套件)
     
    [root@test root]# vi /etc/hosts.deny
    in.telnetd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
    /bin/echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d -%h security" root@localhost & \
    : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登入,您的联机将会被纪录,并且作为以后的参考\n\n ". )

    in.ftpd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
    /bin/echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d -%h security" root@localhost & \
    : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登入,您的联机将会被纪录,并且作为以后的参考\n\n ". )

    sshd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
    /bin/echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d -%h security" root@localhost & \
    : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登入,您的联机将会被纪录,并且作为以后的参考\n\n ". )

     
    如此一来,当有来自非您所规定的合法 IP 试图以 telnet, ftp 及 ssh 联机您的主机时,系统就会将该 IP 寄一份资料给 root 来留文件!不过,这有个伤脑筋的地方,万一该 IP 最后成功的登入您的主机之后,可能会将 root 的信箱砍掉,导致这个作用就没有效果了!所以,这个时候,请您将上面 root@localhost 改成另一个非主机的信箱来收信!这样会比较有安全上的保障啦! ^_^这个咚咚一设定完毕立刻就生效了!所以不用去理他也没关系!但是要随时注意一下您的设定是否正确呦!上面的语法只要您修改『服务名称』应该就能够适用于其他的服务吧!但是,请注意喔!对 Internet 开放的服务不要设定这个样子啊!不然人家可是无法联机进来的!上面的设定方法,大多是适用在『某些仅针对内部开放的服务』!
     
    上面的的 hosts.deny 范例您可以在底下的网页下载:
    http://linux.vbird.org/download/index.php#firewall_iptables

大标题的图示其他相关测试:
虽然这样一来就稍微建置好了您的防火墙了!但是谁都不知道到底这样的防火墙效果如何?所以,您需要花费更多的时间来进行测试呢!测试的步骤可以是:
  1. 先由主机向外面主动联机试看看;
  2. 再由私有网域内的 PC 向外面主动联机试看看;
  3. 最后,由 Internet 上面的主机,主动联机到您的 Linux 主机试看看;
一步一步作下来,看看问题出在哪里,然后多多的去改进、改良!!基本上,网络上目前很多的资料可以提供您不错的参考了!这一篇的设定写的是很简单,大部分 都还在介绍阶段而已!希望对大家有帮助!我在参考资料当中列出几个有用的防火墙网页,希望大家有空真的要多多的去看看!会很有帮助的!

大标题的图示进阶:防火墙后端服务器的架设
我们来考虑一个比较有趣的问题,那就是如同图四的情况,事实上,主机是架设在防火墙后端的!在这样的情况下,我们要怎么将来自 Internet 的封包,经由 firewall 转递到后端的主机上面呢?!我们可以参考一下封包的流程,如同上面图九的说明,因为来自 Internet 的封包要丢给防火墙后端的主机,所以在『路由之前就需要先设定好转换路由』的状态了!因此在 nat table 的 PREROUTING 的链上面来进行所谓的『 Destination NAT, DNAT 』的动作才行啦!您需要在防火墙的 iptables 机制上面,在 nat table 上面新增一条规则才行!语法如下:
 
iptables 的其他相关参数说明:
 
-j <动作>:除了比较常见的 ACCEPT 与 DROP 之外,还有哪些动作?
 DNAT --to IP[:port]
   常用在防火墙后端的主机之封包转递上面!
 
范例:将来自 Internet 的 port 80 联机的封包转递到 192.168.10.10 这个主机上
[root@test root]# iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 \
> -j DNAT --to 192.168.10.10:80
 
上面的范例是很简单的一个例子,在比较简易的环境下是可以成功的帮您进行 WWW 或者是 Mail 的服务的!不过,如果用在 FTP 上面可就很麻烦了~因为 FTP 除了正规的 21 这个命令通道端口口外,还有数据传送的主动性与被动性!设定上很是困扰~有兴趣的话,可以参考底下列出的几个 iptables 的网站喔!这里不再说明了!

大标题的图示重点回顾
  • 防火墙对于病毒的抵挡并不敏感;
  • 防火墙对于来自内部的网络误用或滥用的抵挡性可能较不足;
  • 并不是架设防火墙之后,系统就一定很安全!还是需要更新套件漏洞的!
  • 防火墙依据封包抵挡的阶层,可以分为 Proxy 以及 IP Filter 两种类型;
  • 核心为 2.4 版的 Linux 使用的防火墙机制为 iptables ;
  • 防火墙的订定与『规则顺序』有很大的关系;
  • iptables 的 table 当中,至少就有 filter 与 nat 两者,这两者又各有三条链;
  • iptables 的指令列当中,可以下达的参数相当的多,当下达 -j LOG 的参数时,则该封包的流程会被纪录到 /var/log/messages 当中;
  • 防火墙可以多重设定,例如虽然已经设定了 iptables ,但是仍然可以持续设定 TCP Wrappers ,因为谁也不晓得什么时候 iptables 会有漏洞~或者是规则规划不良!

大标题的图示参考数据

大标题的图示课后练习
  • 为什么我架设了防火墙,我的主机还是可能中毒?
  • 请说明为何架设了防火墙,我的主机还是可能被入侵?入侵的依据可能是什么方法?
  • 我们知道核心为 2.4 的 Linux 使用的防火墙机制为 iptables ,请问,如何知道我的 Linux 核心版本?
  • 请列出 iptables 预设的两个 table ,以及各个 table 里面的 chains 与各个 chains 所代表的意义;
  • 什么是 iptables 的预设政策 (Policy)?
  • 假设今天我的 Linux 仅是作为 Client 之用,并没有对 Internet 进行任何服务,那么您的防火墙规划应该如何设定比较好?!
  • 我要将来自 192.168.1.50 这个 IP 来源的封包,只要是向我的 21~23 埠口要求的封包,就将他抵挡,应该如何下达 iptables 指令?
  • 我要将我自己主机 ping 的响应功能取消,应该如何下达 iptables 的指令?
  • 请说明为何这个指令是错误的?『iptables -A INPUT -p udp --syn -s 192.168.0.20 -j DROP』?
  • DNS 的要求是必须的,那么我该如何设定我的主机可以接受要求 DNS 的响应呢?
  • 如何取消 iptables 在我的系统上面?
  • 如何储存目前的防火墙机制,以及如何将上次储存下来的机制回复到目前的系统中?

  • 前往参考用解答

2002/08/20:第一次完成日期!
2003/08/25:重新设计内容,改写一些指令介绍,与前一篇『认识网络安全』分的比较完整一点!
 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室