M0nk3y's Blog

iptables 学习

Word count: 4.4kReading time: 15 min
2020/08/26 Share

参考资料:

(内容和图片)

全教程系列

iptables 入门系列

作为安全狗 ,自认为知道概念和基础操作就行了(搞安全的要学的东西真的太多了。

原作者一开始讲了防火墙的知识,算不错的科普。

防火墙

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

主机防火墙:针对于单个主机进行防护。

网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。

网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体), 主机防火墙主内(个人)。


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

硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。

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

而渗透测试过程中,常常会遇见WAF,Web Application Firewall(Web 应用防火墙。比如长亭的雷池(SafeLine),基于语义分析,非常厉害,要是遇到了就别想怎么绕了(×

iptables

iptables 只有Linux 系的系统才有。

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

netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。

iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

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

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

  • 网络地址转换(Network Address Translate)

  • 数据包内容修改

  • 数据包过滤的防火墙功能

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

Iptables 基础

Iptables 是按照“规则”办事的,规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"

规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

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

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

PREROUTING、FORWARD、POSTROUTING

根据实际情况的不同,报文经过”链”可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。

常见场景中报文的流向:

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

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

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

链的概念

为什么“关卡” 在 iptables 中被称做“链:

防火墙的作用就在于对经过报文匹配“规则”,然后执行相对应的“动作”。然而关卡上不只只有一条规则,而且有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了”链”。

每个经过这个”关卡”的报文,都要将这条”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。

表的概念

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

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

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

  • filter表:负责过滤功能,防火墙;内核模块:iptables_filter

  • nat表:network address translation,网络地址转换功能;内核模块:iptable_nat

  • mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle

  • raw表:关闭nat表上启用的连接追踪机制;iptable_raw

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



表链关系

某些“链”中注定不会包含“某类规则”。

prerouting链上的规则存在的表情况

prerouting”链”只拥有nat表、raw表和mangle表所对应的功能,所以,prerouting中的规则只能存放于nat表、raw表和mangle表中

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”链”做图示。

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

raw –> mangle –> nat

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

优先级次序(由高而低):

1
raw --> mangle --> nat --> filter

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

数据经过防火墙的流程

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

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

PREROUTING 的规则可以存在于:raw表,mangle表,nat表。

INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。

FORWARD 的规则可以存在于:mangle表,filter表。

OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。

POSTROUTING 的规则可以存在于:mangle表,nat表。


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

raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT

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

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

filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

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

规则的概念

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

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

  • 匹配条件

匹配条件分为基本匹配条件与扩展匹配条件

基本匹配条件:

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

上述内容都可以作为基本匹配条件。

扩展匹配条件:

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

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

上述内容都可以作为扩展匹配条件

  • 处理动作

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

此处列出一些常用的动作,之后的文章会对它们进行详细的示例与总结:

ACCEPT:允许数据包通过。

DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。

REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。

SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。

MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。

DNAT:目标地址转换。

REDIRECT:在本机做端口映射。

LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

iptables 实际操作之规则查询

iptables为我们预定义了4张表,它们分别是raw表、mangle表、nat表、filter表,不同的表拥有不同的功能。

filter负责过滤功能,比如允许哪些IP地址访问,拒绝哪些IP地址访问,允许访问哪些端口,禁止访问哪些端口,filter表会根据我们定义的规则进行过滤,filter表应该是我们最常用到的表了,所以此处,我们以filter表为例,开始学习怎样实际操作iptables。

  • 查看filter 表中的规则
1
iptables -t filter -L

使用-t选项,指定要操作的表,使用-L选项,查看-t选项对应的表的规则,-L选项的意思是,列出规则,所以,上述命令的含义为列出filter表的所有规则

image-20200826222325023

从上图中可以看出,INPUT链、FORWARD链、OUTPUT链都拥有”过滤”的能力,所以,当我们要定义某条”过滤”的规则时,我们会在filter表中定义,但是具体在哪条”链”上定义规则呢?这取决于我们的工作场景。比如,我们需要禁止某个IP地址访问我们的主机,我们则需要在INPUT链上定义规则。因为,我们在理论总结中已经提到过,报文发往本机时,会经过PREROUTING链与INPUT链,如果我们想要禁止某些报文发往本机,我们只能在PREROUTING链和INPUT链中定义规则,但是PREROUTING链并不存在于filter表中,换句话说就是,PREROUTING关卡天生就没有过滤的能力,所以,我们只能在INPUT链中定义,当然,如果是其他工作场景,可能需要在FORWARD链或者OUTPUT链中定义过滤规则。

查询其他表中的规则:

1
2
3
4
5
iptables -t raw -L

iptables -t mangle -L

iptables -t nat -L

可以省略-t filter,当没有使用-t选项指定表时,默认为操作filter表,即iptables -L表示列出filter表中的所有规则。

  • 查询指定表中指定链的规则

因为我的vps 没有配置iptables,所以图片就直接抄。

1
2
3
iptables -L INPUT(注意大小写)
查询更详细的数据可以使用-v 选项
iptables -vL INPUT

pkts bytes target prot opt in out source destination

pkts:对应规则匹配到的报文的个数。

bytes:对应匹配到的报文包的大小总和。

target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。

prot:表示规则对应的协议,是否只针对某些协议应用此规则。

opt:表示规则对应的选项。

in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。

out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。

source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。

destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

上图中的源地址与目标地址都为anywhere,看来,iptables默认为我们进行了名称解析,但是在规则非常多的情况下如果进行名称解析,效率会比较低,所以,在没有此需求的情况下,我们可以使用-n选项,表示不对IP地址进行名称反解,直接显示IP地址,示例如下。

1
iptables -nvL

如上图所示,规则中的源地址与目标地址已经显示为IP,而非转换后的名称。

使用--line-numbers 即可显示规则的编号

image-20200826224155655

如图,每个链的后面都有一个括号,括号后面有一些信息:

policy表示当前链的默认策略,policy ACCEPT表示上图中INPUT的链的默认动作为ACCEPT

packets表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。

bytes表示当前链默认策略匹配到的所有包的大小总和。

其实,我们可以把packets与bytes称作”计数器”,上图中的计数器记录了默认策略匹配到的报文数量与总大小,”计数器”只会在使用-v选项时,才会显示出来。

如果要查看更精确的计数值,可以使用-x选项。

Iptables 规则管理

http://www.zsythink.net/archives/1517

Author:m0nk3y

原文链接:https://hack-for.fun/13bb2df2.html

发表日期:August 26th 2020, 3:17:09 pm

更新日期:August 26th 2020, 11:25:09 pm

版权声明:原创文章转载时请注明出处

CATALOG
  1. 1. 防火墙
  2. 2. iptables
    1. 2.1. Iptables 基础
    2. 2.2. 链的概念
    3. 2.3. 表的概念
    4. 2.4. 表链关系
    5. 2.5. 数据经过防火墙的流程
    6. 2.6. 规则的概念
  3. 3. iptables 实际操作之规则查询
  4. 4. Iptables 规则管理