什么做网站做个网站一般要多少钱啊,做网站界面尺寸,宝安中心医院入职体检,邯郸企业做网站目录
一、前言
二、Netfilter 构成
三、Netfilter 转发框架
四、Netfilter 与 iptables
五、Netfilter 与 ebtables 一、前言
Netfilter 是 Linux 内核的数据包处理框架#xff0c;由 Rusty Russell 于 1998 年开发#xff0c; 旨在改进以前的 ipchains#xff08;Lin…目录
一、前言
二、Netfilter 构成
三、Netfilter 转发框架
四、Netfilter 与 iptables
五、Netfilter 与 ebtables 一、前言
Netfilter 是 Linux 内核的数据包处理框架由 Rusty Russell 于 1998 年开发 旨在改进以前的 ipchainsLinux2.2.x和 ipfwadmLinux2.0.x数据包处理框架。
二、Netfilter 构成
Netfilter 详细构成如下所示 从上图我们可以看出Netfilter 框架采用了高内聚、低耦合的模块化设计理念。主要由 Netfilter hook API、内核防火墙子模块、用户态配置工具/应用程序 3 部分组成。
Netfilter hook APINetfilter 在网络协议栈处理数据包的关键流程中定义了 5 个 Hook 点其它内核防火墙子模块比如 ip_tables.ko可以向这些 hook 点注册处理函数这样当数据包经过这些 hook 点时其上注册的处理函数将被依次调用。内核防火墙子模块Netfilter 提供了整个防火墙的框架各个协议基于 Netfilter 框架来自己实现自己的防火墙功能。每个协议都有自己独立的表来存储自己的配置信息他们之间完全独立的进行配置和运行。链路层2 层防火墙子模块ebtables对运行在 Bridge 中协议报文进行处理。ARP2.5 层防火墙子模块arptables对 ARP 协议报文进行处理。网络层3 层防火墙子模块iptablesIPv4、ip6tablesIPv6分别对 IPv4协议栈与IPv6协议栈中的报文进行处理。nf_tables旨在替换现有的 {ipip6arpeb}tables 框架它使用现有的 Netfilter hook API为 {ipip6}tables 提供一个新的包过滤框架、一个新的用户空间实用程序nft和一个兼容层。 Centos 8 已经使用 nftables 框架替代 iptables 框架作为默认的网络包过滤工具。NAT 子系统网络地址转换SNAT、DNAT。Conntrack连接跟踪模块内核实现 statefull firewall、L4LB功能的主要模块。Loggingnf_log主要提供 Netfilter 的日志记录服务。使用 nft 添加规则Netfilter 抛出日志然后用户态的 ulogd2 程序监听读取这些日志后。 ulogd2 会将这些数据包日志转换成json、sqlite3/mysql、pcap等多种格式文件方便进行分析或用于进行其他的数据处理审计、分析等。Queueingnf_queue内核在 Netfilter 框架基础上提供的 ip_queue/nfnetlink_queue 机制通常用于将数据包上送给用户空间的应用程序进行处理从而使得基于用户态的防火墙开发成为可能。Xtables主要包含{ebarpipip6}tables模块所使用的共享代码部分。后来Xtables或多或少被用来指整个防火墙(v4、v6、arp和eb)体系结构。用户态配置工具/应用程序每个内核防火墙子模块除了 Xtables都有一个对应的用户态配置工具/应用程序。在讲述内核防火墙子模块的时候已经进行了相应介绍这里不再进行赘述。
三、Netfilter 转发框架
数据包在 Netfilter 框架中的转发路径如下图所示 上图协议栈主要分为 4 层蓝色框为链路层、绿色框为网络层、黄色框为协议层、红色框为应用层。
图中绿色小方框表示 iptables 的表和链蓝色小方框表示 ebtables 的表和链。在 br-nf 的作用下从2.6 kernel开始可以支持在链路层调用 iptables 的表和链。
br-nf 的引入是为了解决在链路层 Bridge 中处理 IP 数据包的问题比如在链路层内进行IP DNAT外部机器与主机上虚拟机之间的通信流量br-nf 也是 openstack 中实现安全组功能的基础。
四、Netfilter 与 iptables
Netfilter 在 网络层L3提供了以下 5 个 hook 点包经过协议栈时会触发内核模块注册在这里的处理函数。触发哪个 hook 取决于包的方向ingress/egress、包的目的地址、包在上一个 hook 点是被丢弃还是拒绝等等。
include/uapi/linux/netfilter.henum nf_inet_hooks { NF_INET_PRE_ROUTING,NF_INET_LOCAL_IN,NF_INET_FORWARD,NF_INET_LOCAL_OUT, NF_INET_POST_ROUTING, NF_INET_NUMHOOKS };
NF_INET_PRE_ROUTING:接收到的包进入协议栈后立即触发此 hook在进行任何路由判断 将包发往哪里之前。NF_INET_LOCAL_IN:接收到的包经过路由判断如果目的是本机将触发此 hook。NF_INET_FORWARD:接收到的包经过路由判断如果目的是其他机器将触发此 hook。NF_INET_LOCAL_OUT:本机产生的准备发送的包在进入协议栈后立即触发此 hook。NF_INET_POST_ROUTING:本机产生的准备发送的包或者转发的包在经过路由判断之后 将触发此 hook。
注册处理函数时必须提供优先级以便 hook 触发时能按照优先级高低调用处理函数。这使得多个子模块或者同一内核子模块的多个实例可以在同一 hook 点注册并且有确定的处理顺序。内核模块会依次被调用每次返回一个结果给 netfilter 框架提示该对这个包做什么操作。
iptables组成 iptables 由 tables、chains、rules 3 部分组成 iptables 使用 table 来组织 rule根据 rule 是被用来做什么业务类型处理将 rule 分为不同 table。例如如果 rule 是处理网络地址转换的那会放到 nat table如果是判断是否允许数据包继续转发那可能会放到 filter table。 在每个 table 内部规则被进一步组织成 chain内置的 chain 是 netfilter hook 触发的chain 基本上能决定 rule 何时被匹配。 rule 放置在特定 table 的特定 chain 里面。当 chain 被调用的时候包会依次匹配 chain 里面的 rule。每条 rule 都有一个匹配部分和一个 target动作部分。
iptables规则
规则rules是应用于数据包的操作。
规则其实就是通过 iptables 配置的预定义的条件规则一般定义为 “如果数据包满足这些条件rules就会执行相应的的动作actions”。
规则可以匹配协议类型、目的或源地址、目的或源端口、目的或源网段、接收或发送的接口网卡、协议头、连接状态等信息当数据包与规则匹配时iptables就根据规则所定义的 actions 来处理这些数据包如放行accept、拒绝reject和丢弃drop等。
配置防火墙的主要工作就是添加、修改和删除这些规则。
目标target数据包符合某种规则条件而触发的动作action叫做目标target。
目标分为两种类型
终止目标terminating targets这种 target 会终止 chain 的匹配将控制权转移回 netfilter hook。根据返回值的不同hook 或者将数据包丢弃或者允许数据包进行下一阶段的处理。非终止目标non-terminating targets执行非终止目标动作然后继续 chain 的执行。虽然每个 chain 最终都会回到一个终止目标iptables 链
链chains是规则的集合。
内置的 chain 和 netfilter hook 是一一对应的内置的 chain 是由 netfilter hook 触发的。chain 基本上能决定basically determin规则何时被匹配。
PREROUTING chain:由 NF_INET_PRE_ROUTING hook 触发INPUT chain:由 NF_INET_LOCAL_IN hook 触发FORWARD chain:由 NF_INET_FORWARD hook 触发OUTPUT chain:由 NF_INET_LOCAL_OUT hook 触发POSTROUTING chain:由 NF_INET_POST_ROUTING hook 触发
chain 使管理员可以控制在包的传输路径上哪个 hook 点应用策略。
因为每个 table 有多个 chain因此一个 table 可以在处理过程中的多个地方施加影响。特定类型的规则只在协议栈的特定点有意义因此并不是每个 table 都 会在内核的每个 hook 注册 chain。
iptables 表
表tables是链的集合。
filter table 是最常用的 table 之一用于判断是否允许一个数据包通过。nat table 用于实现网络地址转换。当数据包进入协议栈的时候这些规则决定是否以及如何修改包的源/目的地址以改变数据包被路由时的行为。nat table 通常用于将数据包路由到无法直接访问的网络。mangle 表修改 IP 头。mangle修正table 用于修改数据包的 IP 头。例如可以修改数据包的 TTL增加或减少数据包可以经过的跳数。这个 table 还可以对数据包打上只在内核内有效的“标记”internal kernel “mark”后续的 table 或工具可以根据这些标记进行处理。标记不会修改包本身只是在包的内核表示上做标记。raw 表conntrack 相关。iptables 防火墙是有状态的对每个数据包进行判断的时候是依赖已经判断过的数据包。建立在 netfilter 之上的连接跟踪connection tracking特性使得 iptables 将数据包看作是已有连接或会话的一部分而不是一个由独立、不相关的数据包而组成的流。数据包到达网络接口之后很快就会有连接跟踪逻辑判断。raw table 定义的功能非常有限其唯一目的就是提供一个让数据包绕过连接跟踪的框架。security 表打 SELinux 标记。security table 的作用是给报文打上 SELinux 标记以此影响 SELinux 或其他可以解读 SELinux 安全上下文的系统处理报文的行为。这些标记可以基于单个报文也可以基于连接。每种 table 实现的 chain 下面的表格展示了 table 和 chain 的关系。横向是 table 纵向是 chainY 表示这个 table 里面有这个 chain。 例如第二行表示 raw table 有 PRETOUTING 和 OUTPUT 两 个 chain。具体到每列从上倒下的顺序就是 netfilter hook 触发的时候对应 table 的chain 被调用的顺序。 在下面的图中nat table 被细分成了 DNAT 修改目的 IP 和 SNAT修改源 IP以更方便地展示他们的优先级。另外我们添加了路由决策点和连接跟踪点以使得整个过程更完整全面
Tables/ChainPREROUTINGINPUTFORWARDOUTPUTPOSTROUTING路由判断YrawYY连接跟踪YYmangleYYYYYnatDNATYY路由判断YYfilterYYYsecurityYYYnatSNATYYY 当一个报文触发 netfilter hook 时处理过程将沿着列从上向下执行。触发哪个 hook列和报文的方向ingress/egress、路由判断、过滤条件等相关。 特定事件会导致 table 的 chain 被跳过。例如只有每个连接的第一个报文会去匹配 NAT 规则对这个报文的动作会应用于此连接后面的所有报文。到这个连接的应答报文会被自动应用反方向的 NAT 规则。
Chain 遍历优先级 假设服务器知道如何路由数据包而且防火墙允许数据包传输下面就是不同场景下报文的游走流程 收到的、目的是本机的包PRETOUTING - INPUT 收到的、目的是其他主机的包PRETOUTING - FORWARD - POSTROUTING 本地产生的包OUTPUT - POSTROUTING 综合前面讨论的 table 顺序问题我们可以看到对于一个收到的、目的是本机的包首先依次经过 PRETOUTING chain 上面的 raw、mangle、nat table然后依次经过 INPUT chain 的 mangle、filter、security、nat table然后才会到达本机的某个 socket。用户自定义 chain 这里要介绍一种特殊的非终止目标跳转目标jump target。jump target 是跳转到其他 chain 继续处理的动作。我们已经讨论了很多内置的 chain它们和调用它们的 netfilter hook 紧密联系在一起。然而iptables 也支持管理员创建他们自己用于管理目的的 chain。 向用户自定义 chain 添加规则和向内置的 chain 添加规则的方式是相同的。不同的地方在于 用户定义的 chain 只能通过从另一个规则跳转jump到它因为它们没有注册到 netfilter hook。 用户定义的 chain 可以看作是对调用它的 chain 的扩展。例如用户定义的 chain 在结束的时候可以返回 netfilter hook也可以继续跳转到其他自定义 chain。 这种设计使框架具有强大的分支功能使得管理员可以组织更大更复杂的网络规则。iptables 简明教程
iptables 语法格式
iptables[-t 表名]命令选项 链名条件匹配 [-j 目标动作或跳转]
iptables[-t 表名]对指定的表 table进行操作 table必须是以下表中的一个。如果不指定此选项默认的是 filter表。 raw 高级功能如网址过滤。 mangle 数据包修改QOS用于实现服务质量。 nat 地址转换用于网关路由器。 filter 包过滤用于防火墙规则。 securitySELinux 相关命令选项 -A 在指定链的末尾添加append一条新的规则 -D 删除delete指定链中的某一条规则可以按规则序号和内容删除 -I 在指定链中插入insert一条新的规则默认在第一行添加 -R 修改、替换replace指定链中的某一条规则可以按规则序号和内容替换 -L 列出list指定链中所有的规则进行查看 -E 重命名用户定义的链不改变链本身 -F 清空flush -N 新建new-chain一条用户自己定义的规则链 -X 删除指定表中用户自定义的规则链delete-chain -P 设置指定链的默认策略policy -Z 将所有表的所有链的字节和数据包计数器清零 -n 使用数字形式numeric显示输出结果 -v 查看规则表详细信息verbose的信息 -V 查看版本(version) -h 获取帮助help --line-numbers 规则显示带序号链名区分大小写必须为大写 INPUT链 处理输入数据包。 OUTPUT链 处理输出数据包。 FORWARD链 处理转发数据包。 PREROUTING链 用于目标地址转换DNAT。 POSTOUTING链 用于源地址转换SNAT。条件匹配 ! 表示取反/非 [!]-p 匹配协议 [!]-s 匹配源地址 [!]-d 匹配目标地址 [!]-i 匹配入站网卡接口 [!]-o 匹配出站网卡接口 [!]--sport 匹配源端口 [!]--dport 匹配目标端口 [!]--src-range 匹配源地址范围 [!]--dst-range 匹配目标地址范围 [!]--limit 四配数据表速率 [!]--mac-source 匹配源MAC地址 [!]--sports 匹配源端口范围 [!]--dports 匹配目标端口范围 [!]--state 匹配状态INVALID、ESTABLISHED、NEW、RELATED [!]--string匹配应用层字串匹配动作区分大小写必须为大写
ACCEPT接收数据包。
DROP丢弃数据包。
REDIRECT重定向、映射、透明代理。
SNAT源地址转换。
DNAT目标地址转换。
MASQUERADEIP伪装NAT用于ADSL。
LOG日志记录。
SEMARK :添加SEMARK标记以供网域内强制访问控制MAC
五、Netfilter 与 ebtables
netfilter 实现主要分两层 第一层在 IP 层由 IP 协议栈预留的 HOOK 点提供支持对应的应用层的管理工具是 iptables
第二层在链路层由软桥协议栈预留的 HOOK 点提供支持对应应用层的管理工具是 ebtables。
Netfilter 在 链路层L2提供了以下 6 个 hook 点其中 NF_BR_BROUTING 不是通过调用 netfilter 框架的 register 函数来进行 HOOK 的回调注册的。
include/uapi/linux/netfilter_bridge.h#define NF_BR_PRE_ROUTING 0#define NF_BR_LOCAL_IN 1#define NF_BR_FORWARD 2#define NF_BR_LOCAL_OUT 3#define NF_BR_POST_ROUTING 4/* Not really a hook, but used for the ebtables broute table */#define NF_BR_BROUTING 5#define NF_BR_NUMHOOKS 6
NF_BR_PRE_ROUTING:在网卡混杂模式 drop 之后进行 checksum 校验。NF_BR_LOCAL_IN:数据包的目的 MAC 是本地 box。NF_BR_FORWARD:数据包的目的 MAC 是桥的另一个接口。NF_BR_LOCAL_OUT:本机产生的数据包。NF_BR_POST_ROUTING:数据包即将发送出去。NF_BR_BROUTING:并不是真正的 hook被 ebtables 的 broute 表所使用的。ebtables ebtables 即以太网桥防火墙以太网桥工作在数据链路层ebtables用来过滤数据链路层数据包。在内核中ebtables 的数据截获点比 iptables 更“靠前”它获得的数据更“原始”ebtables 多用于桥模式比如控制 VLAN ID 等。 ebtables 的配置分为表、链和规则三级。表
表共分为三种: filter, nat, broute用 -t 选项指定。默认为 filter 表。
filter过滤本机流入流出的数据包时默认使用的表。它包含有 3 条链分别为 INPUT 链、OUTPUT 链、FORWARD 链。nat 用于 mac 地址转换mac-NAT。它包含有 3 条链分别为 PREROUTING 链、OUTPUT链、POSTROUTING 链。broute网桥的一种特殊工作模式它可以根据配置对满足某些规则的包送入三层进行路由也可以根据配置对满足某些规则的二层包进行 bridge。类似于 VPPVector packet processing中的 bridge-domain。它只有 1 个 BROUTING 链。链
链分为内置和自定义两种。不同的表内置链不同。自定义链挂接在对应的内置链内使用 -j 让其跳转到新的链中。
ebtables 共分为以下 6 条内置链
INPUT数据帧的目的地址是网桥本身。FORWARD被网桥转发的数据帧。OUTPUT针对本地生成和桥接路由的数据帧。PREROUTING在被网桥转发之前。POSTROUTING在被网桥转发之后。BROUTING以太帧进入网桥设备后首先通过的就是 BROUTING 链经过 BROUTING 后才决定数据包是进入网桥转发处理流程还是本地路由处理流程。规则
每个链中有一系列规则每个规则定义了一些过滤选项。每个数据包都会匹配这些项一旦匹配成功就会执行对应的动作TARGET。
目标TARGETS可以是以下
ACCEPT让以太帧通过此链。BROUTING 链ACCEPT 表示以太帧进入网桥转发处理流程DROP丢弃该以太帧。BROUTING 链DROP 表示以太帧进入本地路由处理流程CONTINUE检查同一条链的下一条规则一般用于统计通过该条链的流量。RETURN停止检查该条链的余下规则。TARGET EXTENSION扩展的执行目标如 –mark-set 等。
跳转到自定义的链进行规则匹配。
ebtables 简明教程
ebtables 使用规则如下
ebtables [-t 表名]命令选项 链名条件匹配 [-j 目标动作或跳转]
表名 filter, nat, broute 3 张表中的其中一个默认为 filter 表。命令选项 -A 添加到现有链的末尾 -D 从选定的链中删除一条或多条规则 -I 从选定的链中插入规则默认插入到头部。 -P 指定策略可以为ACCEPT、DROP或 RETURN -F 删掉所有的链 -Z 设置选定的链的计数为 0 -L 列出所有的规则 -n 显示规则的编码 -c 显示匹配统计链名区分大小写必须为大写 INPUT数据帧的目的地址是网桥本身。 FORWARD被网桥转发的数据帧。 OUTPUT针对本地生成和桥接路由的数据帧。 PREROUTING在被网桥转发之前。 POSTROUTING在被网桥转发之后。 BROUTING以太帧进入网桥设备后首先通过的就是 BROUTING 链经过 BROUTING 后才决定数据包是进入网桥转发处理流程还是本地路由处理流程。条件匹配 ! 表示取反/非 [!]-p 匹配协议 [!]-s 匹配源地址 [!]-d 匹配目标地址 [!]-i 匹配入站网卡接口 [!]-o 匹配出站网卡接口 [!]--logical-in 网桥入接口 [!]--logical-out 网桥出接口匹配动作区分大小写必须为大写
ACCEPT让以太帧通过此链。BROUTING 链ACCEPT 表示以太帧进入网桥转发处理流程
DROP丢弃该以太帧。BROUTING 链DROP 表示以太帧进入本地路由处理流程
CONTINUE检查同一条链的下一条规则一般用于统计通过该条链的流量。
RETURN停止检查该条链的余下规则。
TARGET EXTENSION扩展的执行目标如 –mark-set 等。
bridge-netfilter
ebtables 只可以简单过滤二层以太网帧无法过滤 ipv4 数据包。解决这个问题Linux内核引入了 bridge-netfilter以下简称br-nf以解决在链路层 Bridge 中处理 IP 数据包的问题比如在链路层内进行IP DNAT外部机器与主机上虚拟机之间的通信流量br-nf 也是 openstack 中实现安全组功能的基础。 br-nf 在链路层 Bridge 代码中插入了几个能够被 iptables 调用的钩子函数Bridge 中数据包在经过这些钩子函数时iptables 规则被执行(上图中 Link Layer 中的绿色小方框即是 iptables 插入到链路层的 chain蓝色小方框为 ebtables chain)。
这就使得 {ip,ip6,arp}tables 能够 “看见” Bridge 中的 IPv4,ARP 等数据包。这样不管此数据包是发给主机本身还是通过 Bridge 转发给虚拟机iptables 都能完成过滤。
br-nf 启用
加载br_netfilter.ko
rootubuntu:/home/ubuntu# modprobe br_netfilterrootubuntu:/home/ubuntu# lsmod | grep br_netfilterbr_netfilter 286720bridge 1761281br_netfilter
使能/proc/sys/net/bridge/bridge-nf-call-iptables
rootubuntu:/home/ubuntu# echo1 /proc/sys/net/bridge/bridge-nf-call-iptable