【Docker】iptables基本原理

在当今数字化时代,网络安全问题变得越来越重要。为了保护我们的网络免受恶意攻击和未经授权的访问,我们需要使用一些工具来加强网络的安全性。其中,iptables是一个强大而受欢迎的防火墙工具,它可以帮助我们控制网络流量并保护网络资源。

从逻辑上讲,防火墙可以大体分为主机防火墙和网络防火墙。从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。

今天主要介绍的是如何通过iptables软件对本机的网络服务进行保护。

iptables概述

通过iptables,可以对本机提供的网络服务 (FTP、WEB、EMAIL、DB...) 进行保护,通过规则进行过滤。

iptables并不是真正的防火墙,可以理解为一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的安全框架中,这个安全框架才是真正的防火墙,这个框架的名字叫netfilter。

netfilter位于内核空间,而iptables其实是一个命令行工具,位于用户空间。

netfilter/iptables组成Linux平台下的包过滤防火墙。可以完成封包过滤、封包重定向和网络地址转换 (NAT) 等防火墙功能。

这是第一个要说的地方,iptables和netfilter的关系是一个很容易让人搞不清的问题。很多人知道iptables却不知道netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables目录下。

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

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

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

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

iptables基础

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

到本机某进程的报文:PREROUTING->INPUT

由本机转发的报文:PREROUTING-> FORWARD -> POSTROUTING

由本机的某进程发出报文 (通常为响应报文):OUTPUT-> POSTROUTING

链的概念

现在,我们想象一下,这些"关卡"在iptables中为什么被称作"链"呢?

我们知道,防火墙的作用就在于对经过的报文匹配"规则"然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样:

这样来说,把他们称为"链"更为合适,每个经过这个"关卡"的报文,都要跟这条"链"上的规则进行匹配,如果有符合条件的规则,则执行规则对应的动作。

防火墙要达到防火的目的,需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的都被阻拦。在iptables中,这些关卡称为链。之所以称为链,是因为防火墙的作用在于对经过每一个关卡的报文匹配规则,然后执行动作,而这个关卡上可能不止一条规则,当我们把多条规则串在一个链条上时,就形成了链。

五条规则链:

  1. PREROUTING(路由前)
  2. INPUT(数据包流入口)
  3. FORWARD(转发管卡)
  4. OUTPUT(数据包出口)
  5. POSTROUTING(路由后)

表的概念

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

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

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

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

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

filter表

filter表用于过滤数据包,是iptables默认的表。

shell 复制代码
$ sudo iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

nat表

nat表用于网络地址转换,例如将内网IP地址转换为公网IP地址。

shell 复制代码
$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

mangle表

mangle表用于修改数据包的TTL(生存时间)、TOS(服务类型)等信息。

shell 复制代码
$ sudo iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

raw表

raw表用于配置数据包的豁免规则,例如不被连接追踪等。

shell 复制代码
$ sudo iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

表与链的关系

由于每条链所处位置不同,需要发挥的功能不同,包含的规则也不同。因此某些链并不会包含某些规则。

prerouting input forword output postrouting
raw Y Y
mangle Y Y Y Y Y
filter Y Y Y
nat Y Y Y Y

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

  • 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,INPUT,OUTPUT,POSTROUTING
  • filter表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

数据包经过一条链时,会将当前链的所有规则都匹配一遍,匹配的时候会根据匹配规则依次执行。

iptables定义的4张表执行的优先级为:raw > mangle > nat > filter

规则

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

防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下从前到后进行过滤的。

防火墙如果根据设置的规则匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。

如果数据包在所有规则中没有匹配到明确的规则是阻止还是通过,从而会向下进行匹配直到匹配默认规则后,得到明确的默认规则,从而得出确认是阻止还是通过。

防火墙的默认规则是对应链里的所有规则执行完以后才会执行的(最后执行的规则)。

匹配条件

iptables可以根据不同的匹配条件来过滤网络数据包。iptables的匹配条件可以分为通用匹配条件和扩展匹配条件两种。

通用匹配条件:

  • -p:指定协议类型,如TCP、UDP、ICMP等。
  • -s:指定源IP地址或地址段。
  • -d:指定目标IP地址或地址段。
  • --sport:指定源端口号。
  • --dport:指定目标端口号。
  • -i:指定数据包进入的网络接口。
  • -o:指定数据包输出的网络接口。

扩展匹配条件:除了通用匹配条件其余可用于匹配的条件称为扩展配条件,这些扩展匹配条件在netfilter中以模块的形式存在,如果想使用这些条件,则需要依赖对应的拓展模块。

扩展匹配条件包括:

  • --mac-source:指定源MAC地址。
  • --mac-destination:指定目标MAC地址。
  • --state:指定连接状态,如NEW、ESTABLISHED、RELATED等。
  • --tcp-flags:指定TCP标志位。
  • --icmp-type:指定ICMP类型。
  • --limit:限制匹配规则的匹配次数。
  • --comment:为匹配规则添加注释。

处理动作

iptables规则的处理动作是指对匹配到的数据包所采取的操作。

常见的处理动作包括:

  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息。。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个相应的信息,客户端刚请求就会收到拒绝的信息。
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上。
  • DNAT:目标地址转换
  • REDIRECT:在本机做端口映射。
  • LOG:在/var/log/mesages文件中记录日志信息,然后将数据包传递给下一条规则。即除了记录外不对数据包做任何其他操作,仍然让下一条规则进行匹配

iptables的安装

iptables通常是Linux系统中自带的一部分,一般情况下,你不需要单独安装。但是,如果你的系统中没有iptables,或者你需要安装一个新版本的iptables,那么你就需要手动安装。

在大多数基于Debian和Ubuntu的Linux发行版中,你可以使用下面的命令来安装iptables:

shell 复制代码
sudo apt-get update
sudo apt-get install iptables

在基于Red Hat和CentOS的发行版中,你可以使用下面的命令来安装iptables:

shell 复制代码
sudo yum install iptables

安装完成后,你可以使用下面的命令来检查iptables是否安装成功:

shell 复制代码
$ iptables --version
iptables v1.6.1

这个命令会显示出iptables的版本信息,如果你看到了版本信息,那么就说明iptables已经成功安装了。

相关推荐
Code_Artist23 分钟前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
mengao123425 分钟前
centos 服务器 docker 使用代理
服务器·docker·centos
Eternal-Student32 分钟前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
网络安全-杰克32 分钟前
网络安全概论
网络·web安全·php
不是二师兄的八戒34 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
怀澈12236 分钟前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
码农小丘40 分钟前
一篇保姆式centos/ubuntu安装docker
运维·docker·容器
耗同学一米八1 小时前
2024 年河北省职业院校技能大赛网络建设与运维赛项样题二
运维·网络·mariadb
skywalk81631 小时前
树莓派2 安装raspberry os 并修改成固定ip
linux·服务器·网络·debian·树莓派·raspberry
Eternal-Student1 小时前
【1.2 Getting Started--->Installation Guide】
docker