最近更新日期:2011/07/22
9.1 认识防火墙
9.1.1 开始之前来个提醒事项 9.1.2 为何需要防火墙 9.1.3 Linux 系统上防火墙的主要类别 9.1.4 防火墙的一般网络布线示意 9.1.5 防火墙的使用限制 9.2 TCP Wrappers 9.2.1 哪些服务有支持: ldd 9.2.2 /etc/hosts.{allow|deny} 的设定方式 9.3 Linux 的封包过滤软件: iptables 9.3.1 不同 Linux 核心版本的防火墙软件 9.3.2 封包进入流程:规则顺序的重要性! 9.3.3 iptables 的表格 (table) 与链 (chain) 9.3.4 本机的 iptables 语法 9.3.4-1 规则的观察与清除 9.3.4-2 定义预设政策 (policy) 9.3.4-3 封包的基础比对:IP, 网域及接口装置: 信任装置, 信任网域 9.3.4-4 TCP, UDP 的规则比对:针对埠口设定 9.3.4-5 iptables 外挂模块:mac 与 state 9.3.4-6 ICMP 封包规则的比对:针对是否响应 ping 来设计 9.3.4-7 超阳春客户端防火墙设计与防火墙规则储存 9.3.5 IPv4 的核心管理功能:/proc/sys/net/ipv4/* 9.4 单机防火墙的一个实例 9.4.1 规则草拟 9.4.2 实际设定 9.5 NAT 服务器的设定 9.5.1 什么是 NAT? SNAT? DNAT? 9.5.2 最阳春 NAT 服务器: IP 分享功能 9.5.3 iptables 的额外核心模块功能 9.5.4 在防火墙后端之网络服务器 DNAT 设定 9.6 重点回顾 9.7 本章习题 9.8 参考数据与延伸阅读 9.9 针对本文的建议:http://phorum.vbird.org/viewtopic.php?p=114475 9.1 认识防火墙 网络安全除了随时注意相关软件的漏洞以及网络上的安全通报之外,你最好能够依据自己的环境来订定防火墙机制! 这样对于你的网络环境,会比较有保障一点喔!那么什么是防火墙呢?其实防火墙就是透过订定一些有顺序的规则,并管制进入到我们网域内的主机 (或者可以说是网域) 数据封包的一种机制!更广义的来说,只要能够分析与过滤进出我们管理之网域的封包数据, 就可以称为防火墙。 防火墙又可以分为硬件防火墙与本机的软件防火墙。硬件防火墙是由厂商设计好的主机硬件, 这部硬件防火墙内的操作系统主要以提供封包数据的过滤机制为主,并将其他不必要的功能拿掉。因为单纯作为防火墙功能而已, 因此封包过滤的效率较佳。至于软件防火墙呢?那就是我们这个章节要来谈论的啊! 软件防火墙本身就是在保护系统网络安全的一套软件(或称为机制),例如 Netfilter 与 TCP Wrappers 都可以称为软件防火墙。 无论怎么分,反正防火墙就是用来保护我们网络安全的咚咚就对啦!我们这个章节主要在介绍 Linux 系统本身提供的软件防火墙的功能,那就是 Netfilter 。至于 TCP Wrappers 虽然在基础篇的第十八章认识系统服务里面谈过了,我们这里还会稍微简单的介绍啦! 9.1.1 开始之前来个提醒事项 由于本章主要的目的在介绍 Netfilter 这种封包过滤式的防火墙机制,因此网络基础里面的许多封包与讯框的概念要非常清楚, 包括网域的概念, IP 网域的撰写方式等,均需有一定的基础才行。请到第二章加强一下 MAC, IP, ICMP, TCP, UDP 等封包表头数据的认识,以及 Network/Netmask 的整体网域 (CIDR) 写法等。 另外,虽然 Netfilter 机制可以透过 iptables 指令的方式来进行规则的排序与修改,不过鸟哥建议你利用 shell script 来撰写属于你自己的防火墙机制比较好,因为对于规则的排序与汇整有比较好的观察性, 可以让你的防火墙规则比较清晰一点。所以在你开始了解底下的资料之前,希望你可以先阅读过相关的数据了:
9.1.2 为何需要防火墙 仔细分析第七章的图 7.1-1 可以发现, 封包进入本机时,会通过防火墙、服务器软件程序、SELinux与文件系统等。所以基本上,如果你的系统 (1)已经关闭不需要而且危险的服务; (2)已经将整个系统的所有软件都保持在最新的状态; (3)权限设定妥当且定时进行备份工作; (4)已经教育用户具有良好的网络、系统操作习惯。 那么你的系统实际上已经颇为安全了!要不要架设防火墙?那就见仁见智啰! 不过,毕竟网络世界是很复杂的,而 Linux 主机也不是一个简单的东西,说不定哪一天你在进行某个软件的测试时, 主机突然间就启动了一个网络服务,如果你没有管制该服务的使用范围,那么该服务就等于对所有 Internet 开放, 那就麻烦了!因为该服务可能可以允许任何人登入你的系统,那不是挺危险? 所以啰,防火墙能作什么呢?防火墙最大的功能就是帮助你『限制某些服务的存取来源』! 举例来说: (1)你可以限制文件传输服务 (FTP) 只在子域内的主机才能够使用,而不对整个 Internet 开放; (2)你可以限制整部 Linux 主机仅可以接受客户端的 WWW 要求,其他的服务都关闭; (3)你还可以限制整部主机仅能主动对外联机。反过来说,若有客户端对我们主机发送主动联机的封包状态 (TCP 封包的 SYN flag) 就予以抵挡等等。这些就是最主要的防火墙功能了! 所以鸟哥认为,防火墙最重要的任务就是在规划出:
当然啦,咱们 Linux 的 iptables 防火墙软件还可以进行更细部深入的 NAT (Network Address Translation) 的设定,并进行更弹性的 IP 封包伪装功能,不过,对于单一主机的防火墙来说, 最简单的任务还是上面那三项就是了!所以,你需不需要防火墙呢?理论上,当然需要! 而且你必须要知道『你的系统哪些数据与服务需要保护』,针对需要受保护的服务来设定防火墙的规则吧! 底下我们先来谈一谈,那在 Linux 上头常见的防火墙类型有哪些? 9.1.3 Linux 系统上防火墙的主要类别 基本上,依据防火墙管理的范围,我们可以将防火墙区分为网域型与单一主机型的控管。在单一主机型的控管方面,
主要的防火墙有封包过滤型的 Netfilter 与依据服务软件程序作为分析的 TCP Wrappers 两种。若以区域型的防火墙而言,
由于此类防火墙都是当作路由器角色,因此防火墙类型主要则有封包过滤的 Netfilter 与利用代理服务器 (proxy server)
进行存取代理的方式了。
9.1.4 防火墙的一般网络布线示意 由前面的说明当中,你应该可以了解到一件事,那就是防火墙除了可以『保护防火墙机制本身所在的那部主机』之外,还可以『保护防火墙后面的主机』。也就是说,防火墙除了可以防备本机被入侵之外, 他还可以架设在路由器上面藉以控管进出本地端网域的网络封包。 这种规划对于内部私有网域的安全也有一定程度的保护作用呢!底下我们稍微谈一谈目前常见的防火墙与网络布线的配置吧:
9.1.5 防火墙的使用限制 从前面的分析中,我们已经知道过封包滤式防火墙主要在分析 OSI 七层协议当中的 2, 3, 4 层,既然如此的话, Linux 的 Netfilter 机制到底可以做些什么事情呢?其实可以进行的分析工作主要有:
虽然 Netfilter 防火墙已经可以做到这么多的事情,不过,还是有很多事情没有办法透过 Netfilter 来完成喔! 什么?设定防火墙之后还不安全啊!那当然啦!谁说设定了防火墙之后你的系统就一定安全? 防火墙虽然可以防止不受欢迎的封包进入我们的网络当中,不过,某些情况下,他并不能保证我们的网络一定就很安全。 举几个例子来谈一谈:
所以啦,还是回到第七章的图 7.1-1 的说明去看看,分析一下该图示,你就会知道,在你的 Linux 主机实地上网之前,还是得先:
其他相关的讯息还是请到第七章认识网络安全里面去看一看怎么增加自身的安全吧! 9.2 TCP Wrappers 在进入主题之前,我们先来玩一个简单的防火墙机制,那就是 TCP Wrappers 这玩意儿。如同前面说的, TCP wrappers 是透过客户端想要链接的程序文件名,然后分析客户端的 IP ,看看是否需要放行。那么哪些程序支持 TCP wrappers 的功能?这个 TCP wrappers 又该如何设定?我们这里先简单的谈谈吧!(这个小节仅是简单的介绍过 TCP wrappers ,更多相关功能请参考基础学习篇的第十八章内容喔!) 9.2.1 哪些服务有支持 说穿了, TCP wrappers 就是透过 /etc/hosts.allow, /etc/hosts.deny 这两个宝贝蛋来管理的一个类似防火墙的机制, 但并非所有的软件都可以透过这两个档案来控管,只有底下的软件才能够透过这两个档案来管理防火墙规则,分别是:
经由 xinetd 管理的服务还好理解,就是配置文件在 /etc/xinetd.d/ 里面的服务就是 xinetd 所管理的啊! 那么什么是有支持 libwrap.so 模块呢?就让我们来进行底下的例题,你就比较容易明白啰:
9.2.2 /etc/hosts.{allow|deny} 的设定方式 那如何透过这两个档案来抵挡有问题的 IP 来源呢?这两个档案的语法都一样,很简单的:
我们知道防火墙的规则都是有顺序的,那这两个档案与规则的顺序优先是怎样呢?基本上是这样的:
我们拿 rsync 这个 xinetd 管理的服务来进行说明好了,请参考底下的例题吧:
上面的例题有几个重点,首先, tcp wrappers 理论上不支持 192.168.1.0/24 这种透过 bit 数值来定义的网域, 只支持 netmask 的地址显示方式。另外,如果有多个网域或者是单一来源,可以透过空格来累加。 如果想要写成多行呢?也可以啊!多写几行『 kshd: IP 』的方式也可以,不必要将所有数据集中在一行啦!因为 tcp wrappers 也是一条一条规则比对嘛! 基本上,你只要理解这些数据即可!因为绝大部分的时刻,我们都会建议使用底下介绍的 Netfilter 的机制来抵挡封包。 那让我们准备开始来玩玩 iptables 封包过滤防火墙吧! 9.3 Linux 的封包过滤软件:iptables 上面谈了这么多,主要还是希望你能了解到防火墙是什么这个议题!而且也希望你知道防火墙并非万能的。 好了,那么底下我们终于可以来瞧一瞧,那目前我们的 2.6 版这个 Linux 核心到底使用什么核心功能来进行防火墙设定? 9.3.1 不同 Linux 核心版本的防火墙软件 Linux 的防火墙为什么功能这么好?这是因为他本身就是由 Linux 核心所提供,由于直接经过核心来处理,因此效能非常好! 不过,不同核心版本所使用的防火墙软件是不一样的!因为核心支持的防火墙是逐渐演进而来的嘛!
因为不同的核心使用的防火墙机制不同,且支持的软件指令与语法也不相同,所以在 Linux 上头设定属于你自己的防火墙规则时,要注意啊,先用 uname -r 追踪一下你的核心版本再说!如果你是安装 2004 年以后推出的 distributions ,那就不需要担心了,因为这些 distributions 几乎都使用 kernel 2.6 版的核心啊! ^_^ 9.3.2 封包进入流程:规则顺序的重要性! 前面的几个小节里面我们一直谈到:『防火墙规则』,咦!啥是规则啊?因为 iptables 是利用封包过滤的机制, 所以他会分析封包的表头数据。根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃。 意思就是说:『根据封包的分析资料 "比对" 你预先定义的规则内容, 若封包数据与规则内容相同则进行动作,否则就继续下一条规则的比对!』 重点在那个『比对与分析顺序』上。 举个简单的例子,假设我预先定义 10 条防火墙规则好了,那么当 Internet 来了一个封包想要进入我的主机, 那么防火墙是如何分析这个封包的呢?我们以底下的图示来说明好了: 图 9.3-1、封包过滤的规则动作及分析流程 当一个网络封包要进入到主机之前,会先经由 NetFilter 进行检查,那就是 iptables 的规则了。 检查通过则接受 (ACCEPT) 进入本机取得资源,如果检查不通过,则可能予以丢弃 (DROP) ! 上图中主要的目的在告知你:『规则是有顺序的』!例如当网络封包进入 Rule 1 的比对时, 如果比对结果符合 Rule 1 ,此时这个网络封包就会进行 Action 1 的动作,而不会理会后续的 Rule 2, Rule 3.... 等规则的分析了。 而如果这个封包并不符合 Rule 1 的比对,那就会进入 Rule 2 的比对了!如此一个一个规则去进行比对就是了。 那如果所有的规则都不符合怎办?此时就会透过预设动作 (封包政策, Policy) 来决定这个封包的去向。 所以啦,当你的规则顺序排列错误时,就会产生很严重的错误了。 怎么说呢?让我们看看底下这个例子: 假设你的 Linux 主机提供了 WWW 的服务,那么自然就要针对 port 80 来启用通过的封包规则,但是你发现 IP 来源为 192.168.100.100 老是恶意的尝试入侵你的系统,所以你想要将该 IP 拒绝往来,最后,所有的非 WWW 的封包都给他丢弃,就这三个规则来说,你要如何设定防火墙检验顺序呢?
这样的排列顺序就能符合你的需求,不过,万一你的顺序排错了,变成:
此时,那个 192.168.100.100 『可以使用你的 WWW 服务』喔!只要他对你的主机送出 WWW 要求封包,就可以使用你的 WWW 功能了,因为你的规则顺序定义第一条就会让他通过,而不去考虑第二条规则!这样可以理解规则顺序的意义了吗! 现在再来想一想,如果 Rule 1 变成了『将所有的封包丢弃』,Rule 2 才设定『WWW 服务封包通过』,请问,我的 client 可以使用我的 WWW 服务吗?呵呵!答案是『否~』想通了吗? ^_^ 9.3.3 iptables 的表格 (table) 与链 (chain) 事实上,那个图 9.3-1 所列出的规则仅是 iptables 众多表格当中的一个链 (chain) 而已。 什么是链呢?这得由 iptables 的名称说起。为什么称为 ip"tables" 呢? 因为这个防火墙软件里面有多个表格 (table) ,每个表格都定义出自己的默认政策与规则, 且每个表格的用途都不相同。我们可以使用底下这张图来稍微了解一下: 图 9.3-2、iptables 的表格与相关链示意图 刚刚图 9.3-1 的规则内容仅只是图 9.3-2 内的某个 chain 而已! 而预设的情况下,咱们 Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。更有甚者,我们还可以自定义额外的链呢! 真是很神奇吧!每个表格与其中链的用途分别是这样的:
所以说,如果你的 Linux 是作为 www 服务,那么要开放客户端对你的 www 要求有响应,就得要处理 filter 的 INPUT 链; 而如果你的 Linux 是作为局域网络的路由器,那么就得要分析 nat 的各个链以及 filter 的 FORWARD 链才行。也就是说, 其实各个表格的链结之间是有关系的!简单的关系可以由下图这么看: 图 9.3-3、iptables 内建各表格与链的相关性 上面的图示很复杂喔!不过基本上你依旧可以看出来,我们的 iptables 可以控制三种封包的流向:
由于 mangle 这个表格很少被使用,如果将图 9.3-3 的 mangle 拿掉的话,那就容易看的多了: 图 9.3-4、iptables 内建各表格与链的相关性(简图) 透过图 9.3-4 你就可以更轻松的了解到,事实上与本机最有关的其实是 filter 这个表格内的 INPUT 与 OUTPUT 这两条链,如果你的 iptables 只是用来保护 Linux 主机本身的话,那 nat 的规则根本就不需要理他,直接设定为开放即可。 不过,如果你的防火墙事实上是用来管制 LAN 内的其他主机的话,那么你就必须要再针对 filter 的 FORWARD 这条链,还有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 进行额外的规则订定才行。 nat 表格的使用需要很清晰的路由概念才能够设定的好,建议新手先不要碰!最多就是先玩一玩最阳春的 nat 功能『IP 分享器的功能』就好了! ^_^!这部份我们在本章的最后一小节会介绍的啦! 9.3.4 本机的 iptables 语法 理论上,当你安装好 Linux 之后,系统应该会主动的帮你启动一个阳春的防火墙规则才是, 不过这个阳春防火墙可能不是我们想要的模式,因此我们需要额外进行一些修订的行为。不过,在开始进行底下的练习之前, 鸟哥这里有个很重要的事情要告知一下。因为 iptables 的指令会将网络封包进行过滤及抵挡的动作,所以, 请不要在远程主机上进行防火墙的练习,因为你很有可能一不小心将自己关在家门外! 尽量在本机前面登入 tty1-tty6 终端机进行练习,否则常常会发生悲剧啊!鸟哥以前刚刚在玩 iptables 时,就常常因为不小心规则设定错误,导致常常要请远程的朋友帮忙重新启动... 刚刚提到咱们的 iptables 至少有三个预设的 table (filter, nat, mangle),较常用的是本机的 filter 表格, 这也是默认表格啦。另一个则是后端主机的 nat 表格,至于 mangle 较少使用,所以这个章节我们并不会讨论 mangle。 由于不同的 table 他们的链不一样,导致使用的指令语法或多或少都有点差异。 在这个小节当中,我们主要将针对 filter 这个默认表格的三条链来做介绍。底下就来玩一玩吧!
9.3.4-1 规则的观察与清除 如果你在安装的时候选择没有防火墙的话,那么 iptables 在一开始的时候应该是没有规则的,不过, 可能因为你在安装的时候就有选择系统自动帮你建立防火墙机制,那系统就会有默认的防火墙规则了! 无论如何,我们先来看看目前本机的防火墙规则是如何吧!
在上表中,每一个 Chain 就是前面提到的每个链啰~ Chain 那一行里面括号的 policy 就是预设的政策, 那底下的 target, prot 代表什么呢?
在输出结果中,第一个范例因为没有加上 -t 的选项,所以默认就是 filter 这个表格内的 INPUT, OUTPUT, FORWARD 三条链的规则啰。若针对单机来说,INPUT 与 FORWARD 算是比较重要的管制防火墙链, 所以你可以发现最后一条规则的政策是 REJECT (拒绝) 喔!虽然 INPUT 与 FORWARD 的政策是放行 (ACCEPT), 不过在最后一条规则就已经将全部的封包都拒绝了! 不过这个指令的观察只是作个格式化的查阅,要详细解释每个规则会比较不容易解析。举例来说, 我们将 INPUT 的 5 条规则依据输出结果来说明一下,结果会变成:
最有趣的应该是第 3 条规则了,怎么会所有的封包信息都予以接受?如果都接受的话,那么后续的规则根本就不会有用嘛! 其实那条规则是仅针对每部主机都有的内部循环测试网络 (lo) 接口啦!如果没有列出接口,那么我们就很容易搞错啰~ 所以,近来鸟哥都建议使用 iptables-save 这个指令来观察防火墙规则啦!因为 iptables-save 会列出完整的防火墙规则,只是并没有规格化输出而已。
由上面的输出来看,有底线且内容含有 lo 的那条规则当中,『 -i lo 』指的就是由 lo 适配卡进来的封包! 这样看就清楚多了!因为有写到接口的关系啊!不像之前的 iptables -L -n 嘛!这样了解乎! 不过,既然这个规则不是我们想要的,那该如何修改规则呢?鸟哥建议,先删除规则再慢慢建立各个需要的规则! 那如何清除规则?这样做就对了:
由于这三个指令会将本机防火墙的所有规则都清除,但却不会改变预设政策 (policy) , 所以如果你不是在本机下达这三行指令时,很可能你会被自己挡在家门外 (若 INPUT 设定为 DROP 时)!要小心啊! 一般来说,我们在重新定义防火墙的时候,都会先将规则给他清除掉。还记得我们前面谈到的, 防火墙的『规则顺序』是有特殊意义的,所以啰, 当然先清除掉规则,然后一条一条来设定会比较容易一点啦。底下就来谈谈定义预设政策吧! 9.3.4-2 定义预设政策 (policy) 清除规则之后,再接下来就是要设定规则的政策啦!还记得政策指的是什么吗?『 当你的封包不在你设定的规则之内时,则该封包的通过与否,是以 Policy 的设定为准』,在本机方面的预设政策中,假设你对于内部的使用者有信心的话, 那么 filter 内的 INPUT 链方面可以定义的比较严格一点,而 FORWARD 与 OUTPUT 则可以订定的松一些!通常鸟哥都是将 INPUT 的 policy 定义为 DROP 啦,其他两个则定义为 ACCEPT。 至于 nat table 则暂时先不理会他。
看到输出的结果了吧?INPUT 被修改了设定喔!其他的 nat table 三条链的预设政策设定也是一样的方式,例如:『 iptables -t nat -P PREROUTING ACCEPT 』就设定了 nat table 的 PREROUTING 链为可接受的意思!预设政策设定完毕后,来谈一谈关于各规则的封包基础比对设定吧。 9.3.4-3 封包的基础比对:IP, 网域及接口装置 开始来进行防火墙规则的封包比对设定吧!既然是因特网,那么我们就由最基础的 IP, 网域及埠口,亦即是 OSI 的第三层谈起,再来谈谈装置 (网络卡) 的限制等等。这一小节与下一小节的语法你一定要记住,因为这是最基础的比对语法喔!
iptables 的基本参数就如同上面所示的,仅只谈到 IP 、网域与装置等等的信息, 至于 TCP, UDP 封包特有的埠口 (port number) 与状态 (如 SYN 旗标) 则在下小节才会谈到。 好,先让我们来看看最基础的几个规则,例如开放 lo 这个本机的接口以及某个 IP 来源吧!
仔细看上面并没有列出 -s, -d 等等的规则,这表示:不论封包来自何处或去到哪里,只要是来自 lo 这个界面,就予以接受!这个观念挺重要的,就是『没有指定的项目,则表示该项目完全接受』的意思! 例如这个案例当中,关于 -s, -d...等等的参数没有规定时,就代表不论什么值都会被接受啰。 这就是所谓的信任装置啦!假如你的主机有两张以太网络卡,其中一张是对内部的网域,假设该网卡的代号为 eth1 好了, 如果内部网域是可信任的,那么该网卡的进出封包就通通会被接受,那你就能够用:『iptables -A INPUT -i eth1 -j ACCEPT』 来将该装置设定为信任装置。不过,下达这个指令前要特别注意,因为这样等于该网卡没有任何防备了喔!
这就是最单纯简单的防火墙规则的设定与观察方式。不过,在上面的案例中,其实你也发现到有两条规则可能有问题~ 那就是上面的特殊字体圈起来的规则顺序。明明已经放行了 192.168.100.0/24 了,所以那个 192.168.100.230 的规则就不可能会被用到!这就是有问题的防火墙设定啊!了解乎?那该怎办?就重打啊!@_@! 那如果你想要记录某个规则的纪录怎么办?可以这样做:
看到输出结果的最左边,会出现的是 LOG 喔!只要有封包来自 192.168.2.200 这个 IP 时, 那么该封包的相关信息就会被写入到核心讯息,亦即是 /var/log/messages 这个档案当中。 然后该封包会继续进行后续的规则比对。所以说, LOG 这个动作仅在进行记录而已,并不会影响到这个封包的其他规则比对的。 好了,接下来我们分别来看看 TCP,UDP 以及 ICMP 封包的其他规则比对吧! 9.3.4-4 TCP, UDP 的规则比对:针对埠口设定 我们在第二章网络基础谈过各种不同的封包格式, 在谈到 TCP 与 UDP 时,比较特殊的就是那个埠口 (port),在 TCP 方面则另外有所谓的联机封包状态, 包括最常见的 SYN 主动联机的封包格式。那么如何针对这两种封包格式进行防火墙规则的设定呢?你可以这样看:
事实上就是多了那个 --sport 及 --dport 这两个玩意儿,重点在那个 port 上面啦! 不过你得要特别注意,因为仅有 tcp 与 udp 封包具有埠口,因此你想要使用 --dport, --sport 时,得要加上 -p tcp 或 -p udp 的参数才会成功喔!底下让我们来进行几个小测试:
瞧!你可以利用 UDP 与 TCP 协议所拥有的端口号码来进行某些服务的开放或关闭喔!你还可以综合处理呢!例如:只要来自 192.168.1.0/24 的 1024:65535 埠口的封包,且想要联机到本机的 ssh port 就予以抵挡,可以这样做:
如果忘记加上 -p tcp 就使用了 --dport 时,会发生啥问题呢?
你应该会觉得很奇怪,怎么『 --dport 』会是未知的参数 (arg) 呢?这是因为你没有加上 -p tcp 或 -p udp 的缘故啊!很重要喔! 除了埠口之外,在 TCP 还有特殊的旗标啊!最常见的就是那个主动联机的 SYN 旗标了。 我们在 iptables 里面还支持『 --syn 』的处理方式,我们以底下的例子来说明好了:
一般来说,client 端启用的 port 都是大于 1024 以上的埠口,而 server 端则是启用小于 1023 以下的埠口在监听的。所以我们可以让来自远程的小于 1023 以下的端口数据的主动联机都给他丢弃! 但不适用在 FTP 的主动联机中!这部份我们未来在二十一章的 FTP 服务器再来谈吧! 9.3.4-5 iptables 外挂模块:mac 与 state 在 kernel 2.2 以前使用 ipchains 管理防火墙时,通常会让系统管理员相当头痛!因为 ipchains 没有所谓的封包状态模块,因此我们必须要针对封包的进、出方向进行管控。举例来说,如果你想要联机到远程主机的 port 22 时,你必须要针对两条规则来设定:
这会很麻烦!因为如果你要联机到 10 部主机的 port 22 时,假设 OUTPUT 为预设开启 (ACCEPT), 你依旧需要填写十行规则,让那十部远程主机的 port 22 可以联机到你的本地端主机上。 那如果开启全部的 port 22 呢?又担心某些恶意主机会主动以 port 22 联机到你的机器上! 同样的道理,如果你要让本地端主机可以连到外部的 port 80 (WWW 服务),那就更不得了~ 这就是网络联机是双向的一个很重要的概念! 好在我们的 iptables 免除了这个困扰!他可以透过一个状态模块来分析 『这个想要进入的封包是否为刚刚我发出去的响应?』 如果是刚刚我发出去的响应,那么就可以予以接受放行!哇!真棒!这样就不用管远程主机是否联机进来的问题了! 那如何达到呢?看看底下的语法:
如此一来,我们的 iptables 就会主动分析出该封包是否为响应状态,若是的话,就直接予以接受。呵呵! 这样一来你就不需要针对响应的封包来撰写个别的防火墙规则了!这真是太棒了!底下我们继续谈一下 iptables 的另一个外挂, 那就是针对网卡来进行放行与防御:
如果你的区网当中有某些网络高手,老是可以透过修改 IP 去尝试透过路由器往外跑,那你该怎么办? 难道将整个区网拒绝?并不需要的,你可以透过之前谈到的 ARP 相关概念,去捉到那部主机的 MAC ,然后透过上头的这个机制, 将该主机整个 DROP 掉即可。不管他改了什么 IP ,除非他知道你是用网卡的 MAC 来管理,否则他就是出不去啦!了解乎?
9.3.4-6 ICMP 封包规则的比对:针对是否响应 ping 来设计 在第二章 ICMP 协议当中我们知道 ICMP 的类型相当的多,而且很多 ICMP 封包的类型都是为了要用来进行网络检测用的!所以最好不要将所有的 ICMP 封包都丢弃!如果不是做为路由器的主机时,通常我们会把 ICMP type 8 (echo request) 拿掉而已,让远程主机不知道我们是否存在,也不会接受 ping 的响应就是了。ICMP 封包格式的处理是这样的:
这样就能够开放部分的 ICMP 封包格式进入本机进行网络检测的工作了!不过,如果你的主机是作为区网的路由器, 那么建议 icmp 封包还是要通通放行才好!这是因为客户端检测网络时,常常会使用 ping 来测试到路由器的线路是否畅通之故呦! 所以不要将路由器的 icmp 关掉,会有状况啦! 9.3.4-7 超阳春客户端防火墙设计与防火墙规则储存 经过上述的本机 iptables 语法分析后,接下来我们来想想,如果站在客户端且不提供网络服务的 Linux 本机角色时, 你应该要如何设计你的防火墙呢?老实说,你只要分析过 CentOS 默认的防火墙规则就会知道了,理论上, 应该要有的规则如下:
这就是最最阳春的防火墙,你可以透过第二步骤抵挡所有远程的来源封包,而透过第四步骤让你要求的远程主机响应封包可以进入, 加上让本机的 lo 这个内部循环装置可以放行,嘿嘿!一部 client 专用的防火墙规则就 OK 了!你可以在某个 script 上面这样做即可:
其实防火墙也是一个服务,你可以透过『chkconfig --list iptables』去察看就知道了。 因此,你这次修改的各种设定想要在下次开机还保存,那就得要进行『 /etc/init.d/iptables save 』这个指令加参数。 因此,鸟哥现在都是将储存的动作写入这个 firewall.sh 脚本中,比较单纯些啰!现在,你的 Linux 主机已经有相当的保护了, 只是如果想要作为服务器,或者是作为路由器,那就得要自行加上某些自定义的规则啰。
制订好规则后当然就是要测试啰!那么如何测试呢?
一步一步作下来,看看问题出在哪里,然后多多的去改进、改良!基本上,网络上目前很多的资料可以提供你不错的参考了! 这一篇的设定写的是很简单,大部分都还在介绍阶段而已!希望对大家有帮助! 鸟哥在参考数据(注2)当中列出几个有用的防火墙网页,希望大家有空真的要多多的去看看!会很有帮助的! 9.3.5 IPv4 的核心管理功能: /proc/sys/net/ipv4/* 除了 iptables 这个防火墙软件之外,其实咱们 Linux kernel 2.6 提供很多核心预设的攻击抵挡机制喔! 由于是核心的网络功能,所以相关的设定数据都是放置在 /proc/sys/net/ipv4/ 这个目录当中。 至于该目录下各个档案的详细资料,可以参考核心的说明文件 (你得要先安装 kernel-doc 软件):
鸟哥这里也放一份备份: 有兴趣的话应该要自行去查一查比较好的喔!我们底下就拿几个简单的档案来作说明吧!
9.4 单机防火墙的一个实例 介绍了这么多的防火墙语法与相关的注意事项后,终于要来架设防火墙了。鸟哥还是比较偏好使用脚本来撰写防火墙, 然后透过最终的 /etc/init.d/iptables save 来将结果储存到 /etc/sysconfig/iptables 去! 而且此一特色还可以用在呼叫其他的 scripts ,可以让防火墙规则具有较为灵活的使用方式。 好了,那就来谈谈如何设定咱们的防火墙规则吧! 9.4.1 规则草拟 鸟哥底下介绍的这个防火墙,其实可以用来作为路由器上的防火墙,也可以用来作为本机的防火墙。 假设硬件联机如同下图所示, Linux 主机本身也是内部 LAN 的路由器!亦即是一个简单的 IP 分享器的功能啦!依据第三章的图 3.2-1 假设鸟哥网络接口有底下这些:
图 9.4-1、一个局域网络的路由器架构示意图 由于希望将信任网域 (LAN) 与不信任网域 (Internet) 整个分开的完整一点, 所以希望你可以在 Linux 上面安装两块以上的实体网卡,将两块网卡接在不同的网域,这样可以避免很多问题。 至于最重要的防火墙政策是:『关闭所有的联机,仅开放特定的服务』模式。 而且假设内部使用者已经受过良好的训练,因此在 filter table 的三条链个预设政策是:
鸟哥底下预计提供的防火墙流程是这样的: 图 9.4-2、本机的防火墙规则流程示意图 原则上,内部 LAN 主机与主机本身的开放度很高,因为 Output 与 Forward 是完全开放不理的!对于小家庭的主机是可以接受的,因为我们内部的计算机数量不多,而且人员都是熟悉的, 所以不需要特别加以控管!但是:『在大企业的内部,这样的规划是很不合格的, 因为你不能保证内部所有的人都可以按照你的规定来使用 Network !』也就是说『家贼难防』呀! 因此,那样的环境连 Output 与 Forward 都需要特别加以管理才行! 9.4.2 实际设定 事实上,我们在设定防火墙的时候,不太可能会一个一个指令的输入,通常是利用 shell scripts 来帮我们达成这样的功能吶!底下是利用上面的流程图所规划出来的防火墙脚本,你可以参考看看, 但是你需要将环境修改成适合你自己的环境才行喔!此外,为了未来修改维护的方便,鸟哥将整个 script 拆成三部分,分别是:
鸟哥个人习惯是将这个脚本放置到 /usr/local/virus/iptables 目录下,你也可以自行放置到自己习惯的位置去。 那底下就来瞧瞧这支脚本是怎么写的吧! 特别留意上面程序代码的特殊字体部分,基本上,你只要修改一下最上方的接口部分, 应该就能够运作这个防火墙了。不过因为每个人的环境都不相同, 因此你在设定完成后,依旧需要测试一下才行喔!不然,出了问题不要怪我啊!.... 再来看一下关于 iptables.allow 的内容是如何?假如我要让一个 140.116.44.0/24 这个网域的所有主机来源可以进入我的主机的话,那么这个档案的内容可以写成这样:
将这三个档案的权限设定为 700 且只属于 root 的权限后,就能够直接执行 iptables.rule 啰! 不过要注意的是,在上面的案例当中,鸟哥预设将所有的服务的通道都是关闭的! 所以你必须要到本机防火墙的第 5 步骤处将一些批注符号 (#) 解开才行。 同样的,如果有其他更多的 port 想要开启时,一样需要增加额外的规则才行喔! 不过,还是如同前面我们所说的,这个 firewall 仅能提供基本的安全防护,其他的相关问题还需要再测试测试呢! 此外,如果你希望一开机就自动执行这个 script 的话,请将这个档案的完整档名写入 /etc/rc.d/rc.local 当中,有点像底下这样:
事实上,这个脚本的最底下已经加入写入防火墙默认规则文件的功能,所以你只要执行一次,就拥有最正确的规则了! 上述的 rc.local 仅是预防万一而已。 ^_^!上述三个档案请你不要在 Windows 系统上面编辑后才传送到 Linux 上运作,因为 Windows 系统的断行字符问题,将可能导致该档案无法执行。建议你直接到底下去下载,传送到 Linux 后可以利用 dos2unix 指令去转换断行字符!就不会有问题! 这就是一个最简单、阳春的防火墙。同时,这个防火墙还可以具有最阳春的 IP 分享器的功能呢! 也就是在 iptables.rule 这个档案当中的第二部分了。 这部分我们在下一节会再继续介绍的。 9.5 NAT 服务器的设定 呼呼!终于来到这个地方了!我们准备要架设一个路由器的延伸服务器,就称之为 NAT 服务器。 NAT 是什么呢?简单的说,你可以称他为内部 LAN 主机的『 IP 分享器』啦! NAT 的全名是 Network Address Translation,字面上的意思是『网络地址的转换』。由字面上的意思我们来想一想, TCP/IP 的网络封包不是有 IP 地址吗?那 IP 地址不是有来源与目的吗?我们的 iptables 指令就能够修改 IP 封包的表头数据, 嘿嘿!连目标或来源的 IP 地址都可以修改呢!甚至连 TCP 封包表头的 port number 也能修改!真是有趣! NAT 服务器的功能可以达到类似图 9.1-2所介绍的类似 IP 分享的功能之外, 还可以达到类似图 9.1-4所介绍的 DMZ (非军事区) 的功能!这完全取决于我们的 NAT 是修改: (1)来源 IP 还是 (2)目标 IP !底下我们就来聊一聊吧! ^_^ 9.5.1 什么是 NAT? SNAT? DNAT? 在谈到 NAT 的实际运作之前,让我们再来看一下比较简单的封包透过 iptables 而传送到后端主机的表格与链流程(请往前参考图 9.3-4)。 当网络布线如图 9.1-2的架构,若内部 LAN 有任何一部主机想要传送封包出去时, 那么这个封包要如何透过 Linux 主机而传送出去?他是这样的:
NAT 服务器的重点就在于上面流程的第 1,4 步骤,也就是 NAT table 的两条重要的链:PREROUTING 与 POSTROUTING。 那这两条链有什么重要的功能呢?重点在于修改 IP 嘛!但是这两条链修改的 IP 是不一样的! POSTROUTING 在修改来源 IP ,PREROUTING 则在修改目标 IP 。 由于修改的 IP 不一样,所以就称为来源 NAT (Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。我们先来谈一谈 IP 分享器功能的 SNAT 吧!
9.5.2 最阳春 NAT 服务器: IP 分享功能 在 Linux 的 NAT 服务器服务当中,最常见的就是类似图 9.1-2的 IP 分享器功能了。 而由刚刚的介绍你也该知道,这个 IP 分享器的功能其实就是 SNAT 啦!作用就只是在 iptables 内的 NAT 表格当中,那个路由后的 POSTROUTING 链进行 IP 的伪装就是了。另外, 你也必须要了解,你的 NAT 服务器必须要有一个 public IP 接口,以及一个内部 LAN 连接的 private IP 界面才行。底下的范例中,鸟哥的假设是这样的:
记住!当你利用前面几章谈到的数据来设定你的网络参数后,务必要进行路由的检测, 因为在 NAT 服务器的设定方面,最容易出错的地方就是路由了!尤其是在拨接产生 ppp0 这个对外接口的环境下, 这个问题最严重。反正你要记得:『如果你的 public IP 取得的方式是拨接或 cable modem 时,你的配置文件 /etc/sysconfig/network, ifcfg-eth0, ifcfg-eth1 等档案,千万不要设定 GATEWAY 啦!』否则就会出现两个 default gateway ,反而会造成问题。 如果你刚刚已经下载了 iptables.rule ,那么该档案内已经含有 NAT 的脚本了! 你可以看到该档案的第二部份关于 NAT 服务器的部分,应该有看到底下这几行:
重点在那个『 MASQUERADE 』!这个设定值就是『 IP 伪装成为封包出去 (-o) 的那块装置上的 IP 』!以上面的例子来说,就是 $EXTIF ,也就是 eth0 啦! 所以封包来源只要来自 $innet (也就是内部 LAN 的其他主机) ,只要该封包可透过 eth0 传送出去, 那就会自动的修改 IP 的来源表头成为 eth0 的 public IP 啦!就这么简单! 你只要将 iptables.rule 下载后,并设定好你的内、外网络接口, 执行 iptables.rule 后,你的 Linux 就拥有主机防火墙以及 NAT 服务器的功能了!
事实上,除了 IP 伪装 (MASQUERADE) 之外,我们还可以直接指定修改 IP 封包表头的来源 IP 呢! 举例来说,如下面这个例子:
这样也可以修改网络封包的来源 IP 资料喔!不过,除非你使用的是固定 IP ,且有多个 IP 可以对外联机,否则一般使用 IP 伪装即可,不需要使用到这个 SNAT 啦!当然,你也可能有自己的独特的环境啦! ^_^ 9.5.3 iptables 的额外核心模块功能 如果你刚刚在 iptables.rule 内的第二部分有仔细看的话, 那有没有觉得很奇怪,为何我们需要加载一些有用的模块?举例来说, ip_nat_ftp 及 ip_nat_irc ? 这是因为很多通讯协议使用的封包传输比较特殊,尤其是 FTP 文件传输使用到两个 port 来处理数据! 这个部分我们会在 FTP 章节再来详谈,在这里你要先知道,我们的 iptables 提供很多好用的模块, 这些模块可以辅助封包的过滤用途,让我们可以节省很多 iptables 的规则拟定,好棒的吶! ^_^ 9.5.4 在防火墙后端之网络服务器 DNAT 设定 既然可以做 SNAT 的 IP 分享功能,我们当然可以使用 iptables 做出 DMZ 啦! 但是再次重申,不同的服务器封包传输的方式可能有点差异,因此,建议新手不要玩这个咚咚! 否则很容易导致某些服务无法顺利对 Internet 提供的问题。 先来谈一谈,如果我想要处理 DNAT 的功能时, iptables 要如何下达指令? 另外,你必须要知道的是, DNAT 用到的是 nat table 的 Prerouting 链喔!不要搞错了。
那个『 -j DNAT --to-destination IP[:port] 』就是精髓啦!代表从 eth0 这个接口传入的,且想要使用 port 80 的服务时, 将该封包重新传导到 192.168.100.10:80 的 IP 及 port 上面!可以同时修改 IP 与 port 呢!真方便。 其他还有一些较进阶的 iptables 使用方式,如下所示:
至于更多的用途,那就有待你自己的发掘啰! ^_^ 9.6 重点回顾
9.7 本章习题
9.8 参考数据与延伸阅读
2002/08/20:第一次完成日期! 2003/08/25:重新设计内容,改写一些指令介绍,与前一篇『认识网络安全』 分的比较完整一点! 2006/09/06:将旧的文章移动到此处 2006/09/11:拿掉了已经在基础篇有介绍过的 认识服务之 TCP Wrappers。 2006/09/13:加入 NAT 的说明了,将旧的 NAT 主机移动到 此处。 2006/09/15:将 iptables.rule 的连结贴上去了!之前忘记修改该档案了~ 2006/11/08:因为 PPPoE 拨接与 Ethernet 的 MTU 不同,可能在某些情况下会导致使用者无法联机,更新了 iptables.rule 了。 2010/10/27:将旧的基于 CentOS 4.x 的版本移动到此处 2011/02/08:修改了很多图示,并且将文句作个整理,大方向并没有特殊的修改! 2011/07/22:将基于 CentOS 5.x 的版本移动到此处 |
|||||||||||||||||||||||||||||||||||||||||||||||||
本网页主要以Firefox配合解析度 1024x768 作为设计依据 鸟哥自由软件整合应用研究室