Linux防火墙——iptables简介

一、防火墙相关概念

这里描述了一些相关的概念。

[En]

Some related concepts are described here.

从逻辑上讲,防火墙可以分为主机防火墙和网络防火墙。

[En]

Logically, firewalls can be divided into host firewalls and network firewalls.

主机防火墙:旨在保护单个主机。

[En]

Host firewall: designed to protect a single host.

网络防火墙:通常位于网络入口或边缘,旨在保护网络入口,以服务于防火墙后面的局域网。

[En]

Network firewall: often at the network entrance or edge, aimed at protecting the network entrance to serve the local local area network behind the firewall.

网络防火墙和主机防火墙之间不存在冲突,可以理解为网络防火墙主体(集体)外部和主机防火墙内部(个体)。

[En]

There is no conflict between the network firewall and the host firewall, which can be understood as outside the main body of the network firewall (collective) and inside the host firewall (individual).

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

[En]

Physically speaking, firewalls can be divided into hardware firewall and software firewall.

硬件防火墙:部分防火墙功能在硬件层面实现,另一部分基于软件实现,性价比高。

[En]

Hardware firewall: part of the firewall function is realized at the hardware level, and the other part is based on software, which has high performance and high cost.

软件防火墙:应用软件处理逻辑运行在低性能、低成本的通用硬件平台的防火墙上。

[En]

Software firewall: the application software processing logic runs on the firewall on the general hardware platform with low performance and low cost.

Linux防火墙——iptables简介

那么在此处,我们就来聊聊Linux的iptables。

iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫 netfilter

netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间,iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

Linux防火墙——iptables简介

用户 —> 调用iptables —> ip_tables内核模块 —> Netfilter(系统安全框架) —> 过滤请求

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

在数据传输过程,并不是一次性传输完成的;而是将数据分成若干个数据包,一点一点的传输

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

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

    and the firewall function of packet filtering*

所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

二、iptables基础

我们知道iptables是按照规则来办事的,我们就来说说规则(rules),规则其实就是网络管理员预定义的条件,规则一般的定义为”如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)和丢弃(DROP)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

这可能并不容易理解。让我们以一种容易理解的方式从头开始。

[En]

This may not be easy to understand. Let’s start from the beginning in a way that is easy to understand.

当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点,我们说过,netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到”防火”的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡, 而这些关卡在iptables中不被称为”关卡”,而被称为”链”

Linux防火墙——iptables简介

其实我们上面描述的场景并不完善,因为客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他”关卡”,也就是其他”链”,他们就是 “路由前”、”转发”、”路由后”,他们的英文名是:

  • PREROUTING
  • FORWARD
  • POSTROUTING

也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,根据实际情况的不同,报文经过”链”可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。

Linux防火墙——iptables简介

因此,根据上图,我们可以想象一些常见场景下的消息流:

[En]

So, based on the figure above, we can imagine the flow of messages in some common scenarios:

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

eg:由A经过B到达C的报文流向:
A —> OUTPUT —> POSTROUTING | —> PREROUTING —> FORWARD —> POSTROUTING —> B —> PREROUTING —> INPUT —> C

三、链的概念

现在,我们想象一下,这些”关卡”在iptables中为什么被称作”链”呢?我们知道,防火墙的作用就在于对经过的报文匹配”规则”,然后执行对应的”动作”,所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了”链”,所以,我们把每一个”关卡”想象成如下图中的模样 ,这样来说,把他们称为”链”更为合适,每个经过这个”关卡”的报文,都要将这条”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。

Linux防火墙——iptables简介

四、表的概念

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

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

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

  • filter表:负责过滤功能,防火墙;内核模块:iptables_filter
  • nat表:网络地址转换功能;内核模块:iptable_nat
  • mangle表:拆解报文,做出修改,并重新封装的功能;内核模块:iptable_mangle
  • raw表:负责数据包跟踪功能;内核模块:iptable_raw

换句话说,我们定制的所有规则都是这四个类别中的规则,或者说所有的规则都存在于这四个“表”中。

[En]

In other words, all the rules we customize are the rules in these four categories, or all the rules exist in these four “tables”.

五、表链关系

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

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

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

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

Linux防火墙——iptables简介

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

因此,基于以上思路,让我们来总结一下每一层都有哪些功能,也就是说,每一层中的规则都存在于哪些表中。

[En]

So, based on the above ideas, let’s summarize what functions each “level” has, that is to say, in which “tables” the rules in each “chain” exist.

- 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

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

Linux防火墙——iptables简介

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

raw –> mangle –> nat

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

优先级顺序(从高到低):

[En]

Priority order (from high to low):

raw –> mangle –> nat –> filter

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

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

六、数据经过防火墙的流程

在介绍数据通过防火墙的流程之前,我们需要弄清楚这五条链在防火墙中运行的位置,然后才能理解以下流程介绍图。以下是一个一般性的解释:

[En]

Before introducing the process of data passing through the firewall, we need to figure out where these five chains are running in the firewall before we can understand the following process introduction diagram. Here is a general explanation:

    1) PREROUTING: 主机外报文进入位置
    2) INPUT:报文进入本机用户空间位置
    3) OUTPUT:报文从本机用户空间出去的位置
    4) FOWARD:报文经过路由并且发觉不是本机决定转发但还不知道从哪个网卡出去
    5) POSTROUTING:报文经过路由被转发出去

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

