linux iptables 防火墙

  |  

iptables是linux下的防火墙,可以用来过滤网络数据包,防止恶意攻击,也可以用来做端口转发,端口映射等。docker以及k8s中的网络也广泛的使用了iptables的功能。

以下内容主要是整理的学习笔记,参考了以下文章:iptables详解-朱双印博客

iptables基本概念

从物理上来说,防火墙可以分为硬件防火墙和软件防火墙。

  • 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。比如:Cisco PIX、Cisco ASA、Juniper NetScreen、Fortinet FortiGate、Check Point Firewall-1等。
  • 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。比如:iptables、ipfw、pf、ipf、ipchains等。

这里我们主要讲解软件防火墙 iptables

iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架,真正的框架位于内核空间,这个框架的名字叫netfilter,netfilter才是防火墙真正的安全框架(framework),所有的数据包都要经过netfilter,netfilter根据设定的规则对数据包进行过滤,然后决定是否放行,netfilter的规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,netfilter就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

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

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(Network Address Translate)
  • 数据包内容修改
  • 数据包过滤的防火墙功能

iptables的链

首先要了解一下iptables的规则,iptables的规则由匹配条件和处理动作组成,含义为当数据包满足匹配条件时,执行处理动作。

下面我们来通过几个具体的例子来理解iptables中的几个概念。

例子1:web服务通信

比如我们有一个网站www.demo.com,这个网站我们部署在服务器node1上。那么用户访问这个网站的过程中防火墙是怎样起作用的呢?

  1. 客户端需要访问web服务的时候,客户端会将请求报文发送到服务器的网卡上。
  2. 网卡会将报文交给内核的TCP/IP协议栈,TCP/IP协议栈会将报文交给内核的netfilter模块。
  3. netfilter会根据iptables的规则对报文进行过滤,如果报文满足某个规则,那么就会执行这个规则对应的动作,比如放行,拒绝等。
  4. 如果报文满足放行的条件,那么就会交给用户空间中的web服务进程,web服务进程会对报文进行处理,然后返回响应报文。
  5. 响应报文会经过内核的netfilter模块,netfilter会根据iptables的规则对报文进行过滤,如果报文满足某个规则,那么就会执行这个规则对应的动作,比如放行,拒绝等。
  6. 如果报文满足放行的条件,那么就会交给内核的TCP/IP协议栈,TCP/IP协议栈会将报文交给网卡,网卡会将报文发送给客户端。
  7. 客户端收到响应报文,然后显示网页。

input-output

可以看到,数据报文经过了两个逻辑区域input和output,这两个区域中分别有对应的规则,和一条链一样,因此我们可以把input和output称为链,这就是iptales中的input链和output链。

例子2:web服务转发

我们在上面的例子中,我们的web服务是部署在node1上的,那么如果我们想要将web服务部署在node2上,而只有node1对外提供访问,那么我们就需要将node1上的请求转发到node2上(node1内核需要支持IP_FORWARD),这个过程中防火墙是怎样起作用的呢?

  1. 客户端需要访问web服务的时候,客户端会将请求报文发送到node1服务器的网卡上。
  2. 网卡会将报文交给内核的TCP/IP协议栈,TCP/IP协议栈会将报文交给内核的netfilter模块。
  3. netfilter会根据iptables的规则对报文进行过滤,如果报文满足某个规则,那么就会执行这个规则对应的动作,比如放行,拒绝等。
  4. 报文满足条件后,netfilter会发现目标不是本机,而是node2服务器,那么就会走转发链,转发链会将报文转发给node2服务器。
  5. node2服务器收到报文后,就会走node2机器的input链、output链,然后返回node1响应报文。
  6. 响应报文会再通过node1的转发链转发给客户端。
  7. 客户端收到响应报文,然后显示网页。

forward

iptables的链

我们通过上面的两个例子,可以大致了解iptables的链的概念,那么iptables中的链有哪些呢?

iptables中的链有5个,分别是input、output、forward、prerouting、postrouting,他们的作用范围如下图:

iptables-chain

根据上图,我们能够想象出某些常用场景中,报文的流向:

  • 到本机某进程的报文:PREROUTING –> INPUT
  • 由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
  • 由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING

iptables的表

表的概念

现在我们我们有了5个链,那么我们就需要在链中添加规则,那么规则是怎样存储的呢?不可能每个链都有一个规则列表吧,那样太麻烦了。

