大家觉得有意义和参考价值记得关注和点赞!!!
本文技术含量稍微有点偏高,读起来理解来有点难,在具体读懂之前将前面的一些概念了解清楚,不然后续很变扭。
一、概念介绍
Linux系统的防火墙:IP信息包过滤系统,它实际上由两个组件netfilter和iptables组成;主要工作在网络层主要针对ip数据包。体现在对包内的ip地址端口协议等信息上的处理。
1.1、netfilter
netfilter属于“内核态”(Kernel Space,又称为内核空间)是防火墙功能体系;是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。
1.2、iptables
iptables属于“用户态”(User Space,又称为用户空间)是防火墙管理体系;是一种管理Linux防火墙的命令程序,它可进行插入、修改和删除数据包过滤表中的规则变得容易,通常位/sbin/iptables目录下。
1.3、netfile/iptables
netfilter/iptables下文中统一简称为iptables;iptables是基于内核的防火墙,其中内置了raw、mangle、nat和 filter四个规则表(外行的统称)。
1.4、防火墙默认有规则表,链结构
iptables由四个表table和五个链chain以及一些规则组成
1.4.1、五表table包括哪些
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:负责网络地址转换,用来修改数据包中的源,目标ip地址或端口
filter表:负责过滤数据包,确定是否放行该数据包
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现(一般不用)
1.4.2、五个链chain包括哪些
INPUT:处理入站数据包,匹配目标ip为本机的数据包
OUTPUT:处理出战数据包,一般不在此锌上,做配置
FORWARD:处理转发数据包,匹配流经本机的数据包
PREROUNTING:在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的ip和端口映射到路由器的外网ip和端口上
POSTROUTING:在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网ip地址来上网。
1.4.3、五表五链总结
规则表的作用:容纳各种规则链
规则链的作用:容纳各种防火墙规则
表里有链,链里有规则
在下面的图中,
nat
table 被细分成了DNAT
(修改目的地址) 和SNAT
(修改源地址),以更方便地展示他们的优先级。另外,我们添加了路由决策点 和连接跟踪点,以使得整个过程更完整全面:
Tables/Chains | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
(路由判断) | Y | ||||
raw | Y | Y | |||
(连接跟踪) | Y | Y | |||
mangle | Y | Y | Y | Y | Y |
nat (DNAT) | Y | Y | |||
(路由判断) | Y | Y | |||
filter | Y | Y | Y | ||
security | Y | Y | Y | ||
nat (SNAT) | Y | Y | Y |
当一个包触发 netfilter hook 时,处理过程将沿着列从上向下执行。 触发哪个 hook(列)和包的方向(ingress/egress)、路由判断、过滤条件等相关。
特定事件会导致 table 的 chain 被跳过。例如,只有每个连接的第一个包会去匹配 NAT 规则,对这个包的动作会应用于此连接后面的所有包。到这个连接的应答包会被自动应用反 方向的 NAT 规则。
1.4.3.1、规则链之间的匹配顺序
①入站数据(来自外界的数据包,且目标地址是防火墙本机):PREROUNTING-->INPUT-->本机的应用程序。②出站数据(从防火墙本机向外部地址发送的数据包):本机的应用程序-->OUTPUT-->POSTROUTING网络型防火墙
③转发数据(需要经过防火墙转发的数据包):PREROUTING-->FORWARD-->POSTROUTING
例如:
综合前面讨论的表顺序问题,我们可以看到对于一个收到目的是本机的包: 首先依次经过
PRETOUTING
chain 上面的raw
、mangle
、nat
table;然后依次经 过INPUT
chain 的mangle
、filter
、security
、nat
table,然后才会到达本机 的某个 socket。
1.4.3.2、规则链内表的匹配顺序
①自上而下按顺序依次进行检查,找到相匹配的规则就停止。
②若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)
③注意事项:
不指定表名时,默认指filter表
不知名链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项,链名,控制类型使用大写字母,其余都为小写
规则放置在特定 table 的特定 chain 里面。当 chain 被调用的时候,包会依次匹配 chain 里面的规则。每条规则都有一个匹配部分和一个动作部分。
1)匹配
规则的匹配部分指定了一些条件,包必须满足这些条件才会和相应的将要执行的动作(“ target”)进行关联。匹配系统非常灵活,还可以通过 iptables extension 大大扩展其功能。规则可以匹配协 议类型、目的或源地址、目的或源端口、目的或源网段、接收或发送的接口(网卡)、协议 头、连接状态等等条件。这些综合起来,能够组合成非常复杂的规则来区分不同的网络流量。
2)动作
包符合某种规则的条件而触发的动作(action)叫做目标(target)。目标分为两种类型:
- 终止目标(terminating targets):这种 target 会终止 chain 的匹配,将控制权 转移回 netfilter hook。根据返回值的不同,hook 或者将包丢弃,或者允许包进行下一 阶段的处理
- 非终止目标(non-terminating targets):非终止目标执行动作,然后继续 chain 的执行。虽然每个 chain 最终都会回到一个终止目标,但是在这之前,可以执行任意多 个非终止目标
每个规则可以跳转到哪个 target 依上下文而定,例如,table 和 chain 可能会设置 target 可用或不可用。规则里激活的 extensions 和匹配条件也影响 target 的可用性。
1.4.3.3、常见控制类型
控制类型 作用
ACCEPT 允许数据包通过(默认)
DROP 直接丢弃数据包,不给出任何回应信息
REJECT 拒绝数据包通过,会给数据发送端一个响应信息
SNAT 修改数据包的源地址
DNAT 修改数据包的目的地址
MASQUERADE 伪装成一个非固定公网IP地址
LOG 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。LOG只是一种辅助动作,并没有真正处理数据包
常用管理选项:
管理选项 作用
-A 在指定链的末尾追加(--append)一条新的规则
-I 在指定链的开头插入(--insert)一条新的规则,未指定序号时默认作为第一条规则
-R 修改、替换(--replace) 指定链中的某一条规则,可指定规则序号或具体内容
-P 设置指定链的默认策略(--policy)
-D 删除(--delete) 指定链中的某一条规则,可指定规则序号或具体内容
-F 清空(--flush)指定链中的所有规则,若未指定链名,则清空表中的所有链
-L 列出(--list) 指定链中所有的规则,若未指定链名,则列出表中的所有链
-n 使用数字形式(--numeric) 显示输出结果,如显示IP地址而不是主机名
-v 显示详细信息,包括每条规则的匹配包数量和匹配字节数
--line-numbers 查看规则时,显示规则的序号
1.4.3.4、iptables 和 conntrack
在讨论
raw
table 和 匹配连接状态的时候,我们介绍了构建在 netfilter 之上的 连接跟踪(conntrack)系统。连接跟踪系统使得 iptables 基于连接上下文而不是单个包来做出规则判断, 给 iptables 提供了有状态操作的功能。连接跟踪在包进入协议栈之后很快(very soon)就开始工作了。在给包分配连接之前所做 的工作非常少,只有检查
raw
table 和一些基本的完整性检查。跟踪系统将包和已有的连接进行比较,如果包所属的连接已经存在就更新连接状态, 否则就创建一个新连接。如果
raw
table 的某个 chain 对包标记为目标是NOTRACK
, 那这个包会跳过连接跟踪系统。
连接的状态
连接跟踪系统中的连接状态有:
NEW
:如果到达的包关连不到任何已有的连接,但包是合法的,就为这个包创建一个新连接。对 面向连接的(connection-aware)的协议例如 TCP 以及非面向连接的(connectionless )的协议例如 UDP 都适用
ESTABLISHED
:当一个连接收到应答方向的合法包时,状态从NEW
变成ESTABLISHED
。对 TCP 这个合法包其实就是SYN/ACK
包;对 UDP 和 ICMP 是源和目 的 IP 与原包相反的包
RELATED
:包不属于已有的连接,但是和已有的连接有一定关系。这可能是辅助连接( helper connection),例如 FTP 数据传输连接,或者是其他协议试图建立连接时的 ICMP 应答包
INVALID
:包不属于已有连接,并且因为某些原因不能用来创建一个新连接,例如无法 识别、无法路由等等
UNTRACKED
:如果在raw
table 中标记为目标是UNTRACKED
,这个包将不会进入连 接跟踪系统
SNAT
:包的源地址被 NAT 修改之后会进入的虚拟状态。连接跟踪系统据此在收到 反向包时对地址做反向转换
DNAT
:包的目的地址被 NAT 修改之后会进入的虚拟状态。连接跟踪系统据此在收到 反向包时对地址做反向转换
这些状态可以定位到连接生命周期内部,管理员可以编写出更加细粒度、适用范围更大、更 安全的规则。
1.5、数据包到达防火墙规则表匹配的优先顺序
数据包到达防火墙时,规则表之间的优先顺序:raw>mangle>nat>filter
1.6、防护墙控制类型
允许(accept)、丢弃(drop)、拒绝(reject)、忽略(ignore)、告警(alarm)
1.7、TCP报文的连接状态
常见连接状态:
NEW:主机连接目标主机,在目标主机上看到的第一个想要连接的包
ESTABLISHED:主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态
RELATED:主机已与目标主机进行通信,目标主机发起新的链接方式,一般与ESTABLISHED 配合使用
INVALID ∶ 无效的封包,例如数据破损的封包状态等等
1.8、访问控制规则
1、源网络接口、目的网络接口
2、可信区域、不可区域。
3、源MAC地址、目的MAC地址。
4、源IP地址、目的IP地址
5、源端口号、目的端口号
6、协议类型
7、应用WAF规则库、IDS规则库、IPS规则库、未知威胁库、威胁情报库、应用识别、反垃圾邮件等
8、会话数量限制
9、长连接数量限制
10、连接数量限制
11、允许、禁用、忽视、拒绝、告警
12、流量管理
13、日志记录
14、HA
15、是否开启认证(radius\ldap\双因子等)
16、时间
17、源IP地址转换
18、目的地址转换
二、框架介绍
2.1、四表处理顺序结构图
2.2、五链处理的顺序流程图
2.3、系统调用处理的流程图
2.4、数据流处理流程图
2.5、详细流程图
2.6 、整体框架结构图
2.6.1 netfilter插件
三、Netfilter和通用网络数据转发原理
四、netfilter原理
4.1、netfilter原理概述
是一个脱离于普通socker接口的数据包处理框架(framework)。包含四个部分,
第一部分:hooks的定义
每种协议都定义了一些hooks即钩子(IPV4共定义的是5个),所谓的hooks是指在协议栈做包遍历时,一些被明确定义的点(well-defined points),于是在每一个point上,该协议栈都会使用数据包和hook号去调用netfilter框架。
第二部分:内核注册监听
内核的某些部分可以针对每个协议的不同hook注册监听,当数据包被传递到netfilter框架(的hook)时,就会检查是否有针对这个协议的这个hook注册监听;
如果注册了,这些数据包就将面临依序的检查甚至可能是被更改(a chance to examine and possibly alter ),然后决定接下来是销毁(NF_DROP), 还是允许(NF_ACCEPT), 还是告诉netfilter忽略(NF_STOLEN), 或者要求netfilter将这些数据包1进行排队以用于用户空间(NF_QUEUE);
第三部分:处理结果
将已经排队的数据包收集起来(由ip_queue驱动),然后发送到用户空间,为异步处理。
第四部分:文档和注释
在原生的netfilter框架之外,是各种各样的模块, 其中较为重要的是可扩展的NAT系统和数据包过滤系统(iptables)
4.2、netfilter的钩子(钩子)
根据前面的概述可以看出来,netfilter框架的核心其实就是一系列的钩子(hooks), 接下来我们就以IPV4为例,看看理想情况下这些hooks都放在了哪里?
数据处理流程图解析
1)对于从外面接收过来的数据包, 首先会经历框架的第1号hook, 称为NF_IP_PRE_ROUTING,通过后进入路由的逻辑判断。2)在路由逻辑判断中, 会根据包的目的地址进行分流:
如果目的地址是自己, 那么会进入第2号hook,称为NF_IP_LOCAL_IN,处理完才会交给上层进程;上层进程处理完需要,生成新的数据包进入第4个hook,再进行路由逻辑判断,最后交给第5个hook处理,满足条件转发出去,不满足就丢弃。
如果目的地不是自己,即需要交给另一个interface转发出去的话,那在转发之前进入第3号hook, 称为NF_IP_FORWARD;最后交给第5号hook,称为NF_IP_POST_ROUTING, 之后就可以发送出去了。
3) 对于本地生成的数据包, 在进入路由逻辑之前会进入第4号hook, 称为NF_IP_LOCAL_OUT。
4.3、netfilter的核心基础
钩子的位置规定好了,接下来就是去钩子那里注册一下。这些去注册的内核模块通过实现相应的注册函数在hook里面放置一个监听,注册函数必须有优先级才行,只有这样当netfilter hook在被内核网络代码调用的时候,会按序执行这些模块所注册的函数, 执行完毕了,这些模块还有告诉netfilter接下来做什么,且是如下五种之一
1)NF_ACCEPT: 继续遍历。
2)NF_DROP: 丢弃数据包; 不用继续遍历了。
3)NF_STOLEN: 数据包我接收了;不用继续遍历了。
4)NF_QUEUE: 将数据包入列 ,交给用户进程处理。
5)NF_REPEAT: 再次调用该hook。
从网络的角度从下至上分为:负责收发数据包的协议栈,netfiler框架,有过滤需求的模块,
其中,netfiler则作为核心框架将协议栈和模块进行有机结合,整个过程如下:
首先,对下,框架允许协议栈定义几个安插点称为hook/钩子,该协议栈在处理自己数据流时数据包会在这几个安插点上进入netfilter框架;
然后,对上,框架支持模块向hook中进行注册(函数),表示数据流在netfilter框架中具体面临的具体过滤操作是什么;
最后,数据包自下向上,当协议栈真正接收到数据后,会进入netfiler框架,之后数据包将在对应的hook按序被注册的函数处理。
关于hook和hook函数:
hook是具体的协议栈定义的, 即所谓的"well-defined points",可以理解为是"打前站的"
hook函数是具体的模块注册的,即所谓的"examine and possibly alter", 可以理解为是"具体干活的"
4.4、基于netfilter框架的实现
4.4.1 流程解析
netfiler是一个框架,他的工作只是负责:
对下(协议栈),允许协议栈定制hook,并指导数据包到达协议栈某个hook对应的point后进入netfiler框架中;
对上(模块), 支持注册回调函数, 并指导接收到数据包会依次被回调函数处理。
所以,问题的关键就在于定义了哪些hook以及在这些hook上将具体执行哪些操作,而模块如何注册自己的过滤函数呢?一些内置的系统比如IP Tables,Connection Tracking等就是负责帮助模块实现了这些注册且还提供了面向用户的操作。也就是说,模块不会直接向hook注册函数,而是由这样一个功能模块,以一个很友好的方式帮助模块注册自己的逻辑。
4.4.2、 数据包筛选: IP Tables
数据包的筛选系统被称为IP Tables。内核模块可以注册一个新表,然后要求数据包去遍历这个给定的表。这种对包进行筛选的方法则是用来进行包过滤( "filter"表),网络地址转化('nat'表),
关于注册,该怎么理解呢?
首先,内核模块都可以在hook点注册自己的回调函数,回调中具体做什么也是模块自己的事情 ,至于IP Tables系统/模块是一种内置的实现, 即帮我们在hook上注册了回调,该回调的内部实现中,对数据的操作机制是借助一个可定制的"规则表", 即回调函数就可以根据该"规则表"对数据包进行处理。 而内核中的其他模块,都可以将自己的需求注册到"规则表"甚至新建"规则表"; 综上所述,可以认为是IP Tables用来协助内核模块去hook上注册函数.....
解析:
1). Filter 包过滤, filter表
filter表永远不会修改包,只会过滤他们;filter表都注册到哪些hook中呢?有3/5个hook points都这个表的身影,分别是:
NF_IP_LOCAL_IN: 对于目的是自己的报文,在进入本地处理之前
NF_IP_FORWARD:对于目的是别人,在转发之前
NF_IP_LOCAL_OUT: 对于自己产的,在发出去之前
以上三点可以看出, filter表的安插让每一个数据包,有且只有一次需要经历filter的过滤。2). Nat地址转换, nat表
NF_IP_PRE_ROUTING 和 NF_IP_POST_ROUTING: 针对的是 non-local, 即目的不是自己的数据包,分别在入口和出口处做"目的转换"和"源转换"。
NF_IP_LOCAL_OUT 和 NF_IP_LOCAL_IN: 如果定义了CONFIG_IP_NF_NAT_LOCAL, 则用于altering the destination of local packets.3). Mangle,mangle表
用于拆解数据包然后更改信息,例如用于TOS和TCPMSS。五个hook均注册了mangle表。
4.4.3、连接跟踪(Connection Tracking)
实现原理(待整理)
1. nf_conntrack的原理
参考链接:
https://blog.csdn.net/dog250/article/details/78372576
connection tracking, 即连接跟踪,用来保存连接信息的,在进入hook之前就会进行的逻辑处理,每一个连接对应的结构体为:
连接跟踪是 在PREROUTING链里进行处理的,更确切的说是在该链之前,只不过二者通常是绑定出现?
conntrack默认最大跟踪65536个连接,查看当前系统设置最大连接数:
cat /proc/sys/net/netfilter/nf_conntrack_max查看连接跟踪有多少条目:
# cat /proc/sys/net/netfilter/nf_conntrack_count查看established连接状态最多保留几天,默认是432000秒,就是5天;如果觉得时间太长可以修改。还有各种tcp连接状态的保留时间,都可以修改的。
# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_establishedIP_conntrack模块根据IP地址可以实时追踪本机TCP/UDP/ICMP的连接详细信息并保存在内存中“/proc/net/nf_conntrack”文件中
例如我的82环境:
[root@tmp-82 net]# cat /proc/sys/net/netfilter/nf_conntrack_max
65536
[root@tmp-82 net]# cat /proc/sys/net/netfilter/nf_conntrack_count
13
[root@tmp-82 net]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
432000
[root@tmp-82 net]# cat /proc/net/nf_conntrack ipv4 2 tcp 6 431978 ESTABLISHED src=192.168.48.231 dst=192.168.48.82 sport=35356 dport=23002 src=192.168.48.82 dst=192.168.48.231 sport=23002 dport=35356 [ASSURED] mark=0 zone=0 use=2 ipv4 2 udp 17 29 src=192.168.48.248 dst=192.168.48.255 sport=57133 dport=18000 [UNREPLIED] src=192.168.48.255 dst=192.168.48.248 sport=18000 dport=57133 mark=0 zone=0 use=2 ipv4 2 unknown 2 599 src=192.168.48.2 dst=224.0.0.1 [UNREPLIED] src=224.0.0.1 dst=192.168.48.2 mark=0 zone=0 use=2 ipv4 2 tcp 6 431996 ESTABLISHED src=192.168.48.159 dst=192.168.48.82 sport=60446 dport=23002 src=192.168.48.82 dst=192.168.48.159 sport=23002 dport=60446 [ASSURED] mark=0 zone=0 use=2 ipv4 2 tcp 6 431992 ESTABLISHED src=192.168.48.224 dst=192.168.48.82 sport=59644 dport=23002 src=192.168.48.82 dst=192.168.48.224 sport=23002 dport=59644 [ASSURED] mark=0 zone=0 use=2 ipv4 2 tcp 6 431995 ESTABLISHED src=192.168.48.159 dst=192.168.48.82 sport=60444 dport=23002 src=192.168.48.82 dst=192.168.48.159 sport=23002 dport=60444 [ASSURED] mark=0 zone=0 use=2 ipv4 2 tcp 6 431984 ESTABLISHED src=192.168.48.159 dst=192.168.48.82 sport=60415 dport=23002 src=192.168.48.82 dst=192.168.48.159 sport=23002 dport=60415 [ASSURED] mark=0 zone=0 use=2 ipv4 2 tcp 6 431995 ESTABLISHED src=192.168.48.159 dst=192.168.48.82 sport=33918 dport=22 src=192.168.48.82 dst=192.168.48.159 sport=22 dport=33918 [ASSURED] mark=0 zone=0 use=2 ipv4 2 tcp 6 431984 ESTABLISHED src=192.168.48.159 dst=192.168.48.82 sport=60414 dport=23002 src=192.168.48.82 dst=192.168.48.159 sport=23002 dport=60414 [ASSURED] mark=0 zone=0 use=2 ipv4 2 tcp 6 299 ESTABLISHED src=192.168.95.143 dst=192.168.48.82 sport=56724 dport=22 src=192.168.48.82 dst=192.168.95.143 sport=22 dport=56724 [ASSURED] mark=0 zone=0 use=2 ipv4 2 tcp 6 431974 ESTABLISHED src=192.168.48.159 dst=192.168.48.82 sport=52380 dport=23002 src=192.168.48.82 dst=192.168.48.159 sport=23002 dport=52380 [ASSURED] mark=0 zone=0 use=2 ipv4 2 tcp 6 431974 ESTABLISHED src=192.168.48.159 dst=192.168.48.82 sport=52378 dport=23002 src=192.168.48.82 dst=192.168.48.159 sport=23002 dport=52378 [ASSURED] mark=0 zone=0 use=2
TCP连接追踪详细解析
ipv4 2 tcp 6 431974 ESTABLISHED src=192.168.48.159 dst=192.168.48.82 sport=52378 dport=23002 packets=1 bytes=1 src=192.168.48.82 dst=192.168.48.159 sport=23002 dport=52378 [ASSURED] packets=1 bytes=1 mark=0 zone=0 use=2
Ipv4 : 编号对应协议 2
TCP :对应协议为6
431974 :对应的等待时间(老化时间)
ESTABLISHED :对应的是连接状态
New:对应的是新建连接。
发起方向:src=192.168.48.159 dst=192.168.48.82 sport=52378 dport=23002 四元组-源IP地址、目的IP地址、源端口、目的端口
响应方向:src=192.168.48.82 dst=192.168.48.159 sport=23002 dport=52378 [ASSURED]
四元组-源IP地址、目的IP地址、源端口、目的端口
ASSURED :为两个方向已没有流量
蓝色packets=1:发起方的数据包数
蓝色bytes=1:发起方的字节数
绿色mark=256:连接跟踪标记,多用作负载均衡等目的
绿色use=1:该条目被引用的次数(NAT、Helper 等)
UNREPLIED:仅看到发起方,未看到响应方的数据包
该连接跟踪条目有点复杂。
注意 [UNREPLIED] 字段,它与连接跟踪的 NEW 状态是同义的,然而 TCP 状态却是 ESTABLISHED。这是因为本地发起的 TCP 连接的状态从 SYN_SENT 到 ESTABLISHED 后,会重新进入 NEW 的连接跟踪状态,直到看到响应方产生流量,连接跟踪状态才会变成 ESTABLISHED。可以看到绿色部分的响应方的数据包与字节均为 0,也就是已完成 TCP 的握手,但尚未接收到数据。此时适用的是 nf_conntrack_tcp_timeout_unacknowledged 的时限,默认为 300 秒,在收到数据后再适用 nf_conntrack_tcp_timeout_established 的 7440 秒 时限。
另一种情况是远程发起的 TCP 连接,完成握手后但未发送数据。TCP 状态从 SYN_RECV 到 ESTABLISHED 时,由于本地是响应方,因此会在响应方四元组后面显示 [ASSURED] 字段,表示已响应。但此时的连接跟踪状态仍然是 NEW,因为此 TCP 状态下发起方未产生流量,它仍然属于单向通信。此时的时限同样适用 nf_conntrack_tcp_timeout_unacknowledged 的 300 秒。
UDP连接追踪详细解析
udp 17 src=192.168.8.99 dst=119.29.29.29 sport=53052 dport=53 packets=1 bytes=60 src=119.29.29.29 dst=172.26.179.252 sport=53 dport=53052 packets=1 bytes=60 [OFFLOAD] mark=512 use=2
udp 传输层协议
17 IP 协议号,17 即 User Datagram Protocol (UDP)
蓝色部分 发起方(origin)
src dst sport dport 发起方的四元组
packets bytes 发起方的数据包数与字节数
绿色部分 响应方(reply)
src dst sport dport 响应方的四元组
packets bytes 响应方的数据包数与字节数
[OFFLOAD] 此连接已进入软件快速通道(software fastpath, flowtables)
mark 与 use 同上
由于 UDP 协议不存在传输层状态,因此该字段为空。
该条目不显示剩余时限,是因为连接进入了 软件快速通道。在较新的 Netfilter 框架中,可启用 flowtables 机制,已确立的连接——连接跟踪的 属性 为 established 或 confirmed 的连接,其后续的流量将绕过防火墙与连接跟踪。软件快速通道有自己的时限参数,TCP 与 UDP 默认均为 30 秒,在此期间内未产生流量的话,连接再次回到防火墙与连接跟踪,重新计算剩余时间。需要注意的是,进入软件快速通道期间,该连接的数据包数与字节数不再更新(但不会清零),基于防火墙的流量统计也无法正确工作。
ICMP连接追踪详细解析
icmp 1 18 src=100.64.68.30 dst=202.96.134.133 type=8 code=0 id=44481 packets=1 bytes=84 src=202.96.134.133 dst=100.64.68.30 type=0 code=0 id=44481 packets=1 bytes=84 mark=256 use=1
icmp 传输层协议;有意见称 ICMP 不是“传输”协议,但在本文涉及的场景下,更需要关注的是结构而不是功能
1 IP 协议号,1 即 Internet Control Message Protocol (ICMP)
18 剩余时限
蓝色部分 发起方(origin)
src dst type code id 发起方的五元组
packets bytes 发起方的数据包数与字节数
绿色部分 响应方(reply)
src dst type code id 响应方的五元组
packets bytes 响应方的数据包数与字节数
mark 与 use 同上
ICMP 协议不使用端口,相对地,使用 Type/Code/ID 作为标识。ICMP 报文中,并非所有类型都封装 ID。但 ICMP 协议的类型中,只有 回显请求 / 应答、时间戳请求 / 应答、信息请求 / 应答、地址掩码请求 / 应答 这四组是成对出现的,其他类型均不需要连接跟踪;而这四组类型正好都封装 ID。另外,信息请求 / 应答、地址掩码请求 / 应答 在 RFC6918 已被正式弃用;而 时间戳请求 / 应答 出于安全原因——根据时间戳算出目标系统随机数倾向的风险,通常被防火墙禁止。因此在实际应用中,只有 回显请求 / 应答 适用连接跟踪机制。
ICMP 协议的连接跟踪会有 [UNREPLIED] 字段,但即使有双向通信,也不会标记 [ASSURED] 字段。这是因为在连接跟踪表填满后,会优先释放未标记 [ASSURED] 字段的连接,而 ICMP 连接正好充当该场景下的“炮灰”。
同理可以看到源IP地址转换、目的地址转换等记录。
针对各个协议,hook的定义已经做好比如ipv4(第一张),接下来的实现就由这样一个已经内置的系统,称之为: IP Tables
他实现了这样一个功能:
1)内存中维护了一个表,里面是一条一条规则
2)去netfilter中那里注册hook(即,回调函数),该函数会根据表中的规则对数据进行操作(filter, nat, mangle,raw)关于链chain的含义:这是IP Tables内部的一个概念, 是用于管理在每个hook上注册的多个hook函数。因为在netfilter的每个hook点上,可以注册多个表/操作表的hook函数, 且具有一定的顺序,于是他们就构成了一个链,一个有序的链来代表按序执行模块们注册的回调函数
4.5、防火墙区域及工作模式
域(zone)是防火墙上的重要概念,防火墙通常放置在网络的边界,路由器通过接口来连接不同网段,防火墙则通过域来表示不同的网络。
安全策略:通过将接口加入域并且在安全区域之间启动安全检查,从而对流经不同安全区域的信息流进行安全过滤。常用的安全检查包括基于ACL和应用层状态的检查, 华为防火墙默认有5个安全区域,并且每个安全区域均设置了安全优先级。分别是:
(1)虚拟区(Vzone)是虚拟防火墙所支持的区域,安全优先级为0;
(2)非受信区(Untrust)是低级的安全区域,其安全优先级为5;
(3)非军事化区(DMZ)是中级的安全区域,其安全优先级为50;
(4)受信任区(Trust)是较高级的安全区域,七安全优先级为85;
(4)本地区(Local)是最高级的安全区域,七安全优先级为100;
使用其他安全区域前,都需要将安全区域分别与防火墙的特定接口关联,即将接口加入安全区域。并且一个接口只能加入到一个安全区域,该接口既可以是物理接口,也可以是逻辑接口,一个安全区域能够支持的最大接口数为1024个。
》防火墙与路由器的区别
路由器一个接口代表一个网络;防火墙一个区域代表一个网络
路由器侧重数据转发;防火墙侧重数据控制
路由器工作在三层;防火墙可以工作在三层,也可以工作在二层
(当防火墙作为二层设备时,我们需要注意防火墙对二层技术的支持情况)
工作模式
路由模式,接口需要配置ip地址
透明模式,由于工作在二层接口无需配置IP地址
混合,两种都有
》接口
接口必须加入到区域才能使用
一个接口只能属于一个区域
一个区域可以有多个接口
加入区域的接口,其接口所代表的网络属于这个区域,但接口本身还是属于Local区域安全级别(优先级)
取值范围(0-100)
具有唯一性,不可重复
数值越高,越安全
Local-100
Trust-85
DMZ-50
Untrust-5
Vzone-0
》方向
入,从低级别到高级别
出,从高级别到低级别
方向决定了源和目标》策略
1 拒绝入站
2 允许出站
3 拒绝转发
4 允许Local与Trust通信
4.6、Linux firewalld与iptables区别
iptables服务和iptables命令区分
注意区分iptables服务和iptables命令。尽管firewalld取代了iptables服务来提供防火墙管理,但它仍然使用iptables命令与内核包过滤模块(netfilter)进行动态通信。所以,只有iptables服务被替换,而不是iptables命令。
参考网址:ORACLE-BASE - Linux Firewall (firewalld, firewall-cmd, firewall-config)
firewalld和iptables服务之间的本质区别
iptables服务将配置存储在/etc/sysconfig/iptables中,而firewalld将配置存储在/usr/lib/firewalld/和/etc/firewalld/中的各种XML文件中。请注意,缺省情况下/etc/sysconfig/iptables文件不存在,因为默认情况下在Fedora上安装的是firewalld。
对于iptables服务,每次更改都意味着会flush掉所有旧规则以及从/etc/sysconfig/iptables读取所有新规则,而对于firewalld,则不会重新创建所有规则;仅将差异部分apply。因此,firewalld可以在运行时更改设置而不会丢失现有连接。
两者都使用iptables工具与内核包过滤器通信
参考网址:ORACLE-BASE - Linux Firewall (firewalld, firewall-cmd, firewall-config)