iptables防火墙从入门到掌握

防火墙简述

防火墙(firewall)一词本是建筑用于,本意是为了保护建筑物不受火灾侵害的。被借鉴到了在网络通信领域中,表示保护局域网或主机不受网络攻击的侵害。

防火墙: 工作在主机或者网络边缘,对于进出的数据报文按照事先定义好的规则进行检查,监控,一旦符合标准,我们就按照事先定义好的规则处理动作的一套机制组件叫做(网络)(主机)防火墙

目前市面上比较常见的有3,4层的防火墙,叫做网络层防火墙,还有七层的防火墙,其实是代理层的网关.

对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测,但是对于七层的防火墙,不管你是源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查. 所以对于设计原理来讲,七层防火墙更加安全, 但是这却带来了效率更低, 所以市面上通常的防火墙方案,都是两者结合的. 而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能访问数据多少的一个最重要的控制,配置的不好甚至可能成为流量的瓶颈.

根据防范的方式和侧重点的不通分为很多种类型, 但总体来讲可分为包过滤防火墙和代理服务器两种类型.

/*
		Framework:  
				默认规则:
						开放: 堵
						关闭: 通
		规则: 匹配标准
				IP: 源IP,目标IP
				TCP: SPORT,DPORT
				UDP: SPORT,DPORT
				ICMP: icmp-type
		数据报文过滤:
*/

防火墙分类

主机防火墙

工作在某个主机边缘,主要对进出本主机

报文的分层识别,都是在系统内核级别实现的,故防火墙也工作在单台主机内核空间中[TCP/IP协议栈上],其只能作用于单台主机

网络防火墙

网络中的防火墙设备,可分为三种:代理防火墙、包过滤防火墙、状态监测防火墙。

代理防火墙

代理防火墙是代理内网主机上网的设备,可以是路由器,也可以是一台主机两块网卡,一连内网、一连公网,以代替内网主机访问公网资源,又被称为nat(网络地址转换服务器、或nat堡垒服务器);

工作原理

在应用层实现防火墙功能, 提供部分和传输有关的状态,能完全提供与应用相关的状态和部分传输的信息,他还能处理和管理信息.

包过滤防火墙

包过滤防火墙是检测所通过数据包,可监测到数据包中源ip、目的ip、源端口、目的端口、标记位等信息,并根据事先制定的通信规则决定数据包是否转发;

工作原理

在网络层对数据包进行选择过滤,采用访问控制列表(Access control table -ACL)检查数据流的源地址,目的地址,源和目的端口,IP等信息.

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数Linux软件一样, 这个包过滤防火墙是免费的, 他可以替代昂贵的商业防火墙解决方案,完成封包过滤,封包重定向和网络地址转换(NAT)等功能.

状态监测防火墙

状态监测防火墙除了可以监测数据包中的内容外,还可以跟踪每个客户的每次通信,当有攻击数据在开始时伪装成正常访问,之后突然开始做攻击时,会被状态监测防火墙监测到并加以屏蔽。

在Linux系统中,防火墙工具使用的是iptables,可实现代理防火墙、包(数据报文)过滤防火墙,nat,mangle等规则的功能,而状态监测防火墙一般是企业购买专用的防火墙设备完成的。

软件防火墙

软件逻辑实现

软件防火墙由工作在通用计算机[即x86系列cpu]上的系统内核通过调用底层通用cpu指令集实现;

硬件防火墙

硬件和软件逻辑组合实现,为某种特殊功能设计和实现,灵活性差

硬件防火墙使用专业的CPU,其在CPU的硬件级别就能完成对于报文的拆封操作;其只能实现防火墙数据流控制的相关功能;