[En]

Combined with all the above descriptions, we can summarize the process of packets passing through the firewall as follows:

Linux防火墙——iptables简介

如果想要Linux主机支持转发,则需要开启内核的IP_FORWARD功能,可以临时修改对应文件:/proc/sys/net/ipv4/ip_forward

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

我将在这里重写常用的通信,以方便查看相应的图例:

[En]

I will rewrite the commonly used correspondence here to facilitate the corresponding legend to view:

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

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

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

[En]

Which chains can be used by the rules in the table (the correspondence from the table to the chain):

  • raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT
  • mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  • nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
  • filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

下图中nat表在centos7中的情况就不再标明:

Linux防火墙——iptables简介

说了这么多,关于iptables的实际操作部分我们还没进行介绍,那关于iptables的使用相关请移步我的下一篇博客:iptables的使用

Original: https://www.cnblogs.com/JZjuechen/p/15738180.html
Author: JZEason
Title: Linux防火墙——iptables简介

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524240/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 应用配置管理,基础原理分析

    工程可以有点小乱,但配置不能含糊; 一、配置架构 在微服务的代码工程中,配置管理是一项复杂的事情,即需要做好各个环境的配置隔离措施,还需要确保生产环境的配置安全;如果划分的微服务足…

    Linux 2023年6月14日
    0112
  • IDEA版本与MAVEN版本对应关系,及历史MAVEN版本下载【转】

    1、查看自己的IDEA版本 Help -> About 3、下载指定版本MAVEN Original: https://www.cnblogs.com/fb010001/p/…

    Linux 2023年6月8日
    097
  • MacOS设置终端代理

    前言 国内的开发者或多或少都会因为网络而烦恼,因为一些特殊原因有时候网络不好的时候需要使用代理才能完成对应的操作。原来我一直都是使用斐讯路由器然后刷了梅林的固件,直接在路由器层面设…

    Linux 2023年6月14日
    093
  • MySQL 知识点总结(简易版)

    MySQL 总结(简易版) 基本语法 0. 1基本语法 登录MySQL $ mysql -u root -p12345612 &…

    Linux 2023年6月7日
    0100
  • Redis源码学习

    为什么要阅读Redis源码? 主要原因就是『简洁』。如果你用源码编译过Redis,你会发现十分轻快,一步到位。其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你源码编…

    Linux 2023年5月28日
    092
  • Java 内功修炼 之 数据结构与算法(二)

    一、二叉树补充、多叉树 1、二叉树(非递归实现遍历) (1)前提前面一篇介绍了 二叉树、顺序二叉树、线索二叉树、哈夫曼树等树结构。可参考:https://www.cnblogs.c…

    Linux 2023年6月11日
    080
  • pymysql模块的使用

    pymysql模块的使用 import pymysql 1、连接数据库 conn = pymysql.connect( user=’root’, # The first four …

    Linux 2023年6月14日
    090
  • Linux之NFS

    一、什么是NFS 共享存储,文件服务器 1.1 基本概述 NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共…

    Linux 2023年5月27日
    078
  • Java基础系列–01_基础类型

    J2SE、J2ME、J2EE分别指什么?J2SE 基础版,桌面应用。J2ME 微型版,手机开发。(android,ios)J2EE 企业版,所有浏览器访问的应用程序。注意:JDK5…

    Linux 2023年6月7日
    097
  • mac如何安装FinalShell

    1、Mac一键安装脚本: curl -o finalshell_install.sh www.hostbuf.com/downloads/finalshell_install.sh…

    Linux 2023年5月28日
    097
  • ShardingSphere-proxy-5.0.0建立mysql读写分离的连接(六)

    一、修改配置文件config-sharding.yaml,并重启服务 # Licensed to the Apache Software Foundation (ASF) unde…

    Linux 2023年6月14日
    0112
  • POJ1322Chocolate–概论DP

    每次从包装中取出一块巧克力并放在桌子上。如果桌子上有两个相同颜色的巧克力,则将这两个丢掉。如果包中有C种颜色的巧克力(颜色均匀分布),从包装中取出N个巧克力后,桌子上确实有M个巧克…

    Linux 2023年6月7日
    0116
  • mac安装homebrew

    1.安装连接 按照下面链接安装https://brew.sh/ 2.百分之99会报错curl: (7) Failed to connect to raw.githubusercon…

    Linux 2023年6月14日
    086
  • Kubernetes中的网络

    一、引子 既然Kubernetes中将容器的联网通过插件的方式来实现,那么该如何解决这个的联网问题呢? 如果你在本地单台机器上运行docker容器的话注意到所有容器都会处在 doc…

    Linux 2023年6月14日
    094
  • VirtualAlloc加载shellcode免杀一点记录

    一个很好的学习网站 推荐一下: https://docs.microsoft.com/zh-cn/windows/win32/api/ 0x01 VirtualAlloc Virt…

    Linux 2023年5月28日
    081
  • Weblogic页面应用查询oracle数据库后台报错或页面日期格式显示错误

    问题:在生产环境中有两台WEB服务器,分别为227和228,部署的应用代码都是每日同步的,两边完全一致,但是某些页面查询数据时,227无结果,并且后台报java数组越界的错误,而2…

    Linux 2023年6月14日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球