防火墙

防火墙

信息安全通常被当作一种不断改进的过程而不是一成不变的产品。然而,标准的安全实现通常会使用某种专用机制来控制存取权限;把对网络资源的使用限制在授权的、可识别身份的、和可追踪的用户范围内。红帽企业 Linux 包括了好几种强大的工具来协助管理员和安全工程师们解决网络级别的存取控制问题。

除了 IPsec(第6章 中所讨论)之类的 VPN 解决方案外,防火墙是网络保安系统的一个重要组成部分。好几家推广防火墙方案的厂商都提供了满足各级市场需求的产品:从保护一台电脑的家庭用户的需求,到保卫重要企业信息的数据中心方案。防火墙可以是单独的硬件解决方案,如 Cisco、Nokia、和 Sonicwall 的防火墙设备。Checkpoint、McAfee、以及 Symantec 等厂商还开发了家用和商用的专有软件防火墙解决方案。

除了硬件防火墙和软件防火墙间的区别外,各个防火墙在功能用途方面也有所区别。表 7-1详细描述了三种常见的防火墙,以及它们的运行方式:

方法

描述

优越性

不利因素

NAT

网络地址转换(Network Address TranslationNAT)把内部网络的 IP 子网放置在一个或一组外部 IP 地址之后,把所有的请求都伪装成来自一个地址而不是多个不同地址。

?可以在 LAN 机器上被透明配置

?保护在一个或多个外部 IP 地址之后的许多机器,简化管理任务

?用户到 LAN 的出入可以通过打开和关闭 NAT 防火墙/网关上的端口来限制

?一旦用户从防火墙外连接了服务,则无法防止其蓄意活动

分组过滤器

分组过滤防火墙读取每个进出 LAN 的数据分组。它可以根据头信息来读取和处理分组,并根据被防火墙管理员实施的可编排的规则来过滤分组。Linux 内核通过 Netfilter 内核子系统内建了分组过滤功能。

?可以通过 iptables 这个前端工具而被定制

?不需要任何客户方面的定制,因为所有的网络活动都在路由器级别而不是应用程序级别被过滤

?由于分组没有通过代理来传输,客户和远程主机间是直接连接,因此网络传输速度比较快

?无法像代理防火墙一样根据内容过滤分组

?在协议层处理分组,但是无法在应用程序层处理分组

?复杂的网络体系可能会使建立分组过滤规则方面比较困难,特别是在和 IP 伪装(IP masquerading)或本地子网及 DMZ 网络一起使用时

代理

代理防火墙过滤所有从 LAN 客户到代理机器的某种特定协议或类型的请求,然后,它再代表这个本地客户向互联网发送这些请求。代理机器被用来充当企图不良的远程用户和内部网络客户机器之间的一个缓冲。

?使管理员拥有对 LAN 之外的应用程序和协议功能的控制权

?某些代理服务器可以缓存数据,因此当客户存取频繁请求的数据时,这些数据就可以从本地缓存调出而不必使用互联网连接,这有助于减少不必要的带宽用量

?代理服务可以被密切地监视和记录,从而允许你在网络资源用量方面有更严格的控制

?代理通常是应用程序特有的(HTTP、Telnet 等)或在协议方面有限制的(多数代理只能用于 TCP 连接的服务)

?应用程序服务无法在代理后面运行,因此你的应用程序服务器必须使用另一种网络保安措施

?代理可能会成为网络的瓶颈,因为所有的请求和传输都要经过一个中介而不是让客户直接连接远程服务

7-1. 防火墙类型

7.1. Netfilter iptables

Linux 内核中有一个功能强大的联网子系统 Netfilter。Netfilter 子系统提供了有状态的或无状态的分组过滤,还提供了 NAT 和 IP 伪装服务。Netfilter 还具备为高级选路和连接状态管理而变形(mangle)IP 头信息的能力。Netfilter 是通过 IPTables 工具来控制的。

7.1.1. iptables总览

Netfilter 的强大功能和灵活性是通过 iptables 界面来实现的。这个命令行工具和它的前身 ipchains 的语法很相似;不过,iptables 使用 Netfilter 子系统来增进网络连接、检验、和处理方面的能力;ipchains 使用错综复杂的规则集合来过滤源地和目的地路线以及两者的连接端口。iptables 只在一个命令行界面中就包括了更先进的记录方式;选路前和选路后的行动;网络地址转换;以及端口转发。

