• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Iptables的基本原理介绍(一)

安全管理 彭东稳 8年前 (2015-11-25) 24835次浏览 已收录 0个评论

在学习Iptables防火墙之前,需要了解《网络基础部分》内容,最起码需要知道tcp、udp、icmp等协议报文格式。以及tcp/ip网络工作模型原理。如果不明白网络原理,对于Iptables有很多设置都不会太懂,因为Iptbales的设置就是跟网络打交道。

防火墙是什么?

防火墙(firewall),简单来说防火墙就是一种隔离工具。因为我们的网络默认情况下是开放的,默认只要能路由过来那么都可以访问的。而防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合。它可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况,以此来实现网络的安全保护。 在逻辑上,防火墙是一个分离器,一个限制器,也是一个分析器,有效地监控了内部网和Internet之间的任何活动,保证了内部网络的安全。

防火墙能做什么呢?

1)保护脆弱的服务

通过过滤不安全的服务,Firewall可以极大地提高网络安全和减少子网中主机的风险。例如,Firewall可以禁止NIS、NFS服务通过,Firewall同时可以拒绝源路由和ICMP重定向封包。

2)控制对系统的访问

Firewall可以提供对系统的访问控制。如允许从外部访问某些主机,同时禁止访问另外的主机。例如,Firewall允许外部访问特定的Mail Server和Web Server。

3)集中的安全管理

Firewall对企业内部网实现集中的安全管理,在Firewall定义的安全规则可以运行于整个内部网络系统,而无须在内部网每台机器上分别设立安全策略。Firewall可以定义不同的认证方法,而不需要在每台机器上分别安装特定的认证软件。外部用户也只需要经过一次认证即可访问内部网。

4)增强的保密性

使用Firewall可以阻止攻击者获取攻击网络系统的有用信息,如Figer和DNS。

5)记录和统计网络利用数据以及非法使用数据

Firewall可以记录和统计通过Firewall的网络通讯,提供关于网络使用的统计数据,并且,Firewall可以提供统计数据,来判断可能的攻击和探测。

6)策略执行

Firewall提供了制定和执行网络安全策略的手段。未设置Firewall时,网络安全取决于每台主机的用户。

防火墙的分类

防火墙一般根据应用类型分为:主机防火墙网络防火墙;主机防火墙一般工作于主机边缘,而网络防火墙工作于整个网络的边缘。其工作原理都是根据进出本主机或网络的报文根据事先定义好的规则进行匹配检测,对于能够被规则匹配到的报文做出相应处理的处理动作进行过滤数据包的。

另外我们应该知道,防火墙还分为硬件防火墙软件防火墙。那么它们之间又有什么区别呢?

硬件防火墙—-安全厂商定制化的硬件,硬件防火墙一般使用重新定制编译后的Linux内核,凭借Linux本身的高可靠性和稳定性保证了防火墙整体的稳定性,Linux永远都不会崩溃,其稳定性是由于它没有像其他操作系统一样内核庞大且漏洞百出。比如Cisco的ASA,华为的USG防火墙都属于硬件防火墙。区别在于由软件实现的逻辑通过在硬件上直接实现了。比如说我么X86系列CPU是一种通用架构,而有写CPU是专门定制的,可以实现在硬件层就能够封包解包功能。可以想象在效率上比软件实现要快很多,比如说在硬件之上一个指令就可以完成的事,如果有软件实现就需要一大堆指令才能完成;但这种定制化的通用性就很差了。而吞吐量和报文转发率是关系防火墙应用的主要指标,硬件防火墙的硬件设备是经专业厂商定制的,在定制之初就充分考虑了吞吐量的问题,在这一点上远远胜于软件防火墙。但这种硬件防火墙不是所有的逻辑它都能在硬件上直接完成,还多复杂指令还是需要通过软件的形式来完成。所以这种硬件和软件相互结合的防火墙我们一般称为硬件防火墙。

软件防火墙—–其实软件也是需要跑在硬件之上的,所以一般我们所说的软件防火墙主要是指它的实现方式和防护功能是靠纯软件实现逻辑来实现的,比如Linux的Iptables防火墙是靠在内核代码上来实现的。

Linux防火墙基础

什么是包过滤呢?

数据包过滤(Packet Filtering)技术是在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制表(Access Control Table)。通过检查数据流中每个数据包的源地址、目的地址、所用的端口号、协议状态等因素,或它们的组合来确定是否允许该数据包通过。

学习Linux防火墙不得不接触的两个术语,一个是Netfilter,另一个是Iptables了。他们各自的作用及区别是什么呢?

