Firewall:防火墙,隔离工具;前端
作一个不太正式但容易让人理解的定义:防火墙是工做于主机或网络的边缘处,对于进出本主机或本地网络的报文,根据事先定义好的检查规则做匹配检测,对于那些可以被检查规则所匹配到的报文作出处理的组件;web
须要注意的是:浏览器
防火墙分为两类:安全
主机防火墙:服务器
网络防火墙:网络
防火墙工做在边缘位置,这个边缘必定是报文进出的地方才能够。对于Linux主机来说,TCP/IP协议栈是在内核中实现的,那防火墙对于一个主机来说应该工做在内核空间,由于全部进出本主机的报文都确定是经过TCP/IP协议栈来实现的。由于咱们如今互联网上所用到的或者所用于实现通讯的组件无非就是TCP/IP协议的实现,而可以接受报文的硬件设备就是网卡而已,网卡做为一个硬件设备来说也只有内核经过驱动程序能访问到,因此说一个主机防火墙对于Linux而言应该放在内核空间的什么地方呢?若是在网卡的驱动程序上的话那就简单,但问题是网卡的驱动程序仅仅只能用来作驱动不能作防火墙,并且咱们也不该该让驱动作防火墙,由于驱动自己只是让硬件工做的,它对于报文自己没有任何在协议层的理解。架构
刚刚说过防火墙是对于进出本主机的报文根据事先定义好的规则作匹配检测的,那么这个规则是什么呢?简单来说,检查一个报文的源IP、目标IP、源端口、目标端口等等。这些其实就是是咱们写检查规则基于的基本标准,那么很显然在驱动程序上它是没法理解协议自己具有的意义的。由此,咱们这里的防火墙应该在那些协议层次上可以理解协议的位置进行,所以在内核中TCP/IP协议栈上去放防火墙就能够了。负载均衡
可是TCP/IP协议栈不少,其中有TCP协议、IP协议等等,那咱们应该把防火墙放在哪一个对应的位置作检测呢?首先咱们来分析一下,对于本机而言报文有几种走向呢?对于一台主机来说,咱们所能接受到的报文是别人发送过来进入到主机内部的报文,那么接收进来的报文有两种不一样的走向。若是有报文发到本机上来了那就意味着目标地址多是本机,这是一种可能,目标地址是本机的全部报文本机的TCP/IP协议栈就应该拆封装最终把这个请求根据对方所访问到的目标端口送给注册监听在这个目标端口上的应用程序,因此这是第一种走势;框架
第二种走向,对方发送的报文的目标地址不是本机,但若是不是本机它为何会把报文发送到本机上来呢?由于有可能一个主机把网关设为了本机的网卡IP地址,这个时候主机把它的报文交给下一跳,由下一跳负责转发,因此其目标地址不是本机,Linux网络协议栈中有一个功能叫核心转发(ipforward),若打开了核心转发,那这个报文会根据咱们本机所理解的、所记录的路由表选路之后有可能经过另一个网卡,也有可能经过本网卡从新发送出去了,这叫作转发。收到之后只要本机打开了核心转发功能并经过检查本机路由表知道到达目标IP大概会通过下一个主机是谁,所以,他将转发给下一跳,这就意味着有可能这个报文经过另一块网卡出去了,那这个时候它并无进入本地的用户空间所以跟本地用户空间没有关系。函数
因此从上述分析咱们能够知道,一个报文到达本机后可能有两种不一样的走向,一种是到本机内部来,另一种是经过本机的另一个接口甚至有多是本机的同一个接口(由于同一个接口上能够配置n个IP地址)从新发送出去,在同一网络中可能多个不一样的网关或主机实现报文转发的。这是报文到达本机的可能性。
那考虑另一种情形,本机有没有可能向外发送报文呢?像上述报文到达本机是别人访问咱们或者通过咱们转发的,那咱们做为本机访问别的主机是一种什么样的场景和情形呢?好比说本地打开浏览器访问一个网站就是本机访问别的主机的情形,这就是所谓的出去的报文,出去的报文不能直接经过用户空间出去,而应该经过内核空间中的TCP/IP协议栈发出去。而发往TCP/IP协议栈后,这个主机发现本机有多个网络接口,那就须要经过路由选择一条通路最终决定从哪一个接口发出去。
因此对于单个主机来说,报文就有这样几种流向,进入本主机的能够到本地用户空间的某个应用程序,也能够经由本主机内核核心转发通过其它接口发出去,还有一种情形就是本机内部的某个应用进程试图跟外部的其它主机发起通讯时,它将经过本地的TCP/IP协议栈与其它主机通讯,那基于这几种情形咱们应该把防火墙放在什么位置呢?其实只放在一个位置是不能解决全部问题的,因此说咱们须要在整个TCP/IP协议栈上根据报文的不一样流向分别进行不一样情形下的检查。例如:全部到达本机内部的就专门对这种报文作检查、凡是从本机内部出去的咱们给它作检查、凡是经由本机转发的不会通过用户空间这种状况也须要在一个特定位置作检查,因此虽然叫一个防火墙,但在TCP/IP协议栈内部咱们须要在三个报文不一样流经的位置分别作检查,这个咱们把它称做防火墙框架,整个框架可能并不会由一个组件组成。
因此所谓防火墙机制就是在内核由防火墙的设计者在TCP/IP协议栈上精心选择了几个卡点或者说报文必然流经的位置给它设置了多个钩子函数,能够想象一下钩子函数就是一个吊钩的意思,能够想象成全部进出的人流都必然经由的这个位置,像咱们坐火车同样要想进站和出站都得检票。此处也有进口和出口的不一样卡点,而钩子函数就至关于一个检票机或者检票员,对任何一个经由此处的报文就由钩子勾起来挡住,而后用规则一条一条比对检查一下是否符合规则中定义的标准,若是符合某一个规则的标准,则通过那个规则后的处理方式作出相应处理便可。
对于Linux而言,咱们所提到的TCP/IP协议栈上对报文基于特定规则作处理时,不只仅须要防火有时候还须要额外的其它功能。由于防火墙未必能防火,在必定程度上来说,它可能对于某些特定规则或特定应用或特定报文给它假装一下让原本可以防着的却又不防。因此有必要的时候,咱们有可能要对某些报文中的内容作一些修改,而不对其作防范检查,仅仅是作一些额外处理等等。
而nat(网络地址转换)其实就是转换一个报文的源IP地址或者目标IP地址,另外pat(端口地址转换)也就意味着还能够改目标端口甚至是源端口的。那这种修改操做并非防火功能的。例如:若是检查规则明确说明凡是来自于1.1.1.1的报文(报文源地址是1.1.1.1)都拒绝访问本机,但这个规则应该是到本机内部时才能检查,可是像这种报文若是咱们想悄无声息的将源地址修改让其绕过防火墙到达目的地,怎么办呢?是在规则检查之后再改仍是规则检查之前再改呢?报文对应相关内容的修改应该是在检查发生之前更改,而报文的三种流向都不适合于进行更改,那么应该放在哪进行更改呢?咱们应当知道的是无论报文是往哪去,在刚进入本机就进行匹配度检测,事先作处理这是比较稳当的。此外还有一种情形,无论是从本机内部出来的仍是经由本机转发的,任何报文要想经过本机,不管经由哪一块网卡要离开本机了,都要进行拦截,那应该怎么实现呢?
所以,对于整个主机的防火墙来说,这里所设置的卡哨或设置的规则检查匹配度,为了辅助这三个位置工做,须要在先后两方设置两个卡点,可以对那些刚刚进入本机或立刻要离开本机的报文进行处理。因此说对应一个本机的防火墙内部的实现构建是它大致上须要实现这么一个框架才可以完成咱们所描述的防火功能的。
上述咱们描述主机防火墙所考虑的问题,那网络防火墙呢?
网络防火墙就意味着卡点不能放在一个主机上了,主机防火墙只须要一个主机在内部的内核的TCP/IP协议栈内部去选择5个卡点,从本机出来的、到达本机内部的、经由本机转发的均可以作一些规则检查,而那些刚刚进入本机或要从本机出去了须要实现作两个卡点,这就是5个卡点。
但问题是如今咱们面临的防火墙不是单台主机了,而是整个网络,一个网络内部有不少主机,而且有能力在单个主机上自行设定防火墙能力的人很少。因此咱们最好可以替它们作好防御工做。那也就意味着咱们对整个网络进出口的这个位置给它专门设置一个可以对进出本网络的报文的防火墙,经由这个防火墙作一下检测。这个防火墙首先它应该是一个独立的硬件设备,固然它起到防火功能的有多是内部的硬件设定,也有多是在硬件设备上编写的规则,这是必然的。可是这个设备它应该是什么呢?是一个Linux主机可不能够呢?此外还需考虑一个问题,若出现内网中的两台主机相互攻击呢?此时防火墙是没有起到做用的,因此防火墙在实现防火时,必定只能对那些经由本主机的报文作检测。
若是本地内网有一个服务器,而内网有一台主机对发起了攻击,此时防火墙是没有用的,所以首先网络上应该有一个端口防火墙,先过滤一部分报文防范外部攻击。然而每一台主机可能须要防范的规则和标准是不同的,所以每一台主机须要有防火墙用来防范内部攻击,固然也能达到防范外部攻击。
固然防火墙规则是死的,可是若是实现有些新奇的攻击方式咱们实现未添加防范规则该怎么办呢?咱们不能对全部访问本主机的报文都拒之门外,这样做为服务器的意义就不复存在了。所以咱们做为主机来说填进去的防火规则必定是只能防范那些已知的、事先可以理解到的、认为可能存在的攻击,写的规则也是写死的。而若是有些人通过巧妙假装后,它让本身的行为看上去并不是攻击行为,将其放行到本地网络或本机内部后当即原形毕露,窃取数据、攻击服务,该怎么办呢?防火墙就一筹莫展了,由于设计的规则检查没办法防范这个东西,因此对于任何一个进出的报文,咱们压根检测不了,可是它却作出了破坏性的行为。(须要注意的是,网络攻击跟毒是两码事,好比说访问一个文件,跟杀毒没有关系)
因此没有万无一失的安全性,其实咱们也能够这样作,假如说一个用户它潜入到网络或主机中来,以Web服务器为例,咱们对它的指望是仅仅是让它访问Web服务器下的页面,可是它却访问了其它页面,咱们就能够认为这是一个不轨行为。由此说咱们能够有事先定义好的有一些所谓的行为侦测机制可以识别出所谓它作出了不轨行为,这个时候当即进入防火墙,告诉它把这个报文挡在门外不要让它再访问了。所以咱们必需要有一套额外的系统能检测或区辩出什么样的行为叫做不轨行为,而这种系统就叫做入侵检测系统(IDS)。一个进程在本地主机内部访问数据是根据咱们界定的正常范围法则内它的正常访问咱们都是容许的,但若是它一旦作出一些不轨行为系统是都能当即探测的到的,可是须要注意的是,入侵检测系统仅可以检测到入侵。
而IDS若是说它可以发现侦测到所谓的攻击行为,并将这个攻击行为通告给Firewall,若是Firewall在这个条件触发之后能自行再生成一条规则,把这种所谓有潜在攻击行为的报文给拒之门外,因而它就能实现叫入侵检测和防火墙联动所实现的功能,若是而这两个能合起来的话,就称为IPS(入侵防护系统)。但不是全部的IDS都能跟Firewall联动起来的通常来说,IDS若是没有能力通知给Firewall并触发Firewall添加规则直接可以自动的把那些攻击行为的报文挡在门外的话,那能够有一个简单的方式,就是IDS检测攻击后它可以触发报警,怎么触发呢?一旦发现有攻击行为它赶忙发一封邮件给管理员,这是一个比较稳当的作法,可是这种作法有滞后性,因此若是它能通知给Firewall是最理想的状态。
IDS有两种常见的实现:
蜜罐:
可是对于IDS与IPS而言,它们也只是在用户发出攻击行为之后才能作出反应的。那若是要想对某些疑似攻击的报文进行处理的话,可经过“钓鱼之法”,所以咱们未来也能够在网络内部部署一个honeypot(蜜罐)。
iptables防火墙一般称为包过滤型防火墙,即只是对包的TCP或IP或UDP首部作检测、匹配等完成过滤的,因此被称为包过滤型防火墙。
思考一下,iptables是什么呢?咱们已经知道防火墙是工做在内核中的,即防火墙应该是内核中所实现的功能,而咱们在使用iptables时,使用的是它的命令,可是既然咱们能够把它当命令使用,那它会是内核中的东西吗?想象一下,咱们能够将内核模块当命令使用吗?显然是不可能将内核自己的某个模块当作命令使用,所以iptables不是内核中的防火墙。那iptables是什么呢?
咱们说过,要想实如今主机上完成防火墙的功能,意味着须要在内核中的TCP/IP协议栈上的数据报文流经的位置设置几个钩子,可以把那个对应的报文勾起来经过规则来检测,若是说没有这么一个钩子的话,首先,何处放规则?其次,规则放上去也是没用的。由此,咱们所说的iptables实际上是由两个部分组成的:
其实,iptables的全称叫作iptables/netfilter;
而咱们说的内核中设置了5个钩子,这5个位置所实现的叫一个框架(framework,内核中的网络报文过滤或处理框架),而netfilter就是这么一个内核TCP/IP协议栈内部所实现的网络过滤器的框架,说白了就是由它来负责提供钩子(hook),对于网络中的功能,钩子就是一些函数,称为钩子函数(hook function)。
而iptables用来作什么呢?有钩子仅仅能把报文勾起来,但这个报文到底符不符合某个匹配规则、若是匹配之后对于它作什么样的处理呢,因此规则才是真正负责检查并完成过滤或完成防火功能的组件。可是这个规则必须可以放置在恰当位置才能发挥做用的,咱们能够想象成iptables就是负责向这5个钩子上添加、删除、修改规则的。因此iptables是一个规则管理工具(rule utils)。
站在这个角度来想,iptables是工做在用户空间的程序,netfilter才是真正可以实现防火墙的框架,可是两者谁离开谁都不能够,由于这5个钩子只是可以实现让至少选择这5个位置的任何一个报文经由、到达本机、从本机出发时必然会经由某一个位置,这几个卡哨作好之后并无特别多的做用,由于最多只是咱们已经界定报文应该流经什么位置。而真正可以发挥所谓网络防火墙或主机防火墙的功能的,是咱们须要在这个位置上添加许许多多的检查规则,并一旦匹配到规则后作出相应处理,这才是应该要完备的功能。因此咱们说netfilter是内核中自己就具有的框架,一旦咱们想让它实现防火,那咱们就使用iptables写一个规则把它扔到这个框架上去就能当即发挥做用了。
可是内核的某个功能发挥做用和应用程序发挥做用实现方式其实还不同的,一个应用程序只有运行起来才能发挥做用,就像咱们启动一个web服务,把httpd进程运行起来才能接收客户端访问,可是并无把内核启动起来的概念,其实只要主机处于运行当中,内核就处于运行当中,因此iptables所写的规则只要将其扔到这个规则netfilter中去,它就会当即发挥做用了。而运行中的内核是在内存中的,那咱们扔这个规则实际上是把它扔到内存中去了。那也就意味着一关机的话扔的规则就没有了,因而为了让之后都有效就须要将iptables命令写成脚本,开机的时候让它自动运行这个脚本便可。
所以咱们在开机的时候启动防火墙并非将它启动为何服务的,而仅仅是让这些规则从新生成一遍仅此而已。因此防火墙历来都不是服务,它不会启动进程,但为了统一管理,在CentOS 6上咱们依然将它叫作iptables服务,但它真正发挥做用在开机启动时无非就是把一个规则文件给它从新生效一次,它没有运行任何进程由于它不须要进程,它是在内核上发挥做用的。
链:
5个钩子函数有特定的学术称呼,咱们在添加规则时,要想扔一条规则到防火墙上,应该扔在什么位置,这5个的哪一个位置呢?这须要看目的,是打算去限制本机访问别人、仍是限制别人访问本机、仍是限制那些报文经由本机转发时能不能转发,所以咱们扔的位置应该是不一样的,这也就意味着咱们在写iptables规则时应该写明这个规则将其放在这5个钩子函数的哪一个钩子上。因此就须要利用某一个名称来引用这个钩子以至于未来规则添加到哪一个钩子上,因此在iptables的名称上下文或名称空间中,这5个钩子函数各有一个名称,它们被称为一个链。
可是为何被称为链呢?咱们须要了解一下iptables的前身。
其实早些时候,Linux上是没有内核中的软件防火墙的,而著名的Unix发行版BSD系统中有一项叫作Open BSD,它的主要着眼点为安全,被称为最安全的BSD发行版,Open BSD中各类安全体系作的很是完善。那个时候Linux刚诞生不就尚未防火墙,因此Linux就借鉴了Open BSD内部防火墙实现机制,模仿它们在内核中也实现了一个,早些时候叫ipfw,固然它也有本身内核中的框架,那个时候框架很简单,尚未成体系。那个时候仍是在Linux2.0左右,而过一段时间,人们发现ipfw这种实现机制太粗浅,因而就把这个在内核中实现的这种防火墙经过添加规则的方式来完成防火功能,规则多了,穿起来就像链了,这个时候叫作ipchains。后来人们又发现,为了可以充分扩展防火墙的功能,所以使得防火墙在上,首先咱们设了5个卡哨,其次每一个卡哨上面它所实现的功能还不止一个,如在由本机内部报文发出的这个位置能够对其作过滤,即检查规则是否符合条件,若是符合,容许访问与不容许访问这叫过滤,或者是检查报文符不符合规则,若是符合规则把它的地址改一改这叫作地址转换,而过滤和地址转换是两种大相径庭甚至是相去甚远的功能。所以这两种功能的链不能放在一块儿发挥做用,它们虽然都放在一个钩子上,但它们都属于两种不一样的功能。这就意味着结果就成了在一个钩子上就有了两个链,每个功能用一个链。而这两个功能到底谁先谁后呢?所以它们也应该有优先级关系,不过怎么讲,每一种功能都要单独的发挥完做用后才能让另一个功能发挥做用。而每个功能均可能有多条规则,那最终就是每个钩子上就实现了多个行和多个列组成的表,ipchains就发展成了iptables,这就是iptables的由来。
因此从这个角度来说,iptables之因此叫tables是由于它所实现的功能有不少。
iptables的功能:(能够理解成规则的分类)
注意:每一种功能它们都有可能须要在这5个钩子函数的某一个位置发挥做用;
另外对于网络防火墙来说,链接追踪功能是很是有用的功能。链接追踪就是可以去识别曾经访问过本主机或本网络的主机或报文的这样一种机制,即识别此前访问过本机或本网络的报文,对于咱们的主机来讲,若是要想能追踪每个链接,那就须要创建一个很是庞大的追踪表才能够,对于一个很是繁忙的前端负载均衡服务器若是每个链接都要作追踪的话,要想追踪链接就要将其记下来,记下来就须要内存空间,结果可能会致使内存空间溢出,一旦溢出,新的链接就不能进来了。所以为了追踪就须要记录,而新链接来了,记录下来了,那第一次访问都不容许了。因此对于很是繁忙的前端负载均衡服务器,链接追踪功能是万万不能开启的,若是不得不启用,准备好足够大的内存而且将链接追踪功能的所可以承受功能的调到足够大才能够。
5个钩子函数在iptables的名称空间当中,它有一种称呼分别是:(被称为5个内置的链)
报文刚刚到达本机后是发往本机内部仍是经由本机转发的,须要做出判断,能够根据目标地址检查路由表来判断,这也就意味着接下来有一个路由功能要实现,即有一个路由选择的过程。而这个位置在路由选择发生以前就要完成,因此称为PREROUTING。
一旦PREROUTING结束了,报文就有两个走向,第一,要么是到本机内部,第二要么是通过本机转发。这两种情形,到本机内部有一个专门的钩子叫INPUT,经由本机转发称为FORWARD。
而对于一个网卡来说,若将其看成是报文流出的接口,那报文要经过这个网卡流出时的来源有两种可能,第一种是转发然后出去的,第二种是由本机内部发出的。而本机内部发出的称为OUTPUT。
不管是由本地转发的仍是经由本机内部发出的,未来它在离开本机以前须要再作一次路由选择,那就意味着路由选择发生之后要走哪条路就肯定了。那第二次路由决策发生之后咱们要对其作一些即将离开本机以前最后那一关再给它作一些处理,这就叫POSTROUTING,这是第二次路由决策发生之后用于作出处理的。
其实无论是PREROUTING也好,仍是POSTROUTING也罢,其实它们跟网卡无关,从哪一个网卡进来在路由发生以前都叫PREROUTING,不管即将经过哪一个网卡离开,在路由决策发生之后都叫POSTROUTING。因此它们跟网卡是没有什么关系的,它们只是TCP/IP协议栈上的功能,能够从任意一个网卡离开,从任意一个网卡进来。
咱们再想一个问题,若是说在这个FORWARD上,它既然是转发的,那么在这里添加规则的目的是什么呢?定义哪些能够转发,哪些不能够转发,那为何转发时要作限制呢?这其实就是网络防火墙的意义了,iptables也能够用来扮演网络防火墙的角色,怎么扮演呢?把它的规则定义在FORWARD上,若是这个时候公司里只有一个主机或一根网线可以跟外部网络通讯,而后把这个网线接到Linux主机上。内网全部主机都把这个Linux主机的内网网卡当网关,那就意味着全部的报文只要跟非本地网络的通讯都要通过它,那咱们就能够在它上面的访问列表上作好规则了,好比能访问或者不能访问QQ等等这一系列规则均可以在上面进行定义,并且咱们对应哪些容许经过的主机都给它放行,哪些不容许经过的通通拒绝掉,那就能实现所谓的网络防火墙的功能了。
所以iptables能够扮演本地主机防火墙利用INPUT链、OUTPUT链便可,而又能扮演网络防火墙利用FORWARD链便可。
那么为何须要硬件防火墙呢?全部内网的主机任何一个报文都通过本机跟非本地主机通讯时就意味着每个报文本机都要转发,所以转发的过程它要进行检测,效率会很是低,尤为是规则很是多时。还有一点就是iptables它的防火墙功能是在纯软件的基础上实现的,即使是内核级别实现它也是软件,有不少硬件防火墙它们的CPU在设计上在硬件级别就能够完成报文的拆分和封装。能让软件实现的好处在于能够改软件到达灵活修改的目的,可是硬件级别能实现的防火墙功能不须要软件参与,它的性能要好不少,因此有些硬件防火墙它可以将网络协议栈的原本是软件实现的某些功能基于硬件实现,从而大大提升了工做效率,而这个CPU一般都是专门设计的并且有特定架构,跟X86平台不是同一种架构。那既然是特定定制的又用于特殊目的的话一般代价很是昂贵,固然并非硬件能完成全部功能,不少硬件防火墙同样须要在里面写规则,有些较高级的应用启动规则检查而且须要本身编辑添加规则了,不过它在较底层次上的某些报文处理功能的确在硬件层次上实现了,因此性能会很是高。
netfilter在内核中设置了5个参考点,而iptables为了能引用这5个参考点,咱们能够经过PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING来引用它们,而引用时用到的引用机制分为了4种不一样的功能,每个功能均可能会在这些链上来实现,如:filter会用到INPUT、FORWARD、OUTPUT,而mangle则会用到这5个。这就是为何每个链最终会成为iptables的缘由,由于每个链上都有可能添加n种功能的规则,每一种功能都叫作一个链,那多个链结合起来就至关于一个TABLE了。
总结报文流向以此来看如何写规则来完成真正防火墙的功能:
首先,全部报文大概就分为三种:
因此流入、流出、转发它们所经由的位置不同,这一点相当重要,由于咱们添加规则时要打算对哪种报文作检测那就在在它流经的位置上添加规则,如咱们想不让某个报文出去在INPUT上没有任何做用,因此对于报文流入流出所通过的路径必定要作到心中有数,而且还须要在功能上对其做区分。
各功能的分别实现的位置:
filter:INPUT、FORWARD、OUTPUT
nat:PREROUTING(DNAT,目标地址转换)、OUTPUT(SNAT,源地址转换)、POSTROUTING(SNAT,源地址转换),在其它地方实现nat是没有必要也是不该该的并且就连OUTPUT都不多用,对咱们来说,实现地址转换一般只有两个链PREROUTING和POSTROUTING。
mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw:PREROUTING、OUTPUT
这样一来就意味着咱们写规则时,第一既要先想明白使用的是什么功能,而后决定放在哪张表上,每一个功能要有一张表,filter叫filter表,nat叫nat表,mangle叫mangle表;第二,还要明确的定义好咱们应该放在对应表的哪一个链(位置)上,要根据报文流经的方向来肯定。
路由发生的时刻:
判断目标主机(是否为本机);
判断经由哪一个接口送往下一跳;
小结:
iptables一共有四表五链
添加规则的考量点:
(1) 要实现哪一种功能(说白了就是作什么,是作过滤呢,仍是作地址转换):判断添加在哪张表上;
(2) 报文流经的路径:判断添加在哪一个链上;
咱们说过在一个链上有n条规则,不然不能称之为链,那这些规则检查时自上而下进行检查,若是说某一规则匹配到了或生效了怎么办?其它还要不要作检查?咱们如何重启这种检查机制?因此还需注意对于链而言,链上的规则次序即为检查的次序(因此这个次序就相当重要了);所以它内部隐含必定法则:
(1)同类规则(访问统一应用),匹配范围小的放上面;规则检查时自上而下的,并且有些规则是一旦被第一条规则处理了,日后就再也不检查了,这就意味着效率提高了,若是每一次检查都是检查到最后,被最后一条规则匹配了,那前面的检查就白费了,那咱们能够认为让那些尽量越优先应该被匹配到的规则越往前放或者越有可能被匹配到的规则越往前放;
(2)不一样类规则(访问不一样应用),匹配到报文频率较大的放上面;
(3)将那些可由一条规则描述的多个规则合并为一个;
(4)设置默认策略;
白名单:默认为拒绝,只容许咱们指定的访问;
黑名单:默认为容许,只拒绝那些咱们明确指定的访问;
这两种名单中,白名单相对要安全的多,因此建议使用白名单
再考虑一个问题,在同一个钩子上有可能设置了多种不一样功能的多个规则,因而造成了多个链,这多个链谁先发挥做用谁后发挥做用呢?是先作filter后作nat仍是先作nat后作filter,这实际上是由既定法则在里头的,规则生效是有既定次序的:
功能的优先级次序:raw --> mangle --> nat --> filter
规则:
报文匹配规则,真正发挥做用的既不是iptables自己也不是netfilter自己,而是咱们添加进去的规则在发挥做用;
规则的组成部分(主要有两类):
匹配条件:根据协议报文特征指定匹配条件
匹配条件的机制或编写格式:
处理动做:(两种方式)
注意:报文不会通过自定义链,所以自定义链要想发挥做用,只能在内置链上经过规则引用后生效;说白了就是经过自定义处理机制进行引用;