在iptables中,规则是存储在表中的,iptables中的表有4个,分别是filter、nat、mangle、raw,他们的作用范围如下图:

  • filter表:负责过滤功能,防火墙;内核模块:iptables_filter
  • nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
  • mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
  • raw表:关闭nat表上启用的连接追踪机制;iptable_raw

也就是说,我们自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张“表”中。

表和链的关系

需要了解的是,某些链天生就不能使用某些表中的规则,比如input链就不能使用nat表中的规则,因为input链只能用于处理本机的数据包,而nat表中的规则是用于处理转发的数据包的。

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

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

注意:下图只用于说明prerouting链上的规则存在于哪些表中,并没有描述表的顺序。

iptables-table

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

根据上图,我们大致可以总结出,每个”链”都拥有什么功能,或者说,每个”链”中的规则都存在于哪些”表”中。

  • PREROUTING 的规则可以存在于:raw表,mangle表,nat表。
  • INPUT 的规则可以存在于:mangle表,filter表,nat表。
  • FORWARD 的规则可以存在于:mangle表,filter表。
  • OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。
  • POSTROUTING 的规则可以存在于:mangle表,nat表。

表的使用以及优先级

实际使用的过程中,我们往往是通过”表”作为操作入口,对规则进行定义的,为了在实际使用的时候,更加顺畅的理解它们,此处我们还要将各”表”与”链”的关系罗列出来。

PREROUTING INPUT FORWARD OUTPUT POSTROUTING
raw × × ×
mangle
nat ×
filter × ×

上表中的√表示可以使用,×表示不能使用。

数据包经过一个”链”的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,它会一条一条的去匹配,既然规则都放在”表”中,那么哪些”表”中的规则会放在”链”的最前面执行呢,这时候就需要有一个优先级的问题,我们还拿之前“prerouting链”的图做示例。

prerouting链中的规则存放于三张表中,而这三张表中的规则执行的优先级如下:

raw –> mangle –> nat

但是我们知道,iptables为我们定义了4张”表”,所以当他们处于同一条”链”时,执行的优先级如下。

优先级次序(由高而低):raw –> mangle –> nat –> filter

为了更方便的管理,我们还可以在某个表里面创建自定义链,将针对某个应用程序所设置的规则放置在这个自定义链中,但是自定义链接不能直接使用,只能被某个默认的链当做动作去调用才能起作用。具体的内容我们会在后面的文章中进行总结。

数据经过防火墙的流程

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

iptables-flow

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

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

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

  • PREROUTING 的规则可以存在于:raw表,mangle表,nat表。
  • INPUT 的规则可以存在于:mangle表,filter表,nat表。
  • FORWARD 的规则可以存在于:mangle表,filter表。
  • OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。
  • POSTROUTING 的规则可以存在于:mangle表,nat表。

表中的规则可以被哪些链使用(从表到链的对应关系):

  • raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT
  • mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  • nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING,INPUT
  • filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

iptables的规则

规则的概念

在上面的内容中,我们已经了解了iptables的链和表,那么我们来聊聊规则的概。

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

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

规则的匹配条件

规则的匹配条件分为基本匹配条件与扩展匹配条件

基本匹配条件:

  • 源地址Source IP
  • 目标地址 Destination IP

上述内容都可以作为基本匹配条件。除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。

扩展匹配条件:

  • 源端口Source Port
  • 目标端口Destination Port

规则的处理动作

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

以下是一些常用的动作,之后的文章会对它们进行详细的示例与总结:

  • ACCEPT:允许数据包通过。
  • DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
  • DNAT:目标地址转换。
  • REDIRECT:在本机做端口映射。
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
文章目录
  1. 1. iptables基本概念
    1. 1.1. iptables的链
      1. 1.1.1. 例子1:web服务通信
      2. 1.1.2. 例子2:web服务转发
      3. 1.1.3. iptables的链
    2. 1.2. iptables的表
      1. 1.2.1. 表的概念
      2. 1.2.2. 表和链的关系
      3. 1.2.3. 表的使用以及优先级
      4. 1.2.4. 数据经过防火墙的流程
    3. 1.3. iptables的规则
      1. 1.3.1. 规则的概念
      2. 1.3.2. 规则的匹配条件
      3. 1.3.3. 规则的处理动作