Netfilter

Netfilter指的是Linux内核中实现包过滤防火墙的内部结构框架名称,也就是说它就是Linux的防火墙功能。它是内核的一部分,工作在内核协议栈中。netfilter定义了协议栈中的检查点和检查点上引用的数据结构以及对这些数据结构引用的过程,检查点由宏NF_HOOK定义。

Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。Netfilter是一个设计良好的框架,之所以说它是一个框架,是因为它提供了最基本的底层支撑,而对于实现的关注度却没有那么高,这种底层支撑实际上就是其5个HOOK(钩子)点,如下图:

Iptables的基本原理介绍(一)

INPUT:应用在本地防火墙收到远程数据包(入站)时。

OUTPUT:应用在本地防火墙向外发送数据包(出站)时。

FORWARD:应用在网络防火墙(针对SNAT/DNAT)中的相互数据包(转发)时。

PREROUTING:应用在对数据包作路由选择之前时。

POSTROUTING:应用在对数据包作路由选择之后时。

HOOK点的设计:Netfilter的hook点其实就是固定的“检查点”,这些检查点是内嵌于网络协议栈的,它将检查点无条件的安插在协议栈中,这些检查点的检查是无条件执行的 ;对比Cisco,我们知道其ACL也是经过精心设计的,但是其思想却和Netfilter截然相反,ACL并不是内嵌在协议栈的,而是一种“外部的列表”,策略包含在这些列表中,这些列表必须绑定在具体的接口上方能生效,除了绑定在接口上之外,检查的数据包的方向也要在绑定时指定,这说明ACL只是一个外接的策略,可以动态分派到任何需要数据包准入检查的地方。

Netfilter防火墙有四种功能:连接跟踪(Connection Tracking)、包过滤(Packet Filtering)、地址转换(NAT)、包处理(Packet Mangling)四种技术。

Iptables

现在我们知道了Linux防火墙是netfilter,那么iptables是什么呢?netfilter只是在内核协议栈中提供了5个HOOK,如果想要使用这5个HOOK,就需要用户进行编写相对应的规则并应用到对应的HOOK上面,只有这样才可以做到数据包过滤等功能。所以iptables就是用户空间提供的用来生成防火墙规则的命令程序,也是一种管理包的过滤工具,而生成的规则只有在netfilter上才能生效,通常位于/bin/iptables。

所以Linux真正实现防火墙功能的是netfilter,而iptables是用户空间提供的规则编写工具。属于用户态的防火墙规则管理,这也意味着无论你如何设置防火墙规则,一旦机器重启所有的规则将丢失。在Linux中的iptables不是服务,但是有服务脚本,服务脚本的主要作用在于管理保存的规则和装载及移除iptables/netfilter相关的内核模块。当机器关机时netfilter应用的规则将全部丢失,但是机器启动时会自动加载用户编写好的规则脚本使之重新生效。

其实Linux内核从1.1才开始有包过滤功能,第一代产品是1994年诞生于BSD系统的防火墙,Linux移植了OpenBSD系统的防火墙代码。那时的规则编写工具叫ipfw,防火墙就叫firewall好像。Linux2.2用户工具变更为ipchains,最后在Linux2.4中用户工具被重写,新的工具为iptables,而内核防火墙框架被命名为netfilter。

netfilter/iptables是Linux内核集成的IP信息包过滤系统,针对Tcp/Ip数据包实施过滤和限制,属于包过滤型防火墙。

Netfilter/Iptables四表五链结构介绍

Netfilter防火墙有四种功能:连接跟踪(Connection Tracking)、包处理(Packet Mangling)、地址转换(NAT)、包过滤(Packet Filtering)这四种技术。其分别对应以下四种表。

四表(raw,mangle,nat,filter)

Raw–>连接跟踪

Raw表在netfilter框架中非常靠前的表,基本就是用来干一件事,通过 NOTRACK给不需要被连接跟踪的包打标记,也就是说,如果一个连接遇到了-j NOTRACK,conntrack 就不会跟踪该连接,raw的优先级大于mangle, nat, filter,包含PREROUTING和OUTPUT 链。所以可以对收到的数据包在连接跟踪前进行处理。

Mangle–>包处理

Mangle表这个表主要用来mangle数据包,我们可以改变包及包头的内容,比如TTL、TOS或MARK。强烈建议你不要在这个表里做任何过滤,不管是DANT,SNAT或者Masquerade。

TOS操作用来设置或改变数据包的服务类型域。这常用来设置网络上的数据包如何被路由等策略。 注意这个操作并不完善,有时得不所愿。它在Internet上还不能使用,而且很多路由器不会注意到 这个域值。换句话说,不要设置发往Internet的包,除非你打算依靠TOS来路由,比如用iproute2。