性能很好[因为其在CPU的指令级别就已经实现了相对复杂的功能,其不用在逻辑层进行复杂的指令组合即可完成对应功能

数据流向
/*
		数据包--> 网卡驱动 --> 内核内存空间--> TCP/IP协议栈分析目标IP 
		-->若是本机ip,则再查看端口并交由相关程序 
		--> 若不是本机ip,当开启路由转发功能后,
		内核将会查看本机路由表,将数据包交由对应网卡接口,作为下一跳;
		若没有路由条目,则将此报文交由默认网关,由默认网关将其转发到相关主机;
*/
Linux内核通信逻辑

通信是进程之间进行的, 客户端和服务端的程序通过建立tcp连接, 通过套接字进行数据传输.

将所有端口开放给所有内部主机,以保证通信的正常进行, 而防火墙为了保证安全, 在所有端口之外进行了限制, 只有某些规定允许的端口才能开放给外部主机进行访问使用

Linux防火墙的发展:

/*
  1.0时代 --> ipfirewall
  2.0时代 --> ipchains
  3.0时代 --> iptables
  4.0时代 --> nftables
*/

Iptables工作原理(四表五链)

五链

五个钩子函数(hook functionns),也叫五个规则(rules)链(chains) (数据包传播的路径)

/*
		prerouting   路由前
		input				 数据包流入口
		forward			 转发网卡
		output			 数据包出口
		postrouting	 路由后
*/

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过五个链中的其中一个链

防火墙策略一般分为两种, 一种叫"通"策略,一种叫"堵"策略:

/*
		通策略, 默认门是关着的, 必须要定义谁能进.
		堵策略,大门是打开的,但是你必须有身份你认证,否则不能进去.
*/
表的概念

我们再想想另外一个问题,我们对每个”链”上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起呢,必须能的。

我们把具有相同功能的规则的集合叫做”表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围,所以,学习iptables之前,我们必须先搞明白每种表 的作用.

iptables为我们提供了如下规则的分类,或者说,iptables为我们提供了如下"表"

/*
		filter表:负责过滤功能,防火墙;内核模块:iptables_filter
    nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
    mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
    raw表:关闭nat表上启用的连接追踪机制;iptable_raw
    也就是说,我们自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张"表"中。
*/

Filter

filter实现包过滤,定义允许或者不允许的[ 只能做在3个链上: INPUT表(进入的包), FORWORD(转发的包), OUTPUT(处理本地生成的包), filter表只能对包进行接收和丢弃的操作.

NAT

nat网络地址转换(只能做在3个链上: Prerouting(修改即将到来的数据包), output(修改在路由之前本地生成的数据包), Postrouting(修改即将出去的数据包)

Mangle

mangle包重构(修改), 修改报文原数据就是来修改TTL的, 能够实现将数据包的元数据拆开, 在里面做标记/修改内容的. 而防火墙标记, 其实就是靠mangle来实现的. 五个链都可以做.

raw

数据跟踪处理

Iptables传输数据包过程

1. 当一个数据包进入网卡时, 他首先进入prerouting链, 内核根据数据包目的IP判断是否传送出去.

2. 如果数据包进入本机, 他就会沿着图向下移动, 到达input链, 数据包到了input链后,任何进程都会收到他,本机上运行的程序可以发送数据包, 这些数据包会经过output链, 然后到达postrouting链输出

3. 如果数据包要转发出去,且内核允许转发,数据包就会如图所示向右移动,经过Forward链, 然后到达Postrouting链输出

iptables/netfilter(这款软件)是工作在用户空间的,他可以让规则进行生效的,本身不是一种服务, 而且规则是立即生效的, 而我们iptables现在被做成了一个服务, 可以进行启动,停止的, 启动,则将规则直接生效, 停止,则将规则撤销.

自定义链

iptables还支持自己自定义链, 但是自己自定义的链, 必须是跟某种特定的链关联起来的, 在一个关卡设定, 指定当有数据的时候专门去找某个特定的链来处理, 当那个链处理完之后, 再返回,接着在特定的链中继续检查.只有在被调用时才能发挥作用, 而且如果没有自定义链中的

注意: 规则的次序非常关键,检查规则是按照从上往下的方式进行检查的

/*
		用户可以删除自定义的空链
		默认链无法删除
		
		每个规则都有两个内置的计数器
				被匹配的报文个数
				被匹配的报文体积大小之和
*/
表链关系

但是我们需要注意的是,某些”链”中注定不会包含”某类规则”,就像某些”关卡”天生就不具备某些功能一样,比如,A”关卡”只负责打击陆地敌人,没有防空能力,B”关卡”只负责打击空中敌人,没有防御步兵的能力,C”关卡”可能比较NB,既能防空,也能防御陆地敌人,D”关卡”最屌,海陆空都能防。

那让我们来看看,每个”关卡”都有哪些能力,或者说,让我们看看每个”链”上的规则都存在于哪些”表”中。

我们还是以图为例,先看看prerouting”链”上的规则都存在于哪些表中。

这幅图是什么意思呢?它的意思是说,prerouting”链”只拥有nat表、raw表和mangle表所对应的功能,所以,prerouting中的规则只能存放于nat表、raw表和mangle表中。

我们总结一下,每个关卡都拥有什么功能

/*
			PREROUTING      的规则可以存在于:raw表,mangle表,nat表。
      INPUT          的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
      FORWARD         的规则可以存在于:mangle表,filter表。
      OUTPUT         的规则可以存在于:raw表mangle表,nat表,filter表。
      POSTROUTING      的规则可以存在于:mangle表,nat表。
*/

但是,我们在实际的使用过程中,往往是通过”表”作为操作入口,对规则进行定义的,之所以按照上述过程介绍iptables,是因为从”关卡”的角度更容易从入门的角度理解,但是为了以便在实际使用的时候,更加顺畅的理解它们,此处我们还要将各”表”与”链”的关系罗列出来,

表(功能) <--> 链(钩子)

/*
		raw 表中的规则可以被那些链使用:  prerouting,output
		mangle表中的规则可以被那些链使用:  prerouting, input, forward,output, postrouting
		nat表中的规则可以被那些链使用:  prerouting, output, postrouting (centos7中还有input,centos6中没有)
		filter表中的规则可以被那些链使用:  input,forward,output
*/

其实我们还需要注意一点,因为数据包经过一个”链”的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同功能类型的规则会汇聚在一张”表”中,那么,哪些”表”中的规则会放在”链”的最前面执行呢,这时候就需要有一个优先级的问题

iptables为我们定义了四张表, 当他们处于同一张链时, 执行的优先级如下

/*
		prerouting链中的规则存放于三张表中, 而这三张表的规则执行优先级如下:
			raw --> mangle --> nat

		优先级次序(由高而低)
			raw --> managle --> nat --> filter
*/

但是我们前面说过,某些链天生就不能使用某些表中的规则,所以,4张表中的规则处于同一条链的目前只有output链,它就是传说中海陆空都能防守的关卡。

为了更方便的管理,我们还可以在某个表里面创建自定义链,将针对某个应用程序所设置的规则放置在这个自定义链中,但是自定义链接不能直接使用,只能被某个默认的链当做动作去调用才能起作用,我们可以这样想象,自定义链就是一段比较”短”的链子,这条”短”链子上的规则都是针对某个应用程序制定的,但是这条短的链子并不能直接使用,而是需要”焊接”在iptables默认定义链子上,才能被IPtables使用,这就是为什么默认定义的”链”需要把”自定义链”当做”动作”去引用的原因。这是后话,后面再聊,在实际使用时我们即可更加的明白。

结合上述所有的描述,我们可以将数据包通过防火墙的流程总结为下:

我们在写Iptables规则的时候,要时刻牢记这张路由次序,灵活配置规则。

我们将经常用到的对应关系重新写在此处,方便对应图例查看。

链的规则存放于哪些表中(从链到表的对应关系):

/*	
		PREROUTING  的规则可以存在于:raw表,mangle表,nat表。
		INPUT     的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
		FORWARD    的规则可以存在于:mangle表,filter表。
		OUTPUT    的规则可以存在于:raw表mangle表,nat表,filter表。
		POSTROUTING  的规则可以存在于:mangle表,nat表。
		
		
		表中的规则可以被哪些链使用(从表到链的对应关系):
		raw   表中的规则可以被哪些链使用:PREROUTING,OUTPUT
		mangle  表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
		nat   表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
		filter  表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
*/

iptables规则写法

规则的概念

规则

根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;

那么我们来通俗的解释一下什么是iptables的规则,之前打过一个比方,每条”链”都是一个”关卡”,每个通过这个”关卡”的报文都要匹配这个关卡上的规则,如果匹配,则对报文进行对应的处理,比如说,你我二人此刻就好像两个”报文”,你我二人此刻都要入关,可是城主有命,只有器宇轩昂的人才能入关,不符合此条件的人不能入关,于是守关将士按照城主制定的”规则”,开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,因为你符合”器宇轩昂”的标准,所以把你”放行”了,而我不符合标准,所以没有被放行,其实,”器宇轩昂”就是一种”匹配条件”,”放行”就是一种”动作”,”匹配条件”与”动作”组成了规则。

规则由匹配条件和处理动作组成

匹配条件

/*
		分为基本匹配条件与扩展匹配条件
		
		基本匹配条件:
				源地址Source IP, 目标地址DestinationIP.
				
		扩展匹配条件:
				分为
            1.隐含扩展: 不用特别指明那个模块进行的扩展,因为此时用-p {tcp|udp|icmp}
              除去上面条件可以用于匹配,还有其他条件可以用于匹配,这些条件泛称为扩展条件.
              这些扩展条件其实是netfilter中的一部分, 只是以模块的形式存在,如果想使用这些条件,则需要依赖对应的扩展模块.
              源端口Source Port,目标端口Destination Port
           
        		2.显式扩展: 必须指明由那个模块进行的扩展,在iptables中使用-m选项既可完成功能.
*/

处理动作

处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作.

/*
		ACCEPT:允许数据包通过。
    DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
    REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
    SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
    MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
    DNAT:目标地址转换。
    REDIRECT:在本机做端口映射。
    LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
*/

语法构成
/*
		iptables  [-t  表名]  选项  [链名]  [条件]  [-j 控制类型]
		
		注意事项
				1. 不指定表名时, 默认指filter表.
				2. 不指定链名时, 默认指表内的所有链.
				3. 除非设置链的默认策略, 否则必须指定匹配条件.
				4. 选项,链名,控制类型使用大写字母,其余均小写
*/
查看规则
/*	
				iptables -L INPUT --line-numbers
				-L:  列出所有规则条目
				-n:  以数字形式显示地址,端口等信息
				-v:  以更详细的方式显示规则信息
				--line-numbers:  查看规则时,显示规则的序号
*/
管理规则
/*
		添加新的规则:
				-A:  在链的末尾追加一条规则
				-I:  在链的开头(或指定序号)插入一条规则
				-s:  --src:  指定源地址
				-d:  --dst:  指定目标地址
				-p:  {tcp|udp|icmp}:  指定协议
				-i(INTERFACE):  指定数据报文流入的接口PREROUINT.
				-o(INTERFACE):  指定数据报文流出的接口.


				iptables  -t filter -A INPUT -p tcp -j ACCEPT
				iptables  -I INPUT  -p udp -j ACCEPT
				iptables  -I INPUT 2 -p icmp  -j ACCEPT
				
		替换规则
				-R CHAIN [num]:  替换指定的规则

		删除,清空规则
				-D: 删除链内指定序号(或内容)的一条规则.
				-F: 清空所有的规则链
				
				iptables -D INPUT 3
				iptables -n -L INPUT
				
		设定指定链默认规则
*/
控制类型
/*
		1. ACCEPT: 		允许通过
		2. DROP:  		直接丢弃,不给出任何回应
		3. REJECT: 		拒绝通过,必要时会给出提示.
		4. LOG:  			记录日志信息, 然后传给下一条规则继续匹配
		5. SNAT:  		修改数据包源地址
		6. REDIRECT:  重定向
*/

iptables禁止某IP访问

在CentOS下封停IP,有封杀网段和封杀单个IP两种形式。一般来说,现在的攻击者不会使用一个网段的IP来攻击(太招摇了),IP一般都是散列的。于是下面就详细说明一下封杀单个IP的命令,和解封单个IP的命令。

在CentOS下,使用ipteables来维护IP规则表。要封停或者是解封IP,其实就是在IP规则表中对入站部分的规则进行添加操作。

要封停一个IP,使用下面这条命令:

iptables -I INPUT -s ***.***.***.*** -j DROP

要解封一个IP,使用下面这条命令

iptables -D INPUT -s ***.***.***.*** -j DROP

参数-I是表示Insert(添加),-D表示Delete(删除)。后面跟的是规则,INPUT表示入站,...表示要封停的IP,DROP表示放弃连接。

此外,还可以使用下面的命令来查看当前的IP规则表:

iptables --list

比如现在要将123.44.55.66这个IP封杀,就输入:

iptables -I INPUT -s 123.44.55.66 -j DROP

要解封则将-I换成-D即可,前提是iptables已经有这条记录。如果要想清空封掉的IP地址,可以输入:

iptables --flush

要添加IP段到封停列表中,使用下面的命令:

iptables -I INPUT -s 121.0.0.0/8 -j DROP

其实也就是将单个IP封停的IP部分换成了Linux的IP段表达式。关于IP段表达式网上有很多详细解说的,这里就不提了。

相信有了iptables的帮助,解决小的DDoS之类的攻击也不在话下!

其他常用的命令

编辑 iptables 文件

vi /etc/sysconfig/iptables

关闭/开启/重启防火墙

/etc/init.d/iptables stop
#stop 关闭
#start 开启
#restart 重启

验证一下是否规则都已经生效:

iptables -L

保存并重启iptables

/etc/rc.d/init.d/iptables save
service iptables restart
或者通过host.allow限制特定IP来访
# 生效是立即发生的,但是对于已经打开的shell无效,所以一边留着shell设置,一边再开shell
tail -1 /etc/hosts.allow
sshd:39.108.140.0:allow        # 允许此IP登陆

tail -1 /etc/hosts.deny
sshd:all                       # 禁止所有机器登陆

tail -1 /etc/ssh/sshd_config
allowusers root@ip             # 允许某个IP用什么账户登陆,否则登陆不上去

cat /etc/ssh/sshd_config |grep 10086
Port 10086              
Tags: