Linux防火墙(iptables)

jljf_hh

贡献于2011-08-18

字数:0 关键词: 网络技术

Linux 防火墙技术资料 说明 本技术文档所有文章,均来自互联网。其中,有一部分已注明网址或 作者。如果文章作者认为本文档侵害了你的权利请告知。 华育国际青岛网络 李飞麟 Lifei6671@qq.com 硬件防火墙介绍及详细配置 2008-04-19 11:54 防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件 的组合。它是不同网络或网络安全域之间信息的唯一出入口,通过监测、限制、更改跨越防火墙的数据流, 尽可能地对外部屏蔽网络内部的信息、结构和运行状况,有选择地接受外部访问,对内部强化设备监管、 控制对服务器与外部网络的访问,在被保护网络和外部网络之间架起一道屏障,以防止发生不可预测的、 潜在的破坏性侵入。防火墙有两种,硬件防火墙和软件防火墙,他们都能起到保护作用并筛选出网络上的 攻击者。在这里主要给大家介绍一下我们在企业网络安全实际运用中所常见的硬件防火墙。 一、防火墙基础原理 1、防火墙技术 防火墙通常使用的安全控制手段主要有包过滤、状态检测、代理服务。下面,我们将介绍这些手段的工作 机理及特点,并介绍一些防火墙的主流产品。 包过滤技术是一种简单、有效的安全控制技术,它通过在网络间相互连接的设备上加载允许、禁止来自某 些特定的源地址、目的地址、TCP 端口号等规则,对通过设备的数据包进行检查,限制数据包进出内部网 络。包过滤的最大优点是对用户透明,传输性能高。但由于安全控制层次在网络层、传输层,安全控制的 力度也只限于源地址、目的地址和端口号,因而只能进行较为初步的安全控制,对于恶意的拥塞攻击、内 存覆盖攻击或病毒等高层次的攻击手段,则无能为力。 状态检测是比包过滤更为有效的安全控制方法。对新建的应用连接,状态检测检查预先设置的安全规则, 允许符合规则的连接通过,并在内存中记录下该连接的相关信息,生成状态表。对该连接的后续数据包, 只要符合状态表,就可以通过。这种方式的好处在于:由于不需要对每个数据包进行规则检查,而是一个 连接的后续数据包(通常是大量的数据包)通过散列算法,直接进行状态检查,从而使得性能得到了较大 提高;而且,由于状态表是动态的,因而可以有选择地、动态地开通 1024 号以上的端口,使得安全性得 到进一步地提高。 2、防火墙工作原理 (1)包过滤防火墙 包过滤防火墙一般在路由器上实现,用以过滤用户定义的内容,如 IP 地址。包过滤防火墙的工作原理是: 系统在网络层检查数据包,与应用层无关。这样系统就具有很好的传输性能,可扩展能力强。但是,包过 滤防火墙的安全性有一定的缺陷,因为系统对应用层信息无感知,也就是说,防火墙不理解通信的内容, 所以可能被黑客所攻破。 图 1:包过滤防火墙工作原理图 (2)应用网关防火墙 应用网关防火墙检查所有应用层的信息包,并将检查的内容信息放入决策过程,从而提高网络的安全性。 然而,应用网关防火墙是通过打破客户机/服务器模式实现的。每个客户机/服务器通信需要两个连接: 一个是从客户端到防火墙,另一个是从防火墙到服务器。另外,每个代理需要一个不同的应用进程,或一 个后台运行的服务程序,对每个新的应用必须添加针对此应用的服务程序,否则不能使用该服务。所以, 应用网关防火墙具有可伸缩性差的缺点。(图 2) (3)状态检测防火墙 状态检测防火墙基本保持了简单包过滤防火墙的优点,性能比较好,同时对应用是透明的,在此基础上, 对于安全性有了大幅提升。这种防火墙摒弃了简单包过滤防火墙仅仅考察进出网络的数据包,不关心数据 包状态的缺点,在防火墙的核心部分建立状态连接表,维护了连接,将进出网络的数据当成一个个的事件 来处理。可以这样说,状态检测包过滤防火墙规范了网络层和传输层行为,而应用代理型防火墙则是规范 了特定的应用协议上的行为。(图 3) 4)复合型防火墙 复合型防火墙是指综合了状态检测与透明代理的新一代的防火墙,进一步基于 ASIC 架构,把防病毒、内 容过滤整合到防火墙里,其中还包括 VPN、IDS 功能,多单元融为一体,是一种新突破。常规的防火墙并 不能防止隐蔽在网络流量里的攻击,在网络界面对应用层扫描,把防病毒、内容过滤与防火墙结合起来, 这体现了网络与信息安全的新思路。它在网络边界实施 OSI 第七层的内容扫描,实现了实时在网络边缘布 署病毒防护、内容过滤等应用层服务措施。(图 4) 3、四类防火墙的对比 包过滤防火墙:包过滤防火墙不检查数据区,包过滤防火墙不建立连接状态表,前后报文无关,应用层控 制很弱。 应用网关防火墙:不检查 IP、TCP 报头,不建立连接状态表,网络层保护比较弱。 状态检测防火墙:不检查数据区,建立连接状态表,前后报文相关,应用层控制很弱。 复合型防火墙:可以检查整个数据包内容,根据需要建立连接状态表,网络层保护强,应用层控制细,会 话控制较弱。 4、防火墙术语 网关:在两个设备之间提供转发服务的系统。网关是互联网应用程序在两台主机之间处理流量的防火墙。 这个术语是非常常见的。 DMZ 非军事化区:为了配置管理方便,内部网中需要向外提供服务的服务器往往放在一个单独的网段,这 个网段便是非军事化区。防火墙一般配备三块网卡,在配置时一般分别分别连接内部网,internet 和 DMZ。 吞吐量:网络中的数据是由一个个数据包组成,防火墙对每个数据包的处理要耗费资源。吞吐量是指在不 丢包的情况下单位时间内通过防火墙的数据包数量。这是测量防火墙性能的重要指标。 最大连接数:和吞吐量一样,数字越大越好。但是最大连接数更贴近实际网络情况,网络中大多数连接是 指所建立的一个虚拟通道。防火墙对每个连接的处理也好耗费资源,因此最大连接数成为考验防火墙这方 面能力的指标。 数据包转发率:是指在所有安全规则配置正确的情况下,防火墙对数据流量的处理速度。 SSL:SSL(Secure Sockets Layer)是由 Netscape 公司开发的一套 Internet 数据安全协议,当前版本为 3.0。它已被广泛地用于 Web 浏览器与服务器之间的身份认证和加密数据传输。SSL 协议位于 TCP/IP 协 议与各种应用层协议之间,为数据通讯提供安全支持。 网络地址转换:网络地址转换(NAT)是一种将一个 IP 地址域映射到另一个 IP 地址域技术,从而为终端 主机提供透明路由。NAT 包括静态网络地址转换、动态网络地址转换、网络地址及端口转换、动态网络地 址及端口转换、端口映射等。NAT 常用于私有地址域与公用地址域的转换以解决 IP 地址匮乏问题。在防 火墙上实现 NAT 后,可以隐藏受保护网络的内部拓扑结构,在一定程度上提高网络的安全性。如果反向 NAT 提供动态网络地址及端口转换功能,还可以实现负载均衡等功能。 堡垒主机:一种被强化的可以防御进攻的计算机,被暴露于因特网之上,作为进入内部网络的一个检查点, 以达到把整个网络的安全问题集中在某个主机上解决,从而省时省力,不用考虑其它主机的安全的目的。 二、防火墙的外观及内部构造 (一) (二) 注:第一幅与第二幅并无关系。 三、防火墙的基本配置 下面我以国内防火墙第一品牌天融信 NGFW 4000 为例给各位讲解一下在一个典型的网络环境中应该如何 来配置防火墙。 图 5:网络拓扑结构 GFW4000 有 3 个标准端口,其中一个接外网(Internet 网),一个接内网,一个接 DMZ 区,在 DMZ 区 中有网络服务器。安装防火墙所要达到的效果是:内网区的电脑可以任意访问外网,可以访问 DMZ 中指 定的网络服务器, Internet 网和 DMZ 的电脑不能访问内网;Internet 网可以访问 DMZ 中的服务器。 1、配置管理端口 天融信网络卫士 NGFW4000 防火墙是由防火墙和管理器组成的,管理防火墙都是通过网络中的一台电脑 来实现的。防火墙默认情况下,3 个口都不是管理端口,所以我们先要通过串口把天融信网络卫士 NGFW4000 防火墙与我们的电脑连接起来,给防火墙指定一个管理端口,以后对防火墙的设置就可以通过 远程来实现了。 使用一条串口线把电脑的串口(COM1)与 NGFW4000 防火墙的 console 口连接起来,启动电脑的"超级 终端",端口选择 COM1,通信参数设置为每秒位数 9600,数据位 8,奇偶校验无,停止位 1,数据流控制 无。进入超级终端的界面,输入防火墙的密码进入命令行格式。 定义管理口:if eth1 XXX.XXX.XXX.XXX 255.255.255.0 修改管理口的 GUI 登录权限: fire client add topsec -t gui -a 外网 -i 0.0.0.0-255.255.255.255 2、使用 GUI 管理软件配置防火墙 安装天融信防火墙 GUI 管理软件"TOPSEC 集中管理器",并建立 NGFW4000 管理项目,输入防火墙管理 端口的 IP 地址与说明。然后登录进入管理界面。 (1)定义网络区域 Internet(外网):接在 eth0 上,缺省访问策略为 any(即缺省可读、可写),日志选项为空,禁止 ping、 GUI、telnet。 Intranet(内网):接在 eth1 上,缺省访问策略为 none(不可读、不可写),日志选项为记录用户命令, 允许 ping、GUI、telnet。 DMZ 区:接在 eth2 上, 缺省访问策略为 none(不可读、不可写),日志选项为记录用户命令,禁止 ping、 GUI、telnet。 (2)定义网络对象 一个网络节点表示某个区域中的一台物理机器。它可以作为访问策略中的源和目的,也可以作为通信策略 中的源和目的。网络节点同时可以作为地址映射的地址池使用,表示地址映射的实际机器,详细描述见通 信策略。 图 6 子网表示一段连续的 IP 地址。可以作为策略的源或目的,还可以作为 NAT 的地址池使用。如果子网段中 有已经被其他部门使用的 IP,为了避免使用三个子网来描述技术部使用的 IP 地址,可以将这两个被其他部 门占用的地址在例外地址中说明。 图 7 为了配置访问策略,先定义特殊的节点与子网: FTP_SERVER:代表 FTP 服务器,区域=DMZ,IP 地址= XXX.XXX.XXX.XXX。 HTTP_SERVER:代表 HTTP 服务器,区域=DMZ,IP 地址= XXX.XXX.XXX.XXX。 MAIL_SERVER:代表邮件服务器,区域=DMZ,IP 地址= XXX.XXX.XXX.XXX。 V_SERVER:代表外网访问的虚拟服务器,区域=Internet,IP=防火墙 IP 地址。 inside:表示内网上的所有机器,区域=Intranet,起始地址=0.0.0.0,结束地址=255.255.255.255。 outside:表示外网上的所有机器,区域=Internet,起始地址=0.0.0.0,结束地址=255.255.255.255。 (3)配置访问策略 在 DMZ 区域中增加三条访问策略: A、访问目的=FTP_SERVER,目的端口=TCP 21。源=inside,访问权限=读、写。源=outside,访问权限 =读。这条配置表示内网的用户可以读、写 FTP 服务器上的文件,而外网的用户只能读文件,不能写文件。 B、访问目的=HTTP_SERVER,目的端口=TCP 80。源=inside+outside,访问权限=读、写。这条配置表 示内网、外网的用户都可以访问 HTTP 服务器。 C、访问目的=MAIL_SERVER,目的端口=TCP 25,TCP 110。源=inside+outside,访问权限=读、写。 这条配置表示内网、外网的用户都可以访问 MAIL 服务器。 (4)通信策略 由于内网的机器没有合法的 IP 地址,它们访问外网需要进行地址转换。当内部机器访问外部机器时,可以 将其地址转换为防火墙的地址,也可以转换成某个地址池中的地址。增加一条通信策略,目的=outside, 源=inside,方式= NAT,目的端口=所有端口。如果需要转换成某个地址池中的地址,则必须先在 Internet 中定义一个子网,地址范围就是地址池的范围,然后在通信策略中选择 NAT 方式,在地址池类型中选择刚 才定义的地址池。 服务器也没有合法的 IP 地址,必须依靠防火墙做地址映射来提供对外服务。增加通信策略。 A、目的=V_SERVER,源=outside,通信方式=MAP,指定协议=TCP,端口映射 21->21,目标机器 =FTP_SERVER。 B、目的=V_SERVER,源=outside,通信方式=MAP,指定协议=TCP,端口映射 80->80,目标机器 =HTTP_SERVER。 C、目的=V_SERVER,源=outside,通信方式=MAP,指定协议=TCP,端口映射 25->25,目标机器 =MAIL_SERVER。 D、目的=V_SERVER,源=outside,通信方式=MAP,指定协议=TCP,端口映射 110->110,目标机器 =MAIL_SERVER。 (5)特殊端口 在防火墙默认的端口定义中没有我们所要用到的特殊端口,就需要我们手工的添加这些特殊端口了。在防 火墙集中管理器中选择"高级管理">"特殊对象">"特殊端口",将弹出特殊端口的定义界面,点"定义新对象", 输入特殊端口号与定义区域即可。 (6)其他配置 最后进入"工具"选项,定义防火墙的管理员、权限以及与 IDS 的联动等。(图 8) Iptables 设置 对于 Internet 上的系统,不管是什么情况都要明确一点:网络是不安全的。因此,虽然 创建一个防火墙并不能保证系统 100%安全,但却是绝对必要的。 Linux 提供了一个非常优 秀的防火墙工具 netfilter/iptables。它完全免费、功能强大、使用灵活、可以对流入和流出的 信息进行细化控制,且可以在一台低配置机器上很好地运行。本文将简单介绍使用 netfilter/iptables 实现防火墙架设和 Internet 连接共享等应用。 netfilter/iptabels 应用程序,被认为是 Linux 中实现包过滤功能的第四代应用程序。 netfilter/iptables 包含在 2.4 以后的内核中,它可以实现防火墙、NAT(网络地址翻译)和数 据包的分割等功能。 netfilter 工作在内核内部,而 iptables 则是让用户定义规则集的表结构。 netfilter/iptables 从 ipchains 和 ipwadfm(IP 防火墙管理)演化而来,功能更加强大。下文将 netfilter/iptabels 统一称为 iptables。可以用 iptables 为 Unix、Linux 和 BSD 个人工作站创建 一个防火墙,也可以为一个子网创建防火墙以保护其它的系统平台。iptales 只读取数据包头, 不会给信息流增加负担,也无需进行验证。要想获得更好的安全性,可以将其 和一个代理 服务器(比如 squid)相结合。 基本概念 典型的防火墙设置有两个网卡:一个流入,一个流出。iptables 读取流入和流出数据包 的报头,将它们与规则集(Ruleset)相比较,将可接受的数据包从一个网卡转发至另一个网 卡,对被拒绝的数据包,可以丢弃或按照所定义的方式来处理。通过向防火墙提供有关对来 自某个源地址、到某个目的地或具有特定协议类型的信息包要做 些什么的指令,规则控制 信息包的过滤。通过使用 iptables 系统提供的特殊命令 iptables 建立这些规则,并将其添加 到内核空间特定信息包过滤表 内的链中。关于添加、去除、编辑规则的命令,一般语法如 下: iptables [-t table] command [match] [target] 1.表(table) [-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和 链的信息包过滤表。有三个可用的表选项:filter、 nat 和 mangle。该选项不是必需的,如 果未指定,则 filter 作为缺省表。各表实现的功能如表 1 所示。 表 1 三种表实现的功能 2.命令(command) command 部分是 iptables 命令最重要的部分。它告诉 iptables 命令要做什么,例如插入 规则、将规则添加到链的末尾或删除规则。表 2 是最常用的一些命令及例子。 表 2 命令的功能和样例 3.匹配(match) iptables 命令的可选 match 部分指定信息包与规则匹配所应具有的特征(如源地址、目 的地址、协议等)。匹配分为通用匹配和特定于协议的匹配两大类。这里将介绍可用于采用 任何协议的信息包的通用匹配。表 3 是一些重要且常用的通用匹配及示例说明。 表 3 通用匹配及示例说明 4.目标(target) 目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定 义的目标之外,还有许多可用的目标选项。表 4 是常用的一些目标及示例说明。 除表 4 外,还有许多用于建立高级规则的其它目标,如 LOG、REDIRECT、MARK、MIRROR 和 MASQUERADE 等。 表 4 目标及示例说明 应用 iptables 与 ipchains 和 ipfwadm 不同的是,iptables 可以配置有状态的防火 墙。 iptables 可以检测到源地址和目的地址、源端口和目的端口及流入数据包的顺序,即 iptables 记住了在现有连接中,哪些数据包已经被允许接 收。这使得暂时性的端口只有在需要时才 会被打开,并且会拒绝所有永久性占用端口的请求,大大地加强了安全性。同时,那些被更 改了报头的数据包,即使包含有 一个被允许的目的地址和端口,也会被检测到并被丢弃。 此外,有状态的防火墙能够指定并记住为发送或接收信息包所建立连接的状态。防火墙可以 从信息包的连接 跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状 态信息可以增加其效率和速度。 1.启动和停止 iptables 下面将正式使用 iptables 来创建防火墙。启动和停止 iptables 的方法取决于所使用的 Linux 发行版,可以先查看所使用 Linux 版本的文档。 一般情况下,iptables 已经包含在 Linux 发行版中,运行 iptables --version 来查看系统是否安 装了 iptables。在 Red Hat 9.0 中,安装的版本是 iptables v1.2.7a。如果系统没有安装 iptables, 则可以从 http://www.netfilter.org 下载。 2.查看规则集 上面仅对 iptables 的用法做了一个简单介绍,使用中可以运行 man iptables 来查看所有 命令和选项的完整介绍,或者运行 iptables -help 来查看一个快速帮助。要查看系统中现有的 iptables 规划集,可以运行以下命令: iptables --list 下面是没有定义规划时 iptables 的样子: 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 如上例所示,每一个数据包都要通过三个内建的链(INPUT、OUTPUT 和 FORWARD)中 的一个。 filter 是最常用的表,在 filter 表中最常用的三个目标是 ACCEPT、DROP 和 REJECT。DROP 会丢弃数据包,不再对其进行任何处理。REJECT 会把出错信息传送至发送数据包的主机。 图 1 Red Hat 9.0 中安全设置的 GUI 工具 在 Red Hat 9.0 中,提供一个 GUI 程序来让用户对系统的安装级别进行简单的配置。该 工具的启动方法是:主选单→系统设置→安全工具(如图 1 所示)。在此将安全级别 设为“高 级”,并选择使用默认的防火墙规则。点击确定后,再用 iptables -list 显示,发现 iptables 与 没有定义规则前已经有很大不同,如下所示: [root@workstation root]# iptables --list Chain INPUT (policy ACCEPT) target prot opt source destination RH-Lokkit-0-50-INPUT all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination RH-Lokkit-0-50-INPUT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ...... 现实中一般不使用这个 GUI 工具,因为它的功能有限,也不够透明。相比较而言,SuSE 9.0 中相应的配置工具要好得多,它可以在 GUI 下对防火墙进行更加细化的配置(比如增加 了 IP 转发和伪装等功能的配置)。尽管这样,一般还是自己来增加和删除规则。 图 2 SuSE 9.0 中 YaST 配置工具中的防火墙设置 .增加规则 本例中的规则将会阻止来自某一特定 IP 范围内的数据包,因为该 IP 地址范围被管理员怀疑 有大量恶意攻击者在活动: # iptables -t filter -A INPUT -s 123.456.789.0/24 -j DROP 也可以很轻易地阻止所有流向攻击者 IP 地址的数据包,该命令稍有不同 # iptables -t filter -A OUTPUT -d 123.456.789.0/24 -j DROP 注意这里的 A 选项,如前所述,使用它说明是给现有的链添加规则。 4.删除规则 网络上的恶意攻击者总是在变化的,因此需要不断改变 IP。假设一个网上攻击者转移到 新的 IP 地址,而其老的 IP 地址被分配给一些清白的用户,那么这时这些用户的数据包将无 法通过你的网络。这种情况下,可以使用带-D 选项的命令来删除现有的规则: # iptables -t filter -D OUTPUT -d 123.456.789.0/24 -j DROP 5.缺省的策略 创建一个具有很好灵活性、可以抵御各种意外事件的规则需要大量的时间。对于那些没有 时间这样做的人,最基本的原则是“先拒绝所有的 数据包,然后再允许需要的”。下面来为每一个链设置缺省的规则: # iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -P OUTPUT ACCEPT 这里选项-P 用于设置链的策略,只有三个内建的链才有策略。这些策略可以让信息毫无限 制地流出,但不允许信息流入。很多时候需要接收外部信息,则可使用以下命令: # iptables -t filter -A INPUT -s 123.456.789.0/24 -j ACCEPT 6.SYN 的使用 不能关闭所有端口,也不能只指定某些端口处于打开状态,那么怎样才能设置一个有效 的规则,既可以允许普通用户正常通过,又可以阻止恶意攻击者访问网络呢?刚开始使用 iptables 的人可以充分利用 syn 标识来阻止那些未经授权的访问。 iptables 只检测数据包的 报头,事实上,除 iptables 以外,很多其它有用的数据包分析都是基于报头的。比如,在进 行 Web 冲浪时,一个请求从 你的 PC 发送至其它地方的 Web 服务器上,该服务器会响应请 求并发回一个数据包,同时得到你系统上的一个临时端口。与响应请求不同的是,服务器并 不关心所 传送的内容。可以利用这种特点来设置规则,让它阻止所有没有经过你系统授权 的 TCP 连接: # iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP 这里的-i 指的是网卡,-p 则是指协议,--syn 则表示带有 syn 标识设置的 TCP 数据包。 SYN 用于初始化一个 TCP 连接,如果自己机器上没有运行任何服务器,别人也就不会向你 发送 SYN 数据包。 7.有状态的数据包的检测 前边的例子把每一个数据包看成是独立的,而不是相互关联的,依靠的是数据包的头信 息。 iptables 会检查数据包的源和目的 IP 地址、源和目的端口、流入数据包的顺序号、TCP 先后顺序的信息及头标记(SYN、ACK、FIN、RST 等)的状态,即它会跟踪整个连接会 话,从而使整个过滤过程是相互关联的。 8.共享一个 Internet 连接 网络地址翻译和 IP 伪装都可以实现多台主机共享一个 Internet 连接,这个局域网 可以 是 Linux 和 Windows 系统组成的多系统局域网。假设现在有一台机器,配有两个网卡,其 中 eth0 为“公共”网卡,eth1 为“私有”网卡,即 eth0 被分配了一个静态的、可路由的 IP 地址, 而 eth1 被分配了一个私有的、不能路由的 IP,该 IP 是属于该局域网子网的。要实现上述功 能,需要向 nat 和 filter 表中添加一些链: # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT 这显示了有状态的数据包检测的价值。请注意,这里是如何实现流入数据包只有在属于一个 已经存在的连接时才被允许,而所有来自局域网内流向外的数据包则都允许通过。第一条规 则让所有流出的信息看起来都是来自防火墙机器的,而并不会显示出防火墙后面还有一个局 域网。 下面的命令为 FORWARD 和 POSTROUTING 链设置缺省的策略,在使用伪装时,有一个缺 省的 POSTROUTING DROP 策略非常重要,否则就可能有心怀恶意的用户突破网关后伪装 自己的身份。 # iptables -t filter -P FORWARD DROP # iptables -t nat -P POSTROUTING DROP 下面的命令为拨号连接设置,它可以动态地分配 IP 地址 # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 9.运行服务器时的情况 有时也会把服务器放置在防火墙后面,这时 iptables 就需要知道从哪儿通过数据包,设置如 下所示: # iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.10:80 # iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 25 -j DNAT -to 192.168.0.11:25 10.规则的保存 到现在为止,所有的例子都是在命令行中进行的。在测试新的规则时,这是一种很好的 方式,但一旦测试结果令人满意,就可以将它们保存为脚本。可以使用 iptables-save 命令 来实现: $ iptables-save > iptables-script 信息包过滤表中的所有规则都被保存在文件 iptables-script 中。无论何时再次引导系统,都 可以使用 iptables-restore 命令将规则集从该脚本文件恢复到信息包过滤表。恢复命令如下所 示: $ iptables-restore iptables-script 如果愿意在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个 初始化 Shell 脚本中。 下面的例子并不是一个完整的脚本,它只是描述了如何使用变量及提供了一些附加的规则样 例。 #!/bin/sh #为变量赋值 IPTABLES=/sbin/iptables LAN_NET="192.168.1.0/24" IFACE= "eth0" LO_IFACE="lo" LO_IP="127.0.0.1" #加载所需的内核 /sbin/modprobe ip_conntrack /sbin/modprobe iptable_nat #缺省情况下,IP 转发都处于不可用状态,将其设置为可用状态: echo 1 > /proc/sys/net/ipv4/ip_forward #使 IP 的动态分配功能可用 echo 1> /proc/sys/net/ipv4/ip_dynaddr #每次重启这个脚本时,最好清除以前所设的规则 $IPTABLES -P INPUT DROP $IPTABLES -F INPUT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -F OUTPUT $IPTABLES -P FORWARD DROP $IPTABLES -F FORWARD $IPTABLES -F -t nat #只允许在 LAN 中使用 SSH 连接 $IPTABLES -A INPUT -s LAN_NET -p tcp --destination-port ssh -j ACCEPT #允许 loopback! $IPTABLES -A INPUT -i lo -p all -j ACCEPT $IPTABLES -A OUTPUT -o lo -p all -j ACCEPT #丢弃那些流入的宣称是来自本地机器的数据包 #丢弃那些流出的不是出自本地机的数据包 $IPTABLES -A INPUT -i $IFACE -s $LAN_NET -j DROP $IPTABLES -A OUTPUT -o $IFACE -s ! $LAN_NET -j DROP #限制一些流出的信息 $IPTABLES -A OUTPUT -o eth0 -p tcp -dport 31337 -j DROP $IPTABLES -A OUTPUT -o eth0 -p tcp -sport 31337 -j DROP #此外,31335、27444、27665、20034 NetBus、9704、137-139(smb)端口也应被禁止 linux--iptables 配置 代理服务器与防火墙 一,基本概念 应用层代理(http ftp) 作用:带动局域网的主机访问外网 提高访问效率 可以进行访问控制 原理:在 TCP/IP 应用层工作 网络层防火墙 功能:对进入和流出的 ip 数据包进行过滤,屏蔽不符合的数据包.保证内部网络安全. 提供数据包路由选择 实现网络地址转换 类型:硬件:国外:cisco netScreen 国内:联想、天融信 软件:以 linux 为主的 iptables 原理:网络防火墙工作在 TCP/ip 网络层 二、iptables 1、发展: 2.0 内核 ipfwadm 2.2 内核 ipchains 2.4 内核后 iptables 2、实现 iptables 是管理 netfilter 的一种工具 3、表和链 filter 设置包过滤 INPUT OUTPUT FORWORD nat 地址转换 PREROUTING POSTROUTING OUTPUT mangle 矫正表 INPUT OUTPUT FORWORD PREROUTING POSTROUTING 4、配置 iptables rpm -qa | grep iptables 配置文件 /etc/sysconfig/iptables-config 策略文件 /etc/sysconfig/iptables #echo “1” > /proc/sys/net/ipv4/ip_forward 启用 linux 路由功能 5、#iptables [-t 表] [-命令] [链名] [匹配规则] [-j 动作] [-t 表] 表可以是: filter nat mangle 如果这项省略,默认是 filter 表 [-命令 链] 命令可以是: -A 添加规则 -D 删除规则 -R 替换规则 -I 插入规则(可以指定位置) -L 显示规则 -F 删除所有规则 -Z 清空规则链上的包字节数 -N 自定义新链 -X 删除自定义的链 -P 设置默认规则 -E 对链重命名 [匹配规则] 基本规则 -p [!] 匹配协议 tcp udp icmp all -s [!] 匹配源 IP 地址 -d [!] 匹配目的 IP 地址 -i [!] 匹配数据入站接口名 -o [!] 匹配数据出站接口名 扩展规则 --sport 匹配源端口 --dport 匹配目标端口 --tcp-flags [!] mask comp 匹配 TCP 标志位,标志位有:SYN,ACK,FIN,RST,URG,PSH, --icmp-type [!] 匹配 ICMP 协议数据类型 --mac-source [!] 匹配源 MAC 地址 [-j 动作] 动作可以是: ACCEPT 允许包通过 DROP 丢弃数据包 REJECT 丢弃数据包,返回错误消息 SNAT 转换数据包源 IP 地址 DNAT 转换数据包目地 IP 地址 MASQUERADE 转换数据包的源 IP 地址(用于拔号连接,每次拔号获得不同的 IP 地址时) REDIRECT 转换数据包的目的 IP 地址为自身 IP 地址 6、 配置成网关 #iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o pppo -j MASQUERADE 三、squid 1、功能 提供 httpd ftp 代理 缓存代理,加快速度 对客户端地址进行访问控制 2、配置 rpm -qa | grep squid /etc/squid/squid.conf 53,480,695,1837 行修改 squid -z service squid restart 3、透明代理 修改 squid.conf 配置文件中的设置 # vi /etc/squid/squid.conf //在配置文件中添加以下的配置行 httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on //重新启动 squid 服务器 # service squid restart //设置防火墙策略 # iptables -t nat -A PREROUTING -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to-p orts 3128 #echo "1" > /proc/sys/net/ipv4/ip_forward #iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to 10.100.100.25 案例一 环境:rhel4 启用 ftp 、www、telnet 服务,用 iptables 搭建防火墙来对用户的访问进行控制。 xp-----------rhel4 (WEB、FTP、TELNET) #!/bin/bash #ip.sh #############################Clear firewall rule############################# iptables -F iptables -X iptables -Z iptables -t nat -F iptables -t nat -X iptables -t nat -Z ################################Default policy################################ iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP ################################Iptables rule ############################### iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A INPUT -p tcp -s 192.168.0.0/24 -d 192.168.0.200 --dport 21 -j ACCEPT iptables -t filter -A INPUT -p tcp -s 192.168.0.0/24 -d 192.168.0.200 --dport 20 -j ACCEPT iptables -t filter -A INPUT -p tcp -s 192.168.0.0/24 -d 192.168.0.200 --dport 23 -j DROP iptables -t filter -A INPUT -p tcp -s 192.168.0.210 -d 192.168.0.200 --dport www -j ACCEPT iptables -t filter -A OUTPUT -p tcp -s 192.168.0.200 --sport 21 -d 192.168.0.0/24 --dport 1024: -j ACCEPT //1024: 大于 1024 iptables -t filter -A OUTPUT -p tcp -s 192.168.0.200 --sport 20 -d 192.168.0.0/24 --dport 1024: -j ACCEPT iptables -t filter -A OUTPUT -p tcp -s 192.168.0.200 --sport 80 -d 192.168.0.0/24 --dport 1024: -j ACCEPT iptables -t filter -A OUTPUT -p tcp -s 192.168.0.200 --sport 23 -d 192.168.0.210 --dport 1024: -j REJECT # iptables -t filter -A OUTPUT -p tcp -j ACCEPT iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT iptables -t filter -A INPUT -p icmp --icmp-type 3 -j ACCEPT iptables -t filter -A INPUT -p icmp --icmp-type 8 -j ACCEPT iptables -t filter -A INPUT -p icmp --icmp-type 11 -j ACCEPT iptables -t filter -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT iptables -t filter -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT iptables -t filter -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT iptables -t filter -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT 注释: icmp 类型: echo-reply 0 // icmp 应答 echo-request 8 //icmp 请求 time-exceeded 11 //超时 destination-unreachable 3 //地址不可到达 案例二: 环境:一台 linux 9 启用 web 服务,linux el4 作为专业防火墙提供服务 ,xp 作为客户端进行访问。 xp------------------(eth0)linux EL4 (eth1)---------------linux 9 (启用 web 服务) 192.168.1.0/24 10.10.10.0/24 echo "1" > /proc/sys/net/ipv4/ip_forward //启用 linux 路由转发。 #!/bin/bash #ip.sh IPT=/sbin/iptables #######################Clear rules################### $IPT -t filter -F $IPT -t filter -X $IPT -t filter -Z $IPT -t nat -F $IPT -t nat -X $IPT -t nat -Z #######################Default rules################## $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP #######################User rules##################### $IPT -t filter -A INPUT -i lo -j ACCEPT //接受对 127.0.0.1 的数据 $IPT -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT $IPT -t filter -A INPUT -p icmp --icmp-type 3 -j ACCEPT $IPT -t filter -A INPUT -p icmp --icmp-type 8 -j ACCEPT $IPT -t filter -A OUTPUT -j ACCEPT $IPT -t filter -A FORWARD -p tcp -s 192.168.1.0/24 -d 10.10.10.248 --dport 80 -i eth0 -o eth1 - j ACCEPT $IPT -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT $IPT -t filter -A FORWARD -p icmp --icmp-type 0 -j ACCEPT $IPT -t filter -A FORWARD -p icmp --icmp-type 3 -j ACCEPT $IPT -t filter -A FORWARD -p icmp --icmp-type 8 -j ACCEPT $IPT -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 10.10.10.100 //启 用 SNAT (源地址转换) linux 下 IPTABLES 配置详解 一、我们来配置一个 filter 表的防火墙. (1)查看本机关于 IPTABLES 的设置情况 [root@tp ~]# 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 Chain RH-Firewall-1-INPUT (0 references) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255 ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0 ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 可以看出我在安装 linux 时,选择了有防火墙,并且开放了 22,80,25 端口. 如果你在安装 linux 时没有选择启动防火墙,是这样的 [root@tp ~]# 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 什么规则都没有. (2)清除原有规则. 不管你在安装 linux 时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现 在 filter 的所有规则. [root@tp ~]# iptables -F 清除预设表 filter 中的所有规则链的规则 [root@tp ~]# iptables -X 清除预设表 filter 中使用者自定链中的规则 我们在来看一下 [root@tp ~]# 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 什么都没有了吧,和我们在安装 linux 时没有启动防火墙是一样的.(提前说一句,这些配置 就像用命令配置 IP 一样,重起就会失去作用),怎么保存. [root@tp ~]# /etc/rc.d/init.d/iptables save 这样就可以写到/etc/sysconfig/iptables 文件里了.写入后记得把防火墙重起一下,才能起 作用. [root@tp ~]# service iptables restart 现在 IPTABLES 配置表里什么配置都没有了,那我们开始我们的配置吧 (3)设定预设规则 [root@tp ~]# iptables -P INPUT DROP [root@tp ~]# iptables -P OUTPUT ACCEPT [root@tp ~]# iptables -P FORWARD DROP 上面的意思是,当超出了 IPTABLES 里 filter 表里的两个链规则(INPUT,FORWARD)时,不 在这两个规则里的数据包怎么处理呢,那就是 DROP(放弃).应该说这样配置是很安全的. 我们要控制流入数据包 而对于 OUTPUT 链,也就是流出的包我们不用做太多限制,而是采取 ACCEPT,也就是说, 不在着个规则里的包怎么办呢,那就是通过. 可以看出 INPUT,FORWARD 两个链采用的是允许什么包通过,而 OUTPUT 链采用的是 不允许什么包通过. 这样设置还是挺合理的,当然你也可以三个链都 DROP,但这样做我认为是没有必要的,而 且要写的规则就会增加.但如果你只想要有限的几个规则是,如只做 WEB 服务器.还是推 荐三个链都是 DROP. 注:如果你是远程 SSH 登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没 有设置任何规则. 怎么办,去本机操作呗! (4)添加规则. 首先添加 INPUT 链,INPUT 链的默认规则是 DROP,所以我们就写需要 ACCETP(通过)的 链 为了能采用远程 SSH 登陆,我们要开启 22 端口. [root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT [root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:这个规则,如果你把 OUTPUT 设置成 DROP 的就要写上这一部,好多人都是望了写这一部规则导致,始终无 法 SSH.在远程一下,是不是好了. 其他的端口也一样,如果开启了 web 服务器,OUTPUT 设置成 DROP 的话,同样也要添加 一条链: [root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.) 如果做了 WEB 服务器,开启 80 端口. [root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT 如果做了邮件服务器,开启 25,110 端口. [root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT [root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT 如果做了 FTP 服务器,开启 21 端口 [root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT [root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT 如果做了 DNS 服务器,开启 53 端口 [root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT 如果你还做了其他的服务器,需要开启哪个端口,照写就行了. 上面主要写的都是 INPUT 链,凡是不在上面的规则里的,都 DROP 允许 icmp 包通过,也就是允许 ping, [root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT 设置成 DROP 的话) [root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT 设置成 DROP 的话) 允许 loopback!(不然会导致 DNS 无法正常关闭等问题) IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是 INPUT DROP) IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是 OUTPUT DROP) 下面写 OUTPUT 链,OUTPUT 链默认规则是 ACCEPT,所以我们就写需要 DROP(放弃) 的链. 减少不安全的端口连接 [root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP [root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP 有些些特洛伊木马会扫描端口 31337 到 31340(即黑客语言中的 elite 端口)上的服务。 既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络 上可能被感染的机器和它们的远程主服务器进行独立通信的机会 还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139 (smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关 资料. 当然出入更安全的考虑你也可以包 OUTPUT 链设置成 DROP,那你添加的规则就多一些, 就像上边添加 允许 SSH 登陆一样.照着写就行了. 下面写一下更加细致的规则,就是限制到某台机器 如:我们只允许 192.168.0.3 的机器进行 SSH 连接 [root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT 如果要允许,或限制一段 IP 地址可用 192.168.0.0/24 表示 192.168.0.1-255 端的所有 IP. 24 表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了. -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆. 或采用命令方式: [root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT 然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那 就要保存.写入到/etc/sysconfig/iptables 文件里. [root@tp ~]# /etc/rc.d/init.d/iptables save 这样写 !192.168.0.3 表示除了 192.168.0.3 的 ip 地址 其他的规则连接也一样这么设置. 在下面就是 FORWARD 链,FORWARD 链的默认规则是 DROP,所以我们就写需要 ACCETP(通过)的链,对正在转发链的监控. 开启转发功能,(在做 NAT 时,FORWARD 默认规则是 DROP 时,必须做) [root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT [root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 丢弃坏的 TCP 包 [root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP 处理 IP 碎片数量,防止攻击,允许每秒 100 个 [root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT 设置 ICMP 包过滤,允许每秒 1 个包,限制触发条件是 10 个包. [root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT 我在前面只所以允许 ICMP 包通过,就是因为我在这里有限制. 二,配置一个 NAT 表放火墙 1,查看本机关于 NAT 的设置情况 [root@tp rc.d]# iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.0.0/24 anywhere to:211.101.46.235 Chain OUTPUT (policy ACCEPT) target prot opt source destination 我的 NAT 已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).关 于怎么配置 NAT,参考我的另一篇文章 当然你如果还没有配置 NAT 的话,你也不用清除规则,因为 NAT 在默认情况下是什么都 没有的 如果你想清除,命令是 [root@tp ~]# iptables -F -t nat [root@tp ~]# iptables -X -t nat [root@tp ~]# iptables -Z -t nat 2,添加规则 添加基本的 NAT 地址转换,(关于如何配置 NAT 可以看我的另一篇文章), 添加规则,我们只添加 DROP 链.因为默认链全是 ACCEPT. 防止外网用内网 IP 欺骗 [root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP [root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP [root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP 如果我们想,比如阻止 MSN,QQ,BT 等的话,需要找到它们所用的端口或者 IP,(个人认为 没有太大必要) 例: 禁止与 211.101.46.253 的所有连接 [root@tp ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP 禁用 FTP(21)端口 [root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP 这样写范围太大了,我们可以更精确的定义. [root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP 这样只禁用 211.101.46.253 地址的 FTP 连接,其他连接还可以.如 web(80 端口)连接. 按照我写的,你只要找到 QQ,MSN 等其他软件的 IP 地址,和端口,以及基于什么协议,只要 照着写就行了. 最后: drop 非法连接 [root@tp ~]# iptables -A INPUT -m state --state INVALID -j DROP [root@tp ~]# iptables -A OUTPUT -m state --state INVALID -j DROP [root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP 允许所有已经建立的和相关的连接 [root@tp ~]# iptables-A INPUT -m state - INPUT -p tcp --dport 25 -j ACCEPT 如果做了 FTP 服务器,开启 21 端口 [root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT [root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT 如果做了 DNS 服务器,开启 53 端口 [root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT 如果你还做了其他的服务器,需要开启哪个端口,照写就行了. 上面主要写的都是 INPUT 链,凡是不在上面的规则里的,都 DROP 允许 icmp 包通过,也就是允许 ping, [root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT 设置成 DROP 的话) [root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT 设置成 DROP 的话) 允许 loopback!(不然会导致 DNS 无法正常关闭等问题) IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是 INPUT DROP) IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是 OUTPUT DROP) 下面写 OUTPUT 链,OUTPUT 链默认规则是 ACCEPT,所以我们就写需要 DROP(放弃) 的链. 减少不安全的端口连接 [root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP [root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP 有些些特洛伊木马会扫描端口 31337 到 31340(即黑客语言中的 elite 端口)上的服务。 既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络 上可能被感染的机器和它们的远程主服务器进行独立通信的机会 还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139 (smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关 资料. 当然出入更安全的考虑你也可以包 OUTPUT 链设置成 DROP,那你添加的规则就多一些, 就像上边添加 允许 SSH 登陆一样.照着写就行了. 下面写一下更加细致的规则,就是限制到某台机器 如:我们只允许 192.168.0.3 的机器进行 SSH 连接 [root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT 如果要允许,或限制一段 IP 地址可用 192.168.0.0/24 表示 192.168.0.1-255 端的所有 IP. 24 表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了. -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆. 或采用命令方式: [root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT 然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那 就要保存.写入到/etc/sysconfig/iptables 文件里. [root@tp ~]# /etc/rc.d/init.d/iptables save 这样写 !192.168.0.3 表示除了 192.168.0.3 的 ip 地址 其他的规则连接也一样这么设置. 在下面就是 FORWARD 链,FORWARD 链的默认规则是 DROP,所以我们就写需要 ACCETP(通过)的链,对正在转发链的监控. 开启转发功能,(在做 NAT 时,FORWARD 默认规则是 DROP 时,必须做) [root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT [root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 丢弃坏的 TCP 包 [root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP 处理 IP 碎片数量,防止攻击,允许每秒 100 个 [root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT 设置 ICMP 包过滤,允许每秒 1 个包,限制触发条件是 10 个包. [root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT 我在前面只所以允许 ICMP 包通过,就是因为我在这里有限制. linux 下的防火墙的设置 2008-04-12 21:51 本文章从 chinaitlab 上转载: 防火墙的配置要求如下: 1、 拒绝所有外面传入的、向外的和转发的包。 2、 允许所有外传的 TCP 连接:我们这里允许的如 web/telnet/ssh/ftp 等外传。 3、 允许外发的 TCP 连接的返回封包通过防火墙,需检查封包的状态。 4、 允许向外发送 UDP 连接在端口 53 上指定域名服务器,但只允许伟入的 DNS 封包进入内 部的域名服务器 chivas。 5、 创建允许内核从一个网络接口向另一个网络接口适当转发封包的规则:来自专网的向因 特网传递的封包需从内部接口 eth0 向外部接口 eth1 转发。返回的封包以相反方向发送回来。 6、 在内核中启用 IP 转发功能。 构建一个基本的防火墙 [root@ Linux-tys root]# sysctl –p -----设置 IP 转发 [root@Linux -tys root]# cat /proc/sys/net/ipv4/ip_forward -----确认 IP 转发,可以见到结果为 1 [root@lg root]# iptables –F -----清除预设表 filter 中所有规则链的规则 [root@lg root]# iptables –X -----清除预设表 filter 中自定义规则链的规则 [root@lg root]# iptables –F –t mangle -----清除表 mangle 中所有规则链的规则 [root@lg root]# iptables –t mangle -X -----清除表 mangle 中所有自定义规则链的规则 [root@lg root]# iptables –F –t nat -----清除表 nat 中所有规则链的规则 [root@lg root]# iptables –t nat -X -----清除表 nat 中所有自定义规则链的规则 [root@linux-tys root]# iptables -A INPUT -p tcp - -dport 22 -j ACCEPT [root@lg root]# iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT [root@linux-tys root]# iptables -P INPUT DROP [root@linux-tys root]# iptables -P OUTPUT DROP [root@linux-tys root]# iptables -P FORWARD DROP [root@linux-tys root]# iptables -A OUTPUT -j ACCEPT -o lo ----此两行为在回送接口上允许 内部网络流量 [root@linux-tys root]# iptables -A INPUT -j ACCEPT -i lo [root@linux-tys root]# iptables -A OUTPUT -j ACCEPT -o eth1 -p tcp -m state --state ESTABLISHED,NEW -----此规则设置新建和已建的 TCP 连接的封包将会通过 eth1 向外转发,不指明源和目标地址 代表任何地址 [root@linux-tys root]# iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT --这条允许来 自专网到达专网接口的所有流量,下面一条规则则是检查到达外部网络接口的每个封包,属于已 有连接通过 [root@linux-tys root]# iptables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT 以下配置规则使之从一个网络接口转发到另一个:第一条规则接收所有来自专网的封包,并 被转发到外网卡 eth1 上;第二条规则到达外部网络接口 eth1 上的封包,如属于已有连接,则转 发到内网。 [root@linux-tys root]# iptables -A FORWARD -i eth0 -j ACCEPT- [root@linux-tys root]# iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT 最后建立 NAT 规则,POSTROUTING 表封包送出时需要翻译,该规则设置为对流出外部网 络接口 eth1 的封包起作用,并将源地址变为 eth1 的地址。 [root@linux-tys root]# modprobe iptable_nat ----加载 NAT 模块 [root@linux-tys root]# iptables -A POSTROUTING -t nat -o eth1 -j SNAT --to 192.168.32.254 备份和恢复 1、备份防火墙设置:[root@lg root]# iptables-save>iptablesrules.txt 本次设为 iptablesdefault.txt 2、删除防火墙设置:[root@lg root]# iptables –F 删除所有的链。 3、恢复防火墙设置:[root@lg root]# iptables-restore iptablesrules.txt 使防火墙自动化 [root@linux-tys root]# iptables-save > /etc/sysconfig/iptables ---保存规则到 /etc/syscofig/iptables 中,并自启动 [root@linux-tys root]# /etc/init.d/iptables start/stop/restart ----保存后则可用这个命令来控制 其状态 使用自定义链整固防火墙 基本规则并不检查除 TCP 连接状态以外的事项,可通过自定义的链来扩展基本防火墙以助于 处理增加的复杂性,更为复杂的规则集可指定哪一个 TCP 端口可以使用以及连接的源地址。同 时创建特定的规则来处理单个连接可以减少黑客利用端口的机会。 修改后的防火墙配置如下: 1、首先也是启用转发,清空所有规则,设默认为 DROP,在回送接口上允许所有内部网络流 量。然后我们将创建两条自定义链来处理从专网和外网接口到达的封包。下面是 SSH 的访问要 保留。 2、创建一个 PRIV 链来处理来自专用网络的流量。这个链传递已有返回的封包,进入防火墙 的 SSH 封包,以及目的地为因特网的 FTP、SSH 和 HTTP 封包,然后将 INPUT 链规则导向到 这一个链上。 [root@linux-tys root]# iptables -N PRIV [root@linux-tys root]# iptables -A PRIV -m state --state ESTABLISHED,RELATED -j ACCEPT [root@linux-tys root]# iptables -A PRIV -p tcp –s 192.168.1.0/24 –d 192.168.1.254 --dport 22 -j ACCEPT [root@linux-tys root]# iptables -A PRIV -p udp –d 0/0 --dport 53 -j ACCEPT [root@linux-tys root]# iptables -A PRIV -p tcp -d 0/0 --dport 21 -j ACCEPT [root@linux-tys root]# iptables -A PRIV -p tcp -d 0/0 --dport 80 -j ACCEPT [root@linux-tys root]# iptables -A INPUT -i eth0 -j PRIV [root@linux-tys root]# iptables -A OUTPUT –o eth0 -j PRIV 3、创建一个链来处理来自 DMZ(如果使用的话)以及外部网络到达的流量。这个链丢弃来 自专用网络和 DMZ 网源地址的所有封包,这是因为,第一,前者是欺骗地址,第二,根据策略, 不允许来自 DMZ 的流量进入到网络中。该链接受来自已有连接和编址到因特网的包。 [root@linux-tys root]# iptables -N EXT [root@linux-tys root]# iptables -A EXT -s 192.168.32.0/24 -j DROP [root@linux-tys root]# iptables -A EXT -s 192.168.1.0/24 -j DROP [root@linux-tys root]# iptables -A EXT -s 0/0 -p tcp --dport 1024:65535 -j ACCEPT [root@linux-tys root]# iptables -A EXT -s any/0 -d 192.168.32.254 -j ACCEPT [root@linux-tys root]# iptables -A INPUT -i eth1 -j EXT --配置 INPUT 链,使之将流量导向到 EXT [root@linux-tys root]# iptables -A OUTPUT –o eth1 -j EXT 4、修改 FORWARD 链以创建网关功能。自内网接口来的新的或已有的连接被转发到外部接 口上。 [root@linux-tys root]# iptables -A FORWARD -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT [root@linux-tys root]# iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT 5、建立 SNAT 规则。对源地址起作用转换为 192.168.32.254。此步后即可实现网关防火墙 功能了。 [root@linux-tys root]# modprobe iptable_nat [root@linux-tys root]# iptables -A POSTROUTING -t nat -o eth1 -j SNAT --to 192.168.32.254 6、配置 OUTPUT 链。使之允许来自防火墙服务的封包传到专用网络及因特网上。 [root@linux-tys root]# iptables -A OUTPUT -o eth0 -d 192.168.1.0/24 -j ACCEPT [root@linux-tys root]# iptables -A OUTPUT -o eth1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 7、检查防火墙规则并添加一条规则然后保存规则 [root@linux-tys root]# iptables -L –v ---- -v 将显示网络接口的附加信息 [root@linux-tys root]# iptables -A PRIV -p tcp -d any/0 --dport 23 -j ACCEPT [root@linux-tys root]# iptables-save > custom.txt 或作下面命令的保存 [root@linux-tys root]# iptables-save > /etc/sysconfig/iptables ---保存规则到 /etc/syscofig/iptables 中,并自启动。 用 Linux 防火墙构建 DMZ 2009-06-17 21:09 防守在网络安全中的重要性不必多说。保护网络最常见的方法就是使用防火墙。防火墙作为网络的第一道 防线,通常放置在外网和需要保护的网络之间。最简单的情况是直接将防火墙放置在外网和企业网络之间, 所有流入企业网络的数据流量都将通过防火墙,使企业的所有客户机及服务器都处于防火墙的保护下。这 对于一些中小企业来说是简单易行的,而且这种解决方法在某些情况下也表现不错。然而这种结构毕竟比 较简单。企业中有许多服务器、客户机等资源需要保护,不同的资源对安全强度的要求也不同。不能用对 待客户机的安全级别来对待服务器,这样服务器将会很危险;同样,也不能用对待服务器的安全级别来对 待客户机,这样用户会感觉很不方便。 针对不同资源提供不同安全级别的保护,可以考虑构建一个叫做“Demilitarized Zone”(DMZ)的区域。 DMZ 可以理解为一个不同于外网或内网的特殊网络区域。DMZ 内通常放置一些不含机密信息的公用服务器, 比如 Web、 Mail、FTP 等。这样来自外网的访问者可以访问 DMZ 中的服务,但不可能接触到存放在内网中 的公司机密或私人信息等。即使 DMZ 中服务器受到破坏,也不会对内网中的机密信息造成影响。 许多防火墙产品都提供了 DMZ 的接口。硬件防火墙由于使用专门的硬件芯片,所以在性能和流量上有绝对 的优势。软件防火墙的性价比非常好,一般企业使用起来效果不错。如果使用 Linux 防火墙,其成本将更 低。因此这里将要介绍的是在 Linux 防火墙上划分 DMZ 区域的方法。 构建 DMZ 的策略 Linux 从 2.4 内核开始,正式使用 iptables 来代替以前的 ipfwadm 和 ipchains,实现管理 Linux 的包过滤 功能。Linux 的包过滤通过一个叫 netfilter 的内核部件来实现。netfilter 内建了三个表,其中默认表 Filter 中又包括 3 个规则链,分别是负责外界流入网络接口的数据过滤的 INPUT 链、负责对网络接口输出 的数据进行过滤的 OUTPUT 链,以及负责在网络接口之间转发数据过滤的 FORWARD 链。要构建一个带 DMZ 的防火墙,需要利用对这些链的设定完成。首先要对从连接外部网络的网卡(eth0)上流入的数据进行判断, 这是在 INPUT 链上完成。如果数据的目标地址属于DMZ 网段,就要将数据转发到连接DMZ 网络的网卡(eth1) 上;如果是内部网络的地址,就要将数据转发到连接内部网络的网卡(eth2)上。表 1 显示了各个网络之 间的访问关系。 表 1 网络间访问关系表 内网 外网 DMZ 内网 / Y Y 外网 N / Y DMZ N N / 根据表 1,可以明确以下六条访问控制策略。 1.内网可以访问外网 内网的用户显然需要自由地访问外网。在这一策略中,防火墙需要进行源地址转换。 2.内网可以访问 DMZ 此策略是为了方便内网用户使用和管理 DMZ 中的服务器。 3.外网不能访问内网 很显然,内网中存放的是公司内部数据,这些数据不允许外网的用户进行访问。 4.外网可以访问 DMZ DMZ 中的服务器本身就是要给外界提供服务的,所以外网必须可以访问 DMZ。同时,外网访问 DMZ 需要由防 火墙完成对外地址到服务器实际地址的转换。 5.DMZ 不能访问内网 很明显,如果违背此策略,则当入侵者攻陷 DMZ 时,就可以进一步进攻到内网的重要数据。 6.DMZ 不能访问外网 此条策略也有例外,比如 DMZ 中放置邮件服务器时,就需要访问外网,否则将不能正常工作。 DMZ 的实现 根据以上访问控制策略可以设定 Linux 防火墙的过滤规则。下面将在一个虚构的网络环境中,探讨如何根 据以上六条访问控制策略建立相应的防火墙过滤规则。这里的讨论和具体应用会有所区别,不过这种讨论 将有助于实际应用。用户在实际应用时可根据具体的情况进行设置。该虚拟环境的网络拓扑如图 1。 图 1 DMZ 网络拓扑图 如图 1 所示,路由器连接 Internet 和防火墙。作为防火墙的 Linux 服务器使用三块网卡:网卡 eth0 与路 由器相连,网卡 eth1与 DMZ 区的 Hub 相连,网卡 eth2 与内网 Hub 相连。作为一个抽象的例子,我们用“[内 网地址]”来代表“192.168.1.0/24”之类的具体数值。同理还有“[外网地址]”和“[DMZ 地址]”。 对于防火墙,原则之一就是默认禁止所有数据通信,然后再打开必要的通信。所以在防火墙脚本的最初, 需要清空系统原有的规则,然后将 INPUT、OUTPUT、FORWARD 的默认规则设置为丢弃所有数据包。 对应的防火墙脚本片段如下: # Flush out the tables and delete all user-defined chains /sbin/iptables -F /sbin/iptables -X /sbin/iptables -t nat -F /sbin/iptables -t nat -X # Drop every packet /sbin/iptables -P INPUT DROP /sbin/iptables -P OUTPUT DROP /sbin/iptables -P FORWARD DROP 六种策略的实现。 1.内网可以访问外网 对应的防火墙脚本片段如下: /sbin/iptables -t nat -A POSTROUTING -s [内网地址] -d [外网地址] -o eth0 -j SNAT --to [NAT 的 真实 IP] 当数据从连接外网的 eth0 流出时,要将来自内网的数据包的源地址改成 Internet 上的真实 IP,这样才能 和外网的主机进行通信。“[NAT 的真实 IP]”表示分配给 NAT 用户的真实 IP,有几个就写几个,以空格分 开,但至少要写一个。 2.内网可以访问 DMZ 对应的防火墙脚本片段如下: /sbin/iptables -A FORWARD -s [内网地址] -d [DMZ 地址] -i eth2 -j ACCEPT 以上命令允许所有来自内网、目的地为 DMZ 的数据包通过。 3.外网不能访问内网 对应的防火墙脚本片段如下: /sbin/iptables -t nat -A PREROUTING -s [外网地址] -d [内网地址] -i eth0 -j DROP 以上命令将来自外网、去往内网的数据包全部丢弃。 4.外网可以访问 DMZ 为了保护 DMZ 中的服务器,外网对 DMZ 的访问也要加以限制。通常的思路是,只允许外网访问 DMZ 中服务 器所提供的特定服务,比如 HTTP。 对应的防火墙脚本片段如下: /sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -d [分配给 HTTP 服务器的 Internet 上的真 实 IP] -s [外网地址] -i eth0 -j DNAT --to [HTTP 服务器的实际 IP] /sbin/iptables -A FORWARD -p tcp -s [外网地址] -d [HTTP 服务器的实际 IP] -i eth0 --dport 80 -j ACCEPT /sbin/iptables -A FORWARD -p tcp -d [外网地址] -s [HTTP 服务器的实际 IP] -i eth1 --sport 80 ! --syn -j ACCEPT /sbin/iptables -t nat -A PREROUTING -s [外网地址] -d [DMZ 地址] -i eth0 -j DROP 该防火墙脚本片段将开放 HTTP 服务,使得只有访问 DMZ 中 HTTP 服务的数据包才能通过防火墙。 5.DMZ 不能访问内网 对应的防火墙脚本片段如下: /sbin/iptables -A FORWARD -s [DMZ 地址] -d [内网地址] -i eth1 -j DROP 以上命令将丢弃所有从 DMZ 到内网的数据包。 6.DMZ 不能访问外网 对应的防火墙脚本片段如下: /sbin/iptables -t nat -A POSTROUTING -p tcp --dport 25 -d [外网地址] -s [邮件服务器的 IP] -o eth0 -j SNAT --to [分配给 SMTP 服务器的 Internet 上的真实 IP] /sbin/iptables -A FORWARD -p tcp -s [邮件服务器的 IP] -d [外网地址] -i eth1 --dport 25 -j ACCEPT /sbin/iptables -A FORWARD -p tcp -d [邮件服务器的 IP] -s [外网地址] -i eth0--sport 25 ! --syn -j ACCEPT 以上命令先允许 DMZ 中邮件服务器连接外网的 SMTP 服务端口(25),然后禁止其它从DMZ 发往外网的数据包。 针对以上基本策略例举了实现它们的基本规则。在实际应用中,需要根据具体情况进行设置。只要设置得 当,Linux 也能成为很好的防火墙。需要补充的是,无论何种防火墙都只能提供有限的保护。设置好防火 墙不等于网络就是安全的,关键在于综合运用各种安全手段。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 7 人已下载

下载文档

相关文档