iptables部分概念
本篇内容非原创,由本人整理,仅供学习之用。部分原博参见脚注。
1. 防火墙简介
防火墙是一种应用于网络上的过滤机制,从保护对象上可分为:主机防火墙、网络防火墙,从物理上可分为:硬件防火墙、软件防火墙
对象分类
- 主机防火墙:针对于单个主机进行防护
- 网络防火墙:往往部署于网络边界,对流入以及流出的流量进行过滤
物理分类
- 硬件防火墙:拥有经过特别设计的硬件及芯片,性能高、成本高
- 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低、成本低
2. firewalld和iptables的异同
- 同:firewalld 与 iptables 都是 Linux 中防火墙的管理程序,但其实其角色主要为对于防火墙策略的管理,真正的防火墙执行者是位于内核中的 Netfilter,因此iptables防火墙应该称为netfilter/iptables防火墙。
- 异:
- iptables 仅能通过命令行进行配置;而 firewalld提供了图形接口,类似windows防火墙的操作方式
- iptables 每一个单独更改意味着清除所有旧的规则,并从 /etc/sysconfig/iptables 中读取所有新的规则;
而 firewalld 在有规则变动后,可以仅仅运行规则中的不同之处,即在 firewalld 运行时间内,改变设置时可以不丢失现行链接 - iptables 的配置文件在 /etc/sysconfig/iptables 中;
而 firewalld 的配置文件在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中 - iptables 没有守护进程,并不能算是真正意义上的服务;而 firewalld 有守护进程
3.iptables基础
iptables 准确来讲并不是防火墙,真正的防火墙是运行于系统内核中的 netfilter,而 iptables 仅仅是 netfilter 的代言人,其所负责的主要功能便是与用户交互,获取到用户的要求,并转化成 netfilter 可以接受的信息。
防火墙的实现机制
防火墙的核心处理机制是过滤,而说到过滤,就必须具有“条件 & 动作”这两个关键要素,而在 iptables 中,这两种要素分别叫做“rule & target”,可以理解成符合 rule 的流量将会去往 target。匹配规则的要素
防火墙的处理对象是网络流量,而对于网络流量来讲,标识流量的最重要的信息便是五元组,包括:S_IP, S_PORT, D_IP, DI_PORT, TCP/UDP
iptables常用的也往往是根据五元组中的某个或某些要素进行过滤iptables策略
一般提到的iptables是netfilter/iptables框架中运行在用户空间的应用软件。它通过控制内核控件中的netfilter模块,来管理网络数据包的流动和转送。其中最核心的是定义iptables的策略。iptables策略是由一组有序的规则建立的,告诉内核如何处理数据包。iptables的概念从小到大是:iptables - 表 - 链 - 规则。
3.1 链
3.1.1 什么是链
为实现报文的安全传输,屏蔽某些攻击;或是转换报文的源、目标地址,内核开发者在5个精心选择的位置开发了钩子函数(即netfilter功能模块),用于实现在不同位置检查、处理流经的网络报文。相当于路上的卡点。
就是从报文进入到报文离开这整个期间,计算机处理报文的关键环节。
就好比污水处理厂,污水进入前得处理一下,进入后得沉淀一下,送回时又得进行一些处理,那么这3个节点就是关键环节。
3.1.2 为什么叫链
因为防火墙是对报文进行规则匹配,然后执行相应动作。但在关键环节上,往往不止一条规则,而是有大量的规则,而且这些规则都是按顺序排列的,待匹配的报文需要按顺序一个一个规则的进行匹配,直到匹配到一条规则为止,所以在每个关键环节上的匹配过程,就像是一条有顺序的链。
好比污水处理厂,必须在个别关键环节部署处理措施,比如在进入废水厂时,先进行一批处理。处理可能包括粗滤、细滤等各种方式,而且各种方式不能随意排列,必定是按照一定的顺序依次进行,比如先粗滤,再细滤。
3.1.3 链的种类及位置
iptables就是在以下链上定义规则的工具。
在netfilter/iptables框架中,在内核控件定义的5个位置以及对应规则链:
链 | 位置 |
---|---|
PREROUTING | 数据包刚刚进入网络层的位置 |
INPUT | 经路由判断,数据包从内核流入本机用户空间的位置 |
OUTPUT | 数据包从本机用户空间进程发出的位置,后接路由判断出口的网络接口 |
FORWARD | 经路由判断,数据包不进入本机用户空间,只是进行转发的位置 |
POSTROUTING | 数据包将通过网络接口出去的位置 |
记住,链其实就是报文处理的重要环节,所以很容易就得出有以下两个重要环节:
- INPUT:进入主机
- OUTPUT:离开主机
但还有一种复杂的情况,就是报文的目标并不是本主机,而只是借道本主机,希望通过本主机去往下一台主机。
就好比我们的这个污水处理厂只处理生活污水,并不具备能力可以完全处理工业污水,但是政府又要求我们要对工业污水进行一下简单的处理,之后再传送给工业污水处理厂。那么就容易得出以下三个重要环节(链):
- PREROUTING:路由前
- FORWARD:转发
- POSTROUTING:路由后
3.1.4 链生效的时机
链 | 生效时机 |
---|---|
PREROUTING | 报文到达主机网卡的一刹那,就会被主机的PREROUTING链上的规则检查 |
INPUT | 经过PREROUTING的报文,之后进行路由选择。如果是要发给主机某进程的报文,则经过INPUT链上定义的规则检查 |
OUTPUT | 主机要发送给其他主机的报文(不论是响应对方还是向对方主动发),首先经过OUTPUT链 |
FORWARD | 经过PREROUTING的报文,进行路由选择。如果是要发给其他主机的报文,则经过FORWARD链上定义的规则检查 |
POSTROUTING | 在本机报文发送出主机前一刹那,经过POSTROUTING链上的规则检查 |
下面的图中,红色箭头表示报文流入流程,绿色箭头表示报文转发流程,蓝色箭头表示报文流出流程。
为了便于理解,使用双网卡,但事实上PREROUTING、POSTROUTING与具体的网卡无关,就算只有一张网卡,流入的报文还是会第一时间被PREROUTING检查。
3.1.5 自定义链
上述5个链成为内置链。
还可根据需要自定义链,自定义链上的规则无法直接生效,要被某个内置链引用才可以。
创建自定义链:iptables -N CHAIN_NAME
调用格式:iptables …… -j CHAIN_NAME
这样做的目的,就是可以把某一类规则定义于一个自定义链中,从而可以一并引用或一并删除,而不用逐条规则处理。
3.2 表
3.2.1 什么是表
在每个链上都有一堆规则,但是部分规则是相似的,那我们把一些实现相同功能的规则放在一起,就能轻松的完成复用了。
好比污水处理厂,粗滤、细滤基本上是好多关键环节都要用到的,那何不将粗滤网与细滤网直接封装到一根管子里,要用的时候,直接整根管子接上去就能一次实现两个功能,岂不方便?
3.2.2 有哪些表
表名 | 内核模块 | 介绍 |
---|---|---|
filter | iptables_filter | 用于按规则过滤报文 |
nat | iptable_nat | 用于地址转换 |
mangle | iptable_mangle | 用于修改报文中的部分信息,拆解报文,进行修改,重新封装 |
raw | iptable_raw | 关闭 nat 表上启用的连接追踪机制 |
|security | - | 暂不介绍 |
3.3 链与表
3.3.1 iptables各表定义规则的链
表 | 可定义规则链 |
---|---|
filter | INPUT、FORWARD、OUTPUT |
nat | PREROUTING、INPUT、OUTPUT、POSTROUTING |
mangle | PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING |
raw | PEROUTING、OUTPUT |
3.3.2 优先级
有的链上可定义多个表的规则。
如果多个表的规则出现在同一链上,生效次序:
raw > mangle > nat > filter
在同一链上可定义多条同一表的规则(比如filter表),这些规则是自上而下依次匹配,如果找到匹配到的规则,则按此规则处理,后续规则不再匹配。
3.4 规则
规则主要包含两部分:条件、动作
3.4.1 匹配条件
iptables 主要是通过网络流量的五元组(某个或某些)来进行匹配,包括:
要素 | 名称 |
---|---|
S_IP | 源IP |
S_PORT | 源端口 |
D_IP | 目的IP |
D_PORT | 目的端口 |
TCP/UDP | 四层协议 |
3.4.2 处理动作
iptables 中称为 target,用于在数据包匹配一条规则时触发的一个动作。
动作 | 含义 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包。不回应任何信息,客户端只有当该链接超时后才会有反应 |
REJECT | 拒绝数据包。会给客户端发送一个响应的信息 |
REDIRECT | 在本机做端口映射 |
LOG | 在 /etc/log/messages 中留下记录,但并不对数据包进行任何操作 |
RETURN | 在调用链中继续处理数据包 |
SNAT | 源 NAT,解决私网用户用同一个公网 IP 上网的问题 |
MASQUERADE | 地址伪装。作用也是源地址转换,用于在转换成的地址不确定时使用。是 SNAT 的一种特殊形式,适用于动态的、临时会变的 IP 上 |
DNAT | 目的 NAT,解决私网服务端,接收公网请求的问题 |
3.4.3 通用处理动作
处理动作 | 意义 | 子选项 |
---|---|---|
LOG | 把匹配到的报文信息记录日志(/var/log/messages) | –log-level,定义日志级别,就和httpd的类似 |
- | - | –log-prefix,在每条日志前添加一些字符用于提示,最多不超过29字母 |
RETURN | 返回调用链 |
默认情况下自定义链的最后一条规则就是执行RETURN动作,使得没有规则匹配到时,能返回调用它的链。
3.4.4 filter表常用处理动作
ACCEPT、DROP、REJECT
3.4.5 nat表常用处理动作
SNAT、DNAT、MASQUERADE、REDIRECT
3.4.6 设置规则原则
- 同一表的同一链,规则自上而下依次匹配生效。只要匹配到,则执行对应处理动作,后续规则不再匹配。
- 原则上讲,对于同是ACCEPT处理动作的规则,匹配条件范围越大,越放在前。否则如果前N条不匹配,第N+1条匹配到了仍要放行,前面的规则匹配白白开销资源。
- 原则上讲,对于同是DROP、REJECT处理动作的规则,匹配条件范围越大,越放在前。
- 放行规则和拒绝规则相比,哪个匹配的范围越小,越放在前(范围小的可视为是做特殊处理,所以放在前面匹配)。
- 规则越少越好,多条规则如能合并,就合并。
- 匹配越频繁的规则,越写在前面。以减少该规则之前无效匹配的频率
[1] iptables详解 https://blog.youkuaiyun.com/chocolee911/article/details/80688200
[2] iptables https://blog.youkuaiyun.com/wangzhenyu177/article/details/78444788