TTL操作用来改变数据包的生存时间域,我们可以让所有数据包只有一个特殊的TTL。它的存在有 一个很好的理由,那就是我们可以欺骗一些ISP。为什么要欺骗他们呢?因为他们不愿意让我们共享 一个连接。那些ISP会查找一台单独的计算机是否使用不同的TTL,并且以此作为判断连接是否被共享的标志。

MARK用来给包设置特殊的标记。iproute2能识别这些标记,并根据不同的标记(或没有标记)决定不同的路由。用这些标记我们可以做带宽限制和基于请求的分类。注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序可以使用这种标记对包进行过滤或高级路由。

这个表有五个内建的链:PREROUTING、POSTROUTING、INPUT、UTPUT、FORWARD。mangle包操作分别在这5个链中的不同位置上执行,其中PREROUTING在包进入防火墙之后、路由判断之前,POSTROUTING是在所有路由判断之后,OUTPUT在确定包的目的之前,INPUT在包被路由到本地之后以及在用户空间的程序看到它之前,FORWARD在最初的路由判断之后、最后一次更改包的目的之前。注意mangle表不能做任何NAT操作,它只是改变包的TTL、TOS或MARK,而不是其源或目的地址。NAT是在nat表中操作的。

Nat–>地址转换

Nat表主要用处是网络地址转换,即Network address translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或masqueraded,那么余下的包都会自动被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个地被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。实际的操作分为DNAT、SNAT、MASQUERADE这几类操作。

DNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问 重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。

SNAT改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个 很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就 能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。如果使用类似192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为 私有的,只能用于LAN内部。

MASQUERADE的作用和MASQUERADE完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而 不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。

这个表有三个内建的链:PREROUTING链的作用是在包刚刚到达防火墙时改变它的目的地址。如果需要的话,OUTPUT链会改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。

Filter–>包过滤

Filter表用来过滤数据包,我们可以在任何时候匹配包并过滤它们。我们就是在这里根据包的内容对包做DROP或ACCEPT的。当然,我们也可以预先在其他地方做些过滤,但是这个表才是设计用来过滤的。几乎所有的target都可以在这儿使用。大量具体的介绍在后面,现在你只要知道 过滤工作主要是在这儿完成的就行了。

这个表有三个内建的链:FORWARD链过滤所有不是本地产生的并且目的地不是本地的包,而INPUT恰恰针对那些目的地是本地的包。OUTPUT是用来过滤所有本地生成的包的。

五链(INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING)

在Iptables防火墙的四张表中总结起来一共有5种链,这5种规则链在Linux内核的TCP协议栈上是5个钩子函数(hook function)分别应用在不同的出口或节点上,下面解释一下这5条链的含义:

INPUT:应用在本地防火墙收到远程数据包(入站)时。

OUTPUT:应用在本地防火墙向外发送数据包(出站)时。

FORWARD:应用在网络防火墙(针对SNAT/DNAT)中的相互数据包(转发)时。

PREROUTING:应用在对数据包作路由选择之前时。

POSTROUTING:应用在对数据包作路由选择之后时。

iptables通过socket接口对netfilter进行操作,创建socket的方法如下:socket(TC_AF,SOCK_RAW,IPPROTO_RAW),其中TC_AF就是AF_INET,然后通过getsockopt()和setsockopt()系统调用来读取和更改netfilter的设置。

Netfiler就好像是一个网络包裹传送和转发中心,它预先配好了五条传送带,它们分别是PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING,并且配备了4个非常先进的包裹过滤处理规范(表),它们分别是filter、nat、mangle和raw。4个表的优先级由高到底的顺序为:raw>mangle>nat>filter。

如:如果在PREROUTING链上,既有mangle表,也有nat表,那么先由mangle表处理,然后再由nat表处理。raw表只在PREROUTING链和OUTPUT链上使用,因为优先级最高,从而拥有对收到的数据包在连接跟踪前进行处理的特权。一旦用户在某个链上使用了raw表,处理方式就很简单粗暴。当raw表处理完后,会跳过nat表和nf_conntrack模块的处理,直接离开这条链,即不再做地址转换和数据包的连接跟踪处理了。raw表可以应用在那些不需要做nat的情况以提高性能。例如,在有大量访问的web服务器上设置一下规则,实行从80端口来的数据不麻烦iptables做连接跟踪处理的策略,采用这种策略会提高用户的访问速度。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (2)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!