学习的视频:http://edu.51cto.com/course/12914.html


IPTABLES LINUX防火墙

引言:
iptables作为一款老牌的Linux防火墙,给Linux系统提供了基于内核的安全防护机制。
优点:系统自带,无需安装,工作在OS底层(内核)从理论上说安全性更高;
缺点:学习难度高,配置项含义比较抽象,需要先搞清楚来龙去脉才能开始实际操作;

  • 防火墙的概念是什么
  • iptables是什么?做什么用?
  • iptables过滤型防火墙和win的对比
  • iptables4个表(tables)代表什么意思
  • iptables5个链(chain)代表什么意思
  • iptables链和内核功能块的关系
  • 通过数据包走向 分上下路 学习内核五个链的具体的功能以深入理解“五链”
  • PREROUTING上路判定(离开内核)学习 ->filter功能
  • PREROUTING下路判定(内核保留)学习 ->nat功能

防火墙的概念是什么

防火墙说白了其实是一种隔离技术,就是把从外面进来的访问按照事先定义好的一套规则进行过滤,合格的允许通过,不合格的就直接丢弃。
防火墙有硬件的、有软件的,有应用层的、有底层的。

iptables是什么?做什么用?

iptables其实是经过几个阶段发展而来的,ipfirewall > ipchains > iptables;

iptables在Linux系统中身份比较特殊
第一:表面上iptables是一个命令,也是一个服务;
iptables -h 查看使用手册
chkconfig --list | grep iptables
service iptables start/stop
然而使用ps或top命令是看不到iptables服务或进程的
为什么会出现这种现象呢?
因为iptables防火墙其实是系统内核的一部分,真正干活的实际上是内核当中一个叫做Netfilter的功能框架,也就是Linux内核利用其自身对于网络数据包的流向判断来间接起到防火墙的功能。
iptables只是作为方便我们用户随时控制内核中Netfilter功能的一个平台,可以理解为是一个“bash”。

iptables过滤型防火墙和win的对比

iptables -A input -s 172.16.0.0/16 -j DROP
iptables -L 查看规则
iptables -A input -s 192.168.0.0/16 -j ACCEPT
两个很简单的入门级设置

iptables4个表(tables)代表什么意思

“过滤型”防火墙是用得比较多的
过滤型防火墙规则,在iptables当中,实际上对应的是iptables当中的一个“表”,也就是filter表;
iptables中有4种标准化预定义的表:
filter/nat/mangle/raw
filter table主要是起到过滤的作用,根据一定的规则,把即将发送到OS的请求或者是即将发送出OS的请求(或者是转发的请求)预先做一个判断,根据判断结果,决定是否放行。这个是防火墙最基础也是使用频率最高的用法。
filter为默认表,-t table 常省略。
nat table network address translation 网络地址转换,是一种对数据包的特殊处理,主要的目的是把发送过来的请求,更改其原始的目的地址/端口或者更改其来源地址,达到数据转发的目的。
很多架构的应用,也是基于这种原理实现的,比如:反向代理,负载均衡等等。
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --192.168.102.37:22

iptables5个链(chain)代表什么意思

表在防火墙中是一个逻辑的大分类,在种类定下来后,才是真正开始定制规则了,在Linux当中,真正定义和实现防火墙功能的是五个链,可以理解为链是附属于每个表下面的。
定义防火墙规则,先按实现的功能不同,定义出不同的表,再在表下添加链,再加上对链的修饰,就最终组成了防火墙规则。
表+链+链修饰(规则)=一条防火墙规则

iptables一共有5种链,这5种链实际上对应着一个数据包的每个步骤:
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROOUTING:发送到网卡接口之前

iptables链和内核功能块的关系

                                              用户空间
                                    input          output
            请求  >  prerouting     内核空间         postrouting      出去
                                                forward

数据包刚刚到达时,不会立刻进入用户空间,必须先经过内核的筛选,才会进入(不管你是否设定iptables)。
重点:

  • 内核有FORWARD路由功能, ip v4 forward=1;
  • 内核还有针对路由功能的防火墙链,FORWARD链;
    这是两个概念,还是两个是直接相关的概念,
    5个链有好几层含义:
  • 命令行中,可以定义配置这5个链
  • 对应内核中Netfilter框架的5个功能块
  • 这5个功能块,对应的是内核代码中的5个钩子函数

最重要的一个核心理念:
误区:认为iptables本身是一个服务,把这个服务起来,防火墙就起来了。
执行service iptables stop命令时,只是改变了表下所有链的规则都设置成允许罢了,就跟没有防火墙一样了,但是内核的防火墙功能块始终都存在,你永远不可能关闭的。

通过数据包走向 分上下路 学习内核五个链的具体的功能以深入理解“五链”

第一个要经过的是内核中的PREROUTING链
可以拆为 PRE ROUTING 路由前
该链对数据包的判断,只会有2中结果:1.不需要经过路由转发2.需要路由转发;简单的说就是1.发给我本机的,2.发给别的地方的。
PREROUTING链作为第一道关卡,它检查数据包的机制就是判断数据包的目的地址、端口。

既然一个数据包都已经被我这台机器收到了,那它的原本的目的地址一定是我这台机器啊,怎么可能还会是发给别的地址呢?其实这就要说到PREROUTING链的功能的本质了,PREROUTING链和POSTROUTING这两个链其最终的目的,都是用来修改数据包的地址和端口的(在匹配上了规则之后)
PREROUTING链负责修改目的地址和端口
POSTROUTING链负责修改来源地址和端口
数据包到达第一个PREROUTING链时,PREROUTING链会根据它下面的事先定义好的规则(修饰)先来判断,这个数据包是否要被我修改目的地址和端口。
例子:
iptables -t nat -A PREROUTING -s 172.16.0.0/8 -d 192.168.56.102 -p tcp -j DNAT --to-destination 192.168.56.103
如果符合了上面的规则,则目标地址会被修改
如果不符合上面的规则,则目标地址不会被修改
如果发现这个数据包并不符合任何链下面的规则的话,这个包的目的地址和端口都不会被修改
那么这种情况下数据包就会被PREROUTING链判定为这个数据包不需要被修改,这个一个进入主机的数据包,相反的,这个数据包符合其中一条PREROUTING链的规则,就会判定这个数据包需要被修改,并且这是个要递交给路由的数据包。看是走“上路”进入input还是“下路”进入forward。

PREROUTING最终判定上路(离开内核)学习 ->filter功能

进入用户空间,INPUT链,是一个内核空间和用户空间的关卡,就是最常配置的链了。防住任何对用户空间有害的请求。
走“上路”实际上就是过滤型的防火墙;
filter表可以配置的链有3个:input, output, forward。

PREROUTING最终判定下路(内核保留)学习 ->nat功能

走”上路”的有个特殊的,比如port修改了IP不变,IP是本机的IP,这个虽然是修改port的,但还是走“上路”。
重要知识点:
数据包提交给FORWARD链,FORWARD链判断后提交给路由表,但提交给路由表不一定执行所谓的路由功能,要取决于目的地址在路由表的判定,有可能直连,有可能路由,有可能丢弃。
完整的“下路”数据包流程:
PREROUTING链->FORWARD链->路由表->路由功能判定->POSTROUTING链->下一层网络目的地。