7.2. 使用iptables

使用 iptables 的第一步是启动 iptables 服务。这可以使用以下命令进行:

service iptables start

clip_image002

警告

 

你应该使用以下命令关闭 ip6tables 服务才能使用 iptables 服务:

service ip6tables stop

chkconfig ip6tables off

要使 iptables 在系统引导时默认启动,你必须使用 chkconfig 来改变服务的运行级别状态。

chkconfig --level 345 iptables on

iptables 的语法被分成几个层次。主要层次为“链”(chain)。“链”指定处理分组的状态。其用法为:

iptables -A chain -j target

-A 在现存的规则集合内后补一条规则。chain 是规则所在“链”的名称。iptables 中有三个内建的链(即影响每一个在网络中经过的分组的链):INPUT、OUTPUT、和 FORWARD。这些链是永久性的,不能被删除。-j target 选项指定 iptables 应该“跳”(jump)到规则集中的哪条规则。内建的目标有:ACCEPT、DROP、和 REJECT。

-N 选项可以被用来创建新链(又称用户定义链)。创建新链在定制详尽或复杂规则方面很有用。

7.2.1. 基本防火墙政策

在一开始就建立的某些基本政策为建构更详细的用户定义的规则奠定了基础。iptables 使用政策(policy, -P)来创建默认规则。对安全敏感的管理员通常想采取放弃所有分组的政策,只逐一允许指定分组。以下规则阻塞网络上所有的出入分组。

iptables -P INPUT DROP

iptables -P OUTPUT DROP

此外,还推荐你拒绝所有转发分组(forwarded packets) — 要从防火墙被选路发送到它的目标节点的网络交通 — 以便限制内部客户对互联网的无心暴露。要达到这个目的,使用以下规则:

iptables -P FORWARD DROP

设置了政策链后,为你的特定网络和安全需要创建新规则。以下各节概述了一些你在建构 iptables 防火墙时可能要实现的规则。

7.2.2. 保存和恢复iptables规则

防火墙规则只在计算机处于开启状态时才有效。如果系统被重新引导,这些规则就会自动被清除并重设。要保存规则以便今后载入,请使用以下命令:

/sbin/service iptables save

保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时(包括机器被重新引导时)被应用。

7.3. 常用iptables过滤

把远程攻击者拒之“LAN”外是保护网络安全的一个重要方面,甚至可以说是重要的一个方面。LAN 的完好性应该通过使用严格的防火墙规则来抵御蓄意不良的远程用户而被保护。但是,如果默认政策被设置为阻塞所有进入、输出、和转发的分组,防火墙/网关和内部 LAN 用户之间的通信就无法进行。要允许用户执行与网络相关的功能以及使用联网应用程序,管理员必须打开某些端口进行通信。

例如:要允许到防火墙上的端口80的通信,添加以下规则:

iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT

iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT

这会允许用户浏览通过端口80通信的网站。要允许到安全网站(如 https://www.example.com/)的访问,你还必须打开端口443。

iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT

iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT

clip_image004

重要

 

在创建 iptables 规则集合时,记住规则的顺序至关重要。例如:如果某个链指定了来自本地子网 192.168.100.0/24 的任何分组都应放弃,然后一个允许来自 192.168.100.13(在前面要放弃分组的子网范围内)的分组的链被补在这个规则后面(-A),那么这个后补的规则就会被忽略。你必须首先设置允许 192.168.100.13 的规则,然后再设置放弃规则。

要在现存规则链的任意处插入一条规则,使用 -I,随后是你想插入规则的链的名称,然后是你想放置规则的位置号码(1,2,3,...,n)。例如:

iptables -I INPUT 1 -i lo -p all -j ACCEPT

这条规则被插入为 INPUT 链的第一条规则,它允许本地环回设备上的交通。

有时候,你可能会需要从 LAN 之外远程地进入 LAN。SSH 之类的安全服务可以用于到 LAN 服务的加密远程连接。对于拥有基于 PPP 资源(如调制解调器池或批量 ISP 帐号)的管理员来说,拨号进入可以被用来安全地避开防火墙,因为调制解调器连接是直接连接,通常位于防火墙/网关之后。然而,对于有宽带连接的远程用户来说,你就需要制定些特殊规定。你可以配置 iptables 接受来自远程 SSH 客户的连接。例如,要允许远程 SSH 访问,你可以使用以下规则:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -p udp --sport 22 -j ACCEPT

你可能还想为其它服务定义规则。关于 iptables 及其各类选项的完整信息,请参阅《红帽企业 Linux 参考指南》

这些规则允许个体系统的出入交通,如单个 PC 直接连接到互联网或防火墙/网关;然而,它们并不允许防火墙/网关之后的机器使用这些服务。要允许 LAN 使用这些服务,你可以使用带有 iptables 过滤规则的 NAT。

7.4. FORWARD NAT 规则

多数机构从它们的 ISP 处得到数量有限的可公开选路的 IP 地址。鉴于这种限额,管理员必须积极寻求分享互联网服务的创建性方法,而又不必把稀有的 IP 地址分配给 LAN 上的每一台机器。使用专用 IP 地址是允许 LAN 上的所有机器正确使用内部和外部网络服务的常用方法。边缘路由器(如防火墙)可以接收来自互联网的进入交通,并把这些分组选路发送到它们意图发送的 LAN 节点上;同时,防火墙/网关还可以把来自 LAN 节点的输出请求选路发送到远程互联网服务中。这种转发网络交通行为有时会很危险,特别是随着能够假冒内部IP 地址、使远程攻击者的机器成为你的 LAN 上的一个节点的现代攻击工具的出现。为防止此类事件的发生,iptables 提供了选路发送和转发政策,你可以实施它们来防止对网络资源的变相利用。

FORWARD 政策允许管理员控制分组可以被选路发送到 LAN 内的哪些地方。例如:要允许整个 LAN 的转发(假定防火墙/网关在 eth1 上有一个内部 IP 地址),你可以设置以下规则:

iptables -A FORWARD -i eth1 -j ACCEPT

iptables -A FORWARD -o eth1 -j ACCEPT

该规则令防火墙/网关之后的系统能够进入内部网络。网关把 LAN 节点的分组选路发送到它的目的地,通过 eth1 设备传递所有分组。

clip_image006

注记

 

按照默认设置,红帽企业 Linux 内核中的 IPv4 政策禁用了对 IP 转发的支持,这会防止运行红帽企业 Linux 的机器成为专用边缘路由器。要启用 IP 转发,请运行以下命令:

sysctl -w net.ipv4.ip_forward=1

如果该命令是通过 shell 提示运行的,那么其设置在重新引导后就不会被保存。你可以通过编辑 /etc/sysctl.conf 文件来永久性地设置转发。寻找并编辑以下行,把 0 改成 1:

net.ipv4.ip_forward = 0

执行以下命令来启用 sysctl.conf 文件中的改变:

sysctl -p /etc/sysctl.conf

接受通过防火墙的内部 IP 设备来转发的分组会允许 LAN 节点彼此通信;不过,它们没有被允许和外界(如互联网)通信。要允许带有内部 IP 地址的 LAN 节点和外部的公共网络通信,需要配置防火墙的 IP 伪装(IP masquerading)。这会把来自 LAN 节点的请求都伪装成防火墙的外部设备(在这个例子中是 eth0)的 IP 地址。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

该规则使用 NAT 分组匹配表(-t nat),并在防火墙的外部联网设备(-o eth0)上为 NAT 指定内建的 POSTROUTING 链(-A POSTROUTING)。POSTROUTING 允许分组在离开防火墙的外部设备时被改变。-j MASQUERADE 目标被用来使用防火墙/网关的外部 IP 地址来掩盖节点的内部 IP 地址。

如果你想让内部网络内的某个服务器能够被外部利用,你可以使用 NAT 内 PREROUTING 链的 -j DNAT 目标来指定该向哪个目标 IP 地址以及端口转发请求连接到内部服务的分组。例如,如果你想把进入的 HTTP 请求转发到 172.31.0.23 上的专用 Apache HTTP 服务器服务器系统,运行以下命令:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \

--to 172.31.0.23:80

该规则指定 NAT 表使用内建的 PREROUTING 链来仅把进入的 HTTP 请求转发到被列出的 IP 地址 172.31.0.23。

clip_image006[1]

注记

 

如果你的 FORWARD 链的默认政策是 DROP,你就必须后补一条规则来允许转发进入的 HTTP 请求,因此目标 NAT 选路才有可能。运行以下命令可以达到这个目的:

iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT

该规则允许把进入的 HTTP 请求从防火墙转发到防火墙之后的 Apache HTTP 服务器服务器。

7.4.1. DMZ iptables

iptables 规则可以被设置来把交通选路发送到某些机器(如专用 HTTP 或 FTP 服务器)的规则,这些机器最好是位于停火区域(demilitarized zone,DMZ)的和内部网络分开的机器。例如,要设置一条把所有进入的 HTTP 请求都选路发送到 IP 地址为 10.0.4.2(LAN 192.168.1.0/24 范围之外)的专用 HTTP 服务器的规则,NAT 会调用 PREROUTING 表来把这些分组转发到恰当的目的地:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \

--to-destination 10.0.4.2:80

使用这项命令,所有来自 LAN 以外的到端口80的 HTTP 连接都会被选路发送到和内部网络分离的另一个网络上的 HTTP 服务器上。这种网络分段会比允许到内部网络中的机器上的 HTTP 连接更安全。如果 HTTP 服务器被配置接受安全连接,那么端口443也必须被转发。

7.5. 病毒和假冒 IP 地址

你可以更精心设计一些规则来控制到 LAN 内指定子网的访问,甚至到指定机器的访问。你还可以限制某些类似特洛伊木马、蠕虫、以及其它客户/服务器病毒的可疑服务与它们的服务器连接。例如:有些特洛伊木马会扫描端口 31337 到 31340(即黑客语言中的 elite端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。

iptables -A OUTPUT -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP

iptables -A FORWARD -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP

你还可以阻塞试图假冒你所在 LAN 的专用 IP 地址混入的连接。例如:如果你的 LAN 使用 192.168.1.0/24 范围,面向互联网的网络设备(如 eth0)上就可以设置一条规则来放弃到那个设备的使用你所在 LAN 的 IP 范围的分组。因为推荐使用的默认政策是拒绝转发分组,所有到面向外界的设备(eth0)的假冒 IP 地址都会被自动拒绝。

iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -j DROP

clip_image006[2]

注记

 

在处理添加的规则时,REJECT(拒绝)目标和 DROP(放弃)目标这两种行动有所不同。REJECT 会拒绝目标分组的进入,并给企图连接服务的用户返回一个 connection refused 的错误消息。DROP 会放弃分组,而对用户不发出任何警告。管理员可酌情考虑如何使用这些目标。不过,为了避免导致用户由于迷惑不解而不停试图连接的情况的发生,推荐你使用 REJECT 目标。

7.6. iptables和连接跟踪

iptables 包括一个模块,它允许管理员使用“连接跟踪”(connection tracking)方法来检查和限制到内部网络中可用服务的连接。连接跟踪把所有连接都保存在一个表格内,它令管理员能够根据以下连接状态来允许或拒绝连接:

· NEW — 请求新连接的分组,如 HTTP 请求。

· ESTABLISHED — 属于当前连接的一部分的分组。

· RELATED — 请求新连接的分组,但是它也是当前连接的一部分,如消极 FTP 连接,其连接端口是 20,但是其传输端口却是 1024 以上的未使用端口。

· INVALID — 不属于连接跟踪表内任何连接的分组。

你可以和任何网络协议一起使用 iptables 连接跟踪的状态功能,即便协议本身可能是无状态的(如 UDP)。下面的例子显示的规则使用连接跟踪来只转发与已建立连接相关的分组:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ALLOW

7.7. ip6tables

下一代互联网协议 IPv6 的出现突破了 IPv4(或 IP)的32位地址限制。IPv6 支持128位地址,因此识别 IPv6 的载体网络就能够制定比 IPv4 更多的可选路地址。

红帽企业 Linux 支持使用 Netfilter 6 子系统和 ip6tables 命令的 IPv6 防火墙规则。使用 ip6tables 的第一步是启动 ip6tables 服务。它可以使用以下命令进行:

service ip6tables start

clip_image002[1]

警告

 

你必须关闭 iptables 服务才能专门使用 ip6tables 服务:

service iptables stop

chkconfig iptables off

要使 ip6tables 在系统引导时默认启动,使用 chkconfig 来改变服务的运行级别状态。

chkconfig --level 345 ip6tables on

其语法在各方面都和 iptables 相同,只不过 ip6tables 支持128位的地址。例如:在识别 IPv6 的网络服务器器上的 SSH 连接可以使用以下规则来启用:

ip6tables -A INPUT -i eth0 -p tcp -s 3ffe:ffff:100::1/128 --dport

posted @ 2011-08-23 20:22  ParamousGIS  阅读(225)  评论(0)    收藏  举报