描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111657040
从理论、应用和实践三个维度介绍Web防火墙构建的相关知识
由浅入深地剖析OSI模型中不同层级的攻击原理和防御方法
涵盖环境搭建、攻击类型、攻击示例、攻击过程分析、防御方法……
系统介绍如何构建Web防火墙,内容新颖、独特
详细介绍从网络层到应用层的安全与防御知识
涉及TCP、iptables、Nginx、Redis及逆向分析等内容
结合实战经验,深度探索Web与网络安全的相关知识
涉及的防御工具已开源,可作为Web防火墙框架
提供QQ群,方便互动交流
《从实践中学习Web防火墙构建》深入介绍了Web防火墙的原理和架构,同时全面介绍了Nginx及其相关模块。本书基于Nginx 1.11和Naxsi 0.56编写,带领读者掌握Naxsi安全框架的用法,并将其应用于实践中。
《从实践中学习Web防火墙构建》共13章。第1章介绍iptables的基本知识,包括iptables的安装、配置及基本的使用方法;第2章介绍IP标头和TCP段结构,以及网络层的安全与防御;第3章介绍传输层的安全与防御;第4章介绍应用层的安全与防御;第5章介绍Web防火墙的发展史及WAF的种类;第6章介绍Naxsi模块,包括实现原理、配置、使用及规则生成等;第7章介绍动态限流模块ngx_dynamic_limit_req_module的原理及具体应用;第8章介绍RedisPushIptables模块,包括实现原理、安装、指令、API调用方法及应用场景;第9章结合前面介绍的内容,构建自己定制的Web防火墙;第10章介绍Nginx的开发,包括基本概念、数据类型及相关函数等;第11章介绍Nginx模块中的config文件的编写及调试;第12章介绍Redis模块的开发及RedisPushIptables代码拆解;第13章介绍逆向分析的思路及Rootkit攻击示例。
《从实践中学习Web防火墙构建》适合网络安全、Web安全、网站可靠性、Nginx模块、Redis模块和运维等领域的从业人员阅读,也适合作为架构师、软件开发人员及Linux爱好者了解和系统学习安全防御框架原理及实现细节的参考书。
第1章 iptables使用简介 1
1.1 iptables防火墙 1
1.2 基本概念 1
1.3 安装iptables 5
1.4 配置和使用 8
第2章 网络层的安全与防御 20
2.1 IP标头和TCP段结构 20
2.2 记录IP标头信息 34
2.3 网络层攻击定义 36
2.4 网络层攻击 37
2.5 网络层防御 41
第3章 传输层的安全与防御 42
3.1 记录传输层标头信息 42
3.2 传输层攻击定义 45
3.3 传输层攻击类型 45
3.4 传输层防御手段 52
第4章 应用层的安全与防御 55
4.1 iptables字符串匹配模块 55
4.2 应用层攻击定义 56
4.3 应用层攻击类型 56
4.4 应用层防御手段 62
第5章 Web防火墙类型 66
5.1 Web防火墙简介 66
5.2 Web防火墙历史 67
5.3 WAF与常规防火墙的区别 68
5.4 部署方式 68
5.5 Web防火墙的类型 71
5.6 各类防火墙的优缺点 72
第6章 Naxsi Web防火墙 73
6.1 Naxsi简介 73
6.2 Naxsi安装 73
6.3 Naxsi配置指令 76
6.4 Naxsi基础使用 84
6.5 Naxsi格式解析 91
6.6 示例 95
6.7 Naxsi深入探索 98
第7章 ngx_dynamic_limit_req_module动态限流 104
7.1 实现原理 104
7.2 功能 108
7.3 配置指令 110
7.4 扩展功能 115
第8章 RedisPushIptables模块 120
8.1 RedisPushIptables简介 120
8.2 RedisPushIptables与Fail2Ban比较 120
8.3 安装RedisPushIptables 122
8.4 动态删除配置 124
8.5 RedisPushIptables指令 125
8.6 客户端API示例 125
第9章 构建自己的WAF 130
9.1 安装所需软件 130
9.2 参数配置 131
9.3 白名单生成 133
9.4 白名单自动化生成 138
9.5 整合Fail2ban 144
9.6 定制开发Naxsi 146
9.7 Naxsi已知漏洞 151
9.8 多层防御整合后对比 156
9.9 可能存在的瓶颈 157
9.10 恶意IP库 157
第10章 Nginx开发指南 158
10.1 基本概念 158
10.2 字符串 161
10.3 日志时间格式 166
10.4 数据结构 167
10.5 内存管理 173
10.6 日志记录 177
10.7 结构体 178
10.8 事件 183
10.9 进程 186
10.10 线程 188
10.11 模块 189
10.12 HTTP框架 195
10.13 HTTP框架执行流程 203
10.14 变量 212
10.15 负载均衡 216
第11章 Nginx高级主题 220
11.1 模块转换 220
11.2 模块编译 222
11.3 config文件 222
11.4 Nginx调试 224
11.5 示例 226
第12章 Redis模块编写 231
12.1 模块简介 231
12.2 模块API 233
12.3 RedisPushIptables代码拆解 235
第13章 后门分析与监测 244
13.1 溯源步骤和攻击示例 244
13.2 修补漏洞 253
13.3 监测主机异常 253
Nginx是一种Web服务。它也可以被用作反向代理、负载平衡、邮件代理和HTTP缓存。该软件由Igor Sysoev创建,并于2004年首次公开发布。2011年成立了与Nginx软件同名的公司,提供相关技术支持和Nginx付费版软件。根据Netcraft在2016年11月的Web服务调查可知,Nginx是所有活跃站点和百万繁忙站点中使用次数多的Web服务。
随着Nginx用户量的不断增长及使用场景的不断丰富,用户对于它的需求也越来越多,而相应的层出不穷的网络攻击也是“水涨船高”。于是出现了很多优秀的第三方模块来满足用户的需求,其中Modsecurity(黑名单)和Naxsi(白名单)就是比较有代表性的模块。它们都是开源的Web防火墙。虽然已经有了这些解决方案,但市面上详细讲解如何结合Nginx、Naxsi、ngx_dynamic_limit_req_ module和RedisPushIptables进行应用层与网络层协同防御的图书却少之又少。
ngx_dynamic_limit_req_module和RedisPushIptables模块都已在GitHub上开源。书中对其核心概念及应用做了详细讲解,并针对不同应用场景给出了多种基于Nginx的防护模式,为读者快速掌握Web防火墙构建提供了系统的实践指南。相信通过对本书内容的学习,读者能够掌握Nginx模块、Redis模块及Linux内核模块的开发技巧,从而拥有安防领域的应对能力。
《从实践中学习Web防火墙构建》特色
独特:本书是一部系统地介绍如何构建Web防火墙的技术专著,内容新颖而独特。
系统:全面讲解从网络层到应用层的安全与防御知识。
广泛:涉及TCP、iptables、Nginx、Redis及逆向分析等众多知识。
深入:结合作者多年的实战经验,带领读者深度探索Web防火墙及与网络安全相关的知识。
实用:讲解图文并茂,并提供源代码,书中所讲的防御工具都已开源,可作为Web防火墙框架使用。
《从实践中学习Web防火墙构建》内容
第1章介绍了iptables的基本知识,包括iptables的安装、配置及使用示例。
第2章介绍了网络层的安全与防御,包括IP标头和TCP段结构,以及网络层的攻击与防御。
第3章介绍了传输层的安全与防御,包括记录传输层标头信息、传输层攻击定义、传输层攻击类型和传输层防御手段等。
第4章介绍了应用层的安全与防御,包括iptables字符串匹配模块、应用层攻击的定义、应用层攻击类型和应用层防御手段等。
第5章介绍了Web防火墙的类型,包括Web防火墙的历史、Web防火墙与常规防火墙的区别、Web防火墙的部署方式、Web防火墙的类型,以及各种防火墙的优缺点等。
第6章介绍了Naxsi Web防火墙,包括Naxsi简介、Naxsi安装、Naxsi配置指令、Naxsi基础使用、Naxsi格式解析和Naxsi深入探索等。
第7章介绍了ngx_dynamic_limit_req_module动态限流模块,包括其实现原理、功能、配置指令、扩展功能及应用场景等。
第8章介绍了RedisPushIptables模块,包括其实现原理、安装、指令、API调用方法及应用场景等。
第9章结合前8章所介绍的知识,详细介绍了如何构建自己定制的Web防火墙,包括软件安装、参数配置、白名单生成、白名单自动化生成、整合Fail2ban、定制开发Naxsi、Naxsi已知漏洞修复、多层防御整合后的对比等。
第10章介绍了Nginx开发的相关知识,包括基本概念、数据类型、内存管理及相关函数等。
第11章介绍了Nginx模块中config文件的编写及调试等高级主题,包括模块转换、模块编译、新旧config文件格式的区别及Nginx调试等。
第12章介绍了Redis模块的编写,包括模块简介、模块开发及RedisPushIptables代码拆解等。
第13章介绍了逆向分析的思路及Rootkit攻击示例,包括溯源步骤、修补漏洞及监测主机异常等。
配套代码获取方式
《从实践中学习Web防火墙构建》涉及的所有代码均可在https://github.com/limithit上下载。另外,读者也可以登录华章公司的网站www.hzbook.com,在该网站上搜索到本书,然后单击“资料下载”按钮,即可在本书页面上找到下载链接。
《从实践中学习Web防火墙构建》读者对象
网络安全从业人员;
Web安全从业人员;
信息安全研究人员;
Web防火墙技术爱好者;
SRE工程师;
运维工程师;
架构师及软件开发人员;
Linux爱好者;
高校及专业培训机构的学生。
作者与售后
《从实践中学习Web防火墙构建》作者张博,拥有超过7年的运维经验,是Nginx模块和Redis模块的资深开发者。读者在阅读本书时若发现错漏和不足之处,请及时反馈,以便及时改正。联系邮箱:[email protected]。
市面上介绍网络安全技术的图书很多,有些过于基础,有些又过于理论化,实操价值不高。本书理论结合实践,从Nginx生态的整体视角阐述和解决问题,很实用,也非常有价值,填补了国内构建WAF类图书市场的空白。贤弟长期在一线参与实际项目,其作品是他多年实战经验的总结,强烈推荐网络安全行业的从业者阅读。
——昆明天问科技CEO 杨家宝
本书是一部由浅入深地讲述如何构建Web防火墙的佳作。书中循序渐进地介绍了TCP/IP和OSI模型中的网络层、传输层和应用层的安全和防御知识。书中讲解的关于Nginx的实战案例,符合大多数安全人员的需要,非常值得阅读。
——同盾科技高级数据开发工程师 程万胜
本书由资深运维安全专家打造,系统地介绍了网络安全的相关知识。本书特别注重对读者的动手能力和学习能力的培养,讲解时不但剖析了相关的理论知识,而且还给出了多个实践案例,真正做到了“授人以渔”,非常值得安全技术爱好者阅读。
——杭州九狮科技CEO 周宗章
本书结合作者多年的网络安全和系统安全从业经验,深入浅出地讲述了WAF的理论基础与实践流程,相信会对读者在Web防火墙构建方面有所启发和帮助。
——阿里前开发工程师/昆明雷脉科技CEO 雷加洪
互联网时代,数据安全是所有企业都要面临的一个巨大挑战。如果企业不能适应这个挑战,不能保障企业用户数据的安全,那么用户又如何相信企业呢?本书从Web防火墙构建的角度,全方位地解决企业的网络安全问题,值得每一位网络安全从业者阅读。
——全球时刻CTO/IBM前Java资深专家 喻立久
第1章 iptables使用简介
本章首先介绍iptables防火墙的发展史,然后讲解iptables的安装方法、内核编译配置、语法及规则的管理与使用,后介绍nftables防火墙,并且与iptables防火墙进行比较。为了使读者进一步了解iptables的用法,同时还提供了两个iptables用法示例,分别是以iptables作为防火墙和以iptables作为路由器时的两种情况,供读者参考。
这里我们仅用到iptables的部分功能,这部分功能在网络安全防御中足以受用。iptables工作在OSI七层模型中的数据链路层(MAC、ARP)、网络层(IP、ICMP)和传输层(TCP、UDP、SCTP)中。
1.1 iptables防火墙
iptables是用户空间命令行程序,它面向系统管理员,用于向内核Linux 2.4.x或更高版本的内核传递过滤规则集,而过滤规则是由不同的Netfilter模块实现的。由于网络地址转换也是从数据包过滤规则集配置的,所以网络地址转换也可以使用iptables。
iptables也用于指代Linux内核级防火墙,可以直接使用iptables进行配置或者用图形管理工具进行配置。iptables用于IPv4。ip6tables用于IPv6。iptables和ip6tables有相同的语法,但一些选项特定用于IPv4或IPv6。
iptables的继承者是nftables,其在内核版本3.13中首次出现,该版本发布日期为2014年1月19日。Linux防火墙的演变过程如下:
ipfirewall→ipchains→iptables→nftables。
1.2 基 本 概 念
iptables在网络防护时用于检查、修改、转发、重定向或丢弃IP数据包。过滤IP数据包的代码已经内置到Linux内核中,并被组织成表,每个表都有特定的用途。这些表由预定义链组成,链则包含按顺序遍历的规则。每个规则都包含匹配条件和相应的操作,称之为目标,如果条件为真,则执行,即条件匹配。
iptables是用户空间程序,允许用户使用这些链或规则。大多数新用户认为Linux IP路由非常复杂,但实际上常见的用例NAT或基本的Internet防火墙要更复杂一些。
理解iptables如何工作的关键在于理解其规则的执行流程,如图1.1所示。图中,椭圆形框内顶部的小写字母是表,下面的大写字母是链,任何网络接口上的数据包都是从上到下遍历。
图1.1 iptables规则执行流程图
1.2.1 iptables包含表
iptables包含5个表(tables),具体如下:
l raw表:具有精准的标记功能,其目的是提供一种标记数据包的机制,以便选择退出连接跟踪。构建在netfilter框架之上的连接跟踪功能,允许iptables将数据包视为正在进行的连接或会话的一部分,而不是作为离散的无关数据包。连接跟踪逻辑通常在数据包到达网络接口后很快应用。
l filter表:默认使用的表,是广泛使用的表之一。该表用于决定是否让数据包继续到达预期目的地或拒绝其请求,在防火墙用语中称为“过滤”数据包。该表提供了人们在讨论防火墙时所考虑的大部分功能。
l nat表:用于实现网络地址转换规则。当数据包进入网络堆栈时,该表中的规则将确定如何修改数据包的源地址或目标地址,以便修改数据包和任何响应流量的路由方式。
l mangle表:用于以各种方式来更改数据包的IP标头。例如,用户可以调整数据包的TTL值,或者延长、缩短数据包可以承受的有效网络跳数。其他IP标头头可以用类似的方式更改。
l security表:用于在数据包上设置内部SELinux安全上下文的标记,这将决定SELinux安全上下文的系统该如何处理数据包。
在大多数常见的用例中,只使用其中两个表,即filter和nat。其他表则涉及多个路由器和路由决策的复杂配置,这里不做深入讲解。
1.2.2 iptables包含链
表由链(chain)组成,具体如下:
l raw表:包含PREROUTING和OUTPUT。
l filter表:包含INPUT、FORWARD和OUTPUT。
l nat表:包含PREROUTING、INPUT、OUTPUT和POSTROUTING。
l mangle表:包含PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING。
l security表:包含INPUT、FORWARD和OUTPUT。
默认情况下,链不包含任何规则。用户可以将规则附加到要使用的链上。链也有一个默认的策略,它通常被设定为ACCEPT,但其可以重置DROP,默认策略始终适用于链的末尾。因此,在应用默认策略之前,数据包必须通过链中的所有规则,用户定义可以添加链以使规则集更有效或更容易修改。
1.2.3 连接状态
连接跟踪和系统跟踪的连接将处于以下状态之一。
l NEW:当用户数据包到达服务端时与现有连接无关,但当个数据包无效时,将使用此标签向系统添加新连接。这种情况发生在TCP等连接感知协议和UDP等无连接协议时。
l ESTABLISHED:当一个连接从NEW改变到ESTABLISHED时,它是在相反的方向上接收有效响应。对于TCP连接,这意味着SYN/ACK;而对于UDP和ICMP流量,则意味着响应原始数据包的源和目标的切换。
l RELATED:标记了不属于现有连接但与系统中已存在的连接关联的数据包RELATED。这可能意味着辅助连接,比如FTP数据传输连接的情况,或者它可能是ICMP对其他协议的连接尝试的响应。
l INVALID:如果数据包与现有连接无关,则不适合打开新连接。如果无法识别或者由于其他原因导致无法路由,则可以标记数据包。
l UNTRACKED:可以将数据包标记为UNTRACKED,就像它们已成为raw表链中的目标,用以绕过跟踪。
l SNAT:NAT更改源地址时设置的虚拟状态。由连接跟踪系统使用,以便知道在回复数据包中更改源地址。
l DNAT:目的网络地址转换(DNAT)是一种用于透明地更改终路由数据包的目的IP地址。位于两个端点之间的任何路由器都可以执行此数据包的转换。DNAT通常用于在公共可访问IP地址上发布位于专用网络中的服务。当在整个服务器上使用DNAT时,这种DNAT的使用也被称为端口转发。
1.2.4 iptables规则
数据包过滤基于iptables规则,该规则由多个匹配条件和一个目标指定。规则可能匹配的典型事项是数据包所在接口(如eth0或eth1)类型的数据包(ICMP、TCP或UDP)或数据包的目标端口。
使用-j或–jump选项可以指定目标。目标可以是用户定义的链(如果这些条件匹配,则跳转到用户定义的链并继续在那里处理),也可以是一个特殊的内置目标ACCEPT、DROP、QUEUE和RETURN,或者是目标扩展,如REJECT和LOG。如果目标是内置目标,则立即决定分组的命运,并且停止当前表中的分组处理。
如果目标是用户定义的链,并且数据包的命运不是由第二个链决定的目标,则将根据原始链的剩余规则对其进行过滤。
1.2.5 具体目标
在任何接口上接收的网络数据包都将按照如图1.1所示的流程图来显示顺序遍历表的流量控制链。个路由决策决定数据包的终目的地是否是本地机器或其他地方,后续路由决策决定分配给传出数据包的接口。
路径中的每个链应按顺序评估该链中的每个规则,并且只要规则匹配,就能执行相应的目标或者跳转动作。这里常用的目标是ACCEPT和DROP。内置链可以有默认策略,但用户定义的链没有默认策略。在任何时候,如果能对具有DROP目标的规则实现完全匹配,则应丢弃该分组且不做进一步处理。
1.2.6 iptables扩展模块
有许多模块可用于扩展iptables,如connlimit、conntrack、limit和recent,这些模块添加了额外的功能,用来允许复杂的过滤规则。例如xtables-addons扩展,它包含iptables尚未接受的扩展。如果这些功能还不能满足需求,那么用户可以自己编写Netfilter模块,详细信息可到官网查阅,网址为http://xtables-addons.sourceforge.net。
1.3 安装iptables
iptables是用户空间与Netfilter通信的工具,它可以从官网http://www.netfilter.org/上下载。Netfilter可以在内核编译期间将其配置到内核中。本节将会具体介绍内核的设置步骤。
1.3.1 内核设置
Linux目前的发行版本中都内置了预编译的iptables工具和Netfilter模块,但在早期的2.6内核及所有的2.4内核中,Netfilter模块并没有启用,交叉编译内核时需要配置,所以下面将讲解内核的设置步骤。
首先我们要获得Linux内核的压缩文件。获取的方式有很多种,直接的方式是去内核官网(http://www.kernel.org)查看,或在各镜像网站上下载,这里不再说明。本书下载的是linux-4.20.4.tar.xz的稳定版,如下:
root@debian:~/bookscode# tar xvf linux-4.20.4.tar.xz #解压
root@debian:~/bookscode# cd linux-4.20.4/ #进入目录
其次是配置内核。配置内核的方法也有很多种,每个make就是一种方法,我们只需要选择其中的一种即可,具体如下:
l make config:遍历选择所要编译的内核特性。
l make allyesconfig:配置所有可编译的内核特性。
l make allnoconfig:可选的模块都回答no,必选的模块都选择yes。
l make menuconfig:打开一个窗口,然后在里面选择要编译的项。
l make kconfig:在KDE桌面环境下安装Qt开发环境。
l make gconfig:在Gnome桌面环境下安装GTK开发环境。
l menuconfig:如果是新安装的系统,则需要安装GCC和Ncurses-devel这两个包才可以打开并使用menuconfig命令配置内核,然后在弹窗中选择要编译的项即可。通过运行make menuconfig会弹出如图1.2所示的窗口。
图1.2 内核配置
选择Networking support | Networking options | Network packet filtering framework (Netfilter) | Core Netfilter Configuration命令就可以开启或关闭某个功能。如果没有特别要求就保持默认配置。接着依次执行make、make modules_install和make install命令即可,后修改grub引导,使用的内核即可。
1.3.2 iptables安装方式
提醒读者,iptables并不提供防火墙的功能,它只是用来与Netfilter沟通的工具。iptables的安装方式有两种,即二进制安装和源码安装。
1.二进制安装
二进制安装通常是Linux发行版预编译好的二进制iptables工具,如rpm和deb包,安装起来较为简单,编译时默认并没有把所有选项都加上,而且不是由的iptables源代码编译而来。Debian和Ubuntu用户安装如下:
root@debian:~/bookscode/linux-4.20.4# apt-get install iptables -y
#安装版
Redhat和Centos用户安装如下:
yum install iptables -y #安装版
2.源码安装
源码安装的好处是可以自己定制功能,重要的是可以编译非官方扩展模块,缺点是对普通用户来说使用难度加大了。笔者的内核是4.9.0-3-amd64版本,在写作此书时iptables的版本为iptables-1.8.2.tar.bz2,有两个依赖包也都是版本libmnl-1.0.4.tar.bz2和libnftnl-1.1.2.tar.bz2。如果读者的内核版本较低,请不要安装版本的iptables,建议安装iptables-1.6系列,命令如下:
root@debian:~/bookscode/ libmnl-1.0.4#./configure #检查安装环境
root@debian:~/bookscode/ libmnl-1.0.4#make ; make install
root@debian:~/bookscode/libnftnl-1.1.2#./configure #检查安装环境
root@debian:~/bookscode/libnftnl-1.1.2# make -j4; make install
#iptables使用的库
root@debian:~/bookscode/iptables-1.8.2# ./configure #检查依赖
Iptables Configuration:
IPv4 support: yes
IPv6 support: yes
Devel support: yes
IPQ support: no
Large file support: yes
BPF utils support: no
nfsynproxy util support: no
nftables support: yes
connlabel support: yes
Build parameters:
Put plugins into executable (static): no
Support plugins via dlopen (shared): yes
Installation prefix (–prefix): /usr/local
Xtables extension directory: /usr/local/lib/xtables
Pkg-config directory: /usr/local/lib/pkgconfig
Host: x86_64-unknown-linux-gnu
GCC binary: gcc
root@debian:~/bookscode/iptables-1.8.2# make -j4; make install #编译并安装
1.4 配置和使用
本节主要介绍iptables使用管理和运行状态查看的相关内容,以及继任者nftables的相关内容,后将示范两个iptables在工作环境中的具体应用实例。
1.4.1 nftables防火墙
nftables是新的数据包分类框架,旨在取代现有的{ip、ip6、arp、eb}_tables基础结构。简而言之,nftables的特性如下:
l 在Linux内核3.13或更高的版本中可用。
l 带有一个新的命令行实用程序nft,其语法与iptables不同。
l 带有一个兼容层,允许在新的nftables内核框架上运行iptables命令。
l 提供了通用的集合基础结构,允许构建映射和连接,可以使用此新功能在多维树中排列规则集,这会大大减少需要检查的规则数,直到在数据包上找到终操作为止。
l 通过增强的通用集和映射基础结构,更快地分组数据包。
l 简化双栈IPv4 / IPv6管理,通过新的inet系列,允许注册时看到IPv4和IPv6流量的基链。
l 更好地支持与更新动态规则集。
l 为第三方应用程序提供Netlink API,就像其他Linux Networking和Netfilter子系统一样。
l 解决了语法不一致的问题,并提供了更好、更紧凑的语法。
l 避免代码重复和不一致。许多iptables扩展都是特定于协议的,因此没有统一的方法来匹配数据包字段,而iptables支持的每个协议都对应一个Netfilter扩展模块。这会使代码库与代码非常相似,从而执行类似的任务,有效负载匹配。
1.4.2 iptables的缺点
iptables工具以逐个数据包的方式过滤流量,记录可疑的流量活动,执行NAT和其他事情。它提供了超过100个在过去的15年中所贡献的扩展。然而iptables框架也有局限性,并且无法轻易解决。比如,当我们对iptables进行一些更改时,不得不重新编译内核,因为每个匹配或目标都需要一个内核模块。当一个新协议出现时,就需要重新编译内核来支持对iptables规则的改动。
1.4.3 nftables与iptables的主要区别
从用户的角度来看,nftables相对于iptables的优点如下:
(1)语法不同。iptables的命令行工具使用getopt_long()解析命令,其中,命令是由两个横杠(–)或一个横杠(-)构成,例如-p tcp –dport。在这方面,nftables将使用更好、更直观、更紧凑的语法。
(2)表和链完全可配置。在nftables中,表是没有特定语义的链容器。请注意,iptables附带了具有预定义数量的基链的表,用户只能选择是与否。因此,即使只需要其中一个链,也会注册所有链;即使根本没有添加任何规则,未使用的基链也会损害性能。使用nftables这种新方法,用户可以根据自己的设置注册所需的链。此外,用户还可以按照需要的方式使用链优先级对管道建模,并为表和链选择任何名称。
(3)不再区分匹配和目标。在nftables中,表达式是规则的基本构建块,因此规则基本上是从左到右线性计算表达式的组合:如果个表达式匹配,则评估下一个表达式,以此类推,直到达到作为规则一部分的后一个表达式。表达式可以匹配某些特定的有效负载字段,例如数据包、流元数据和任何操作。
(4)在nftables中,可以在一个规则中指定多个目标;但是在iptables中,用户只能指定一个目标,这是用户通过跳转到自定义链来解决的长期限制,其代价是使规则集结构稍微复杂一些。
(5)在iptables中,每个链和规则没有内置计数器;但在nftables中,这些链和规则是可选的,因此可以按需启用计数器,更好地支持动态规则集更新。
(6)简化的双栈IPv4 / IPv6管理。通过新的inet系列,允许用户注册时可以看到IPv4和IPv6流量的基链。因此,用户不再需要依赖脚本来复制规则集。
(7)通用集和地图基础设施。这种新的基础架构紧密集成到nftables核心中,它允许高级配置,如字典、映射和间隔来实现面向性能的数据包分类。重要的是,用户可以使用任何受支持的过滤器对流量进行分类。
(8)支持连接。从Linux内核4.1开始,用户可以连接几个键并将它们与字典和映射组合在一起。
(9)没有内核升级的新支持协议。内核升级是一项耗时且烦琐的任务,特别是如果用户必须在网络中维护多个单一防火墙,出于稳定性原因,使用者通常使用较旧的Linux内核版本。使用虚拟机运行nftable的方式,用户可以不用这样升级来支持新协议,相对简单的nft用户空间软件更新足以支持新协议。
1.4.4 从iptables迁移到nftables
多数用户所要面对的情景是从现有的iptables规则集迁移到nftables的规则集上。Netfilter团队已经创建了一些工具和机制来简化此举。迁移之后,建议使用新的nftables机制,如集合、映射、字典和连接等。
可以生成iptables或ip6tables命令的转换来了解nftables的等效命令,例如:
允许新的请求连接本机tcp 22端口,翻译成nftables的语法
# iptables-translate -A INPUT -p tcp –dport 22 -m conntrack –ctstate NEW
-j ACCEPT
nft add rule ip filter INPUT tcp dport 22 ct state new counter accept
允许内网IP使用udp协议,且端口是111和222时才能通信
# ip6tables-translate -A FORWARD -i eth0 -o eth3 -p udp -m multiport –dports
111,222 -j ACCEPT
nft add rule ip6 filter FORWARD iifname eth0 oifname eth3 meta l4proto udp
udp dport {111,222} counter accept
也可以一次性翻译整个规则集,而不是逐个翻译,例如:
iptables-save > save.txt #将iptables规则重定向到save.txt文件中
# Generated by iptables-save v1.8.2 on Wed Apr 17 19:34:55 2019
*filter
:INPUT ACCEPT [5166:1752111] #filter表INPUT链默认允许通信
:FORWARD ACCEPT [0:0] #filter表FORWARD链默认允许通信
:OUTPUT ACCEPT [5058:628693] #filter表OUTPUT链默认允许通信
-A FORWARD -p tcp -m tcp –dport 22 -m conntrack –ctstate NEW -j ACCEPT
#允许连接22端口
COMMIT
# Completed on Fri Jan 25 11:22:43 2019
整个翻译如下:
iptables-restore-translate -f save.txt
#一次翻译上述规则,译成nftables的规则
# Translated by iptables-save v1.8.2 on Wed Apr 17 19:34:55 2019
add table ip filter
add chain ip filter INPUT { type filter hook input priority 0; }
add chain ip filter FORWARD { type filter hook forward priority 0; }
add chain ip filter OUTPUT { type filter hook output priority 0; }
add rule ip filter FORWARD tcp dport 22 ct state new counter accept
重定向给nftables,如下:
iptables-restore-translate -f save.txt > ruleset.nft
nft -f ruleset.nft #从文件加载规则
nft list ruleset #查看nftables规则列表
table ip filter {
chain INPUT {
type filter hook input priority 0; policy accept;
}
chain FORWARD {
type filter hook forward priority 0; policy accept;
tcp dport ssh ct state new counter packets 0 bytes 0 accept
}
chain OUTPUT {
type filter hook output priority 0; policy accept;
}
}
%注意:大约有10%的iptables语句是不支持翻译成nftables语句的。Linux发行版预编译的iptables并不包含iptables-restore-translate和iptables-translate命令,需要自己编译。
1.4.5 iptables语法
iptables有着强大的功能,不同的规则组合发挥的效用也不同,每个人面对的情况也不尽相同。灵活地配置规则是运维人员的技能,所以学习其语法是基础。iptables的语法大纲如下:
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches…] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
iptables和ip6tables用于在Linux内核中设置、维护和检查IPv4和IPv6数据包过滤规则表。每个表包含许多内置链,也可能包含许多用户定义的链;每个链都可以匹配一组数据包的规则,每个规则都可指定如何处理匹配的数据包,这叫做target,用于跳转到同一个表中的用户定义链。
防火墙规则指定数据包和目标条件。如果数据包不匹配,则检查链中的下一个规则;如果数据包匹配,则执行对应的目标动作,下一个规则由目标的值指定,该值可以是 ACCEPT、DROP或RETURN。如果是ACCEPT,则意味着让数据包通过。
DROP意味着将数据包丢弃,RETURN则返回一个值。如果到达内置链的末尾或者匹配目标RETURN内置链中的规则,则链策略指定的目标将确定数据包的命运,即通过或者丢弃。
iptables防火墙目前有5个独立的表,-t, –table table选项指定命令应对其执行的数据包匹配表。如果内核配置了自动模块加载,则会尝试加载该表(filter、nat、mangle、raw和security,根据模块选择其一)的相应模块,具体如下:
l filter:默认表。它包含内置链,以及用于发往本地套接字的数据包INPUT、用于通过盒子路由的数据包FORWARD和用于本地生成的数据包OUTPUT。
l nat:当遇到创建新连接的数据包时会查询此表。它由4个内置链组成:用于在数据包进入后立即更改数据包的命令PREROUTING、用于更改发往本地套接字的数据包的命令INPUT、用于在路由之前更改本地生成的数据包的命令OUTPUT,以及用于更改数据包的命令POSTROUTING。自内核3.7以后,IPv6 NAT支持可用。
l mangle:用于更改专门的数据包。在内核2.4.17之前,它有两个内置链:用于在路由之前更改传入的数据包PREROUTING和用于在路由之前更改本地生成的数据包OUTPUT。从内核2.4.18开始还支持另外3个内置链:用于进入盒子本身的数据包INPUT、用于改变通过盒子路由的数据包FORWARD,以及用于改变的数据包POSTROUTING。
l raw:该表主要用于配置与NOTRACK目标相结合的连接跟踪豁免。它在具有更高优先级的netfilter挂钩中注册,因此在ip_conntrack或任何其他IP表之前调用。它提供了两个内置链:用于通过任何网络接口到达的数据包PREROUTING和用于本地进程生成的数据包OUTPUT。
l security:该表用于强制访问控制MAC网络规则,例如由SECMARK和CONNSE- CMARK目标启用的规则。强制访问控制由Linux安全模块,如SELinux实现。在过滤表之后调用安全表,允许过滤表中的任何自主访问控制规则在MAC规则之前生效。security表提供了3个内置链:用于进入盒子本身的数据包INPUT、用于在路由之前更改本地生成的数据包OUTPUT,以及用于更改通过盒子路由的数据包FORWARD。
iptables和ip6tables识别的选项可以分为几个不同的组,这些选项指定要执行的操作,除非下面另有说明,否则只能在命令行中指定其中一个。
l -A, –append chain rule-specification:将一个或多个规则附加到所选链的末尾。当源和/或目标名称解析为多个地址时,将为每个可能的地址组合添加规则。
l -C, –check chain rule-specification:检查所选链中是否存在与规范匹配的规则。该命令使用与-D相同的逻辑来查找匹配的条目,但不会更改现有的iptables配置,不会使用其退出代码来指示成功或失败。
l -D, –delete chain rule-specification:可以理解为iptables -D INPUT -s 1.1.1.1 -j DROP。
l -D, –delete chain rulenum:从所选链中删除一个或多个规则。该命令有两个版本:规则可以指定为链中的数字或匹配的规则。例如,iptables -D INPUT 1是删除INPUT链的条规则。
l -I, –insert chain [rulenum] rule-specification:在所选链中插入一个或多个规则以外给定的规则编号。因此,如果规则编号为1,则将规则插入链的头部;如果未指定规则编号,则是默认值。
l -R, –replace chain rulenum rule-specification:替换所选链中的规则。如果源和/或目标名称解析为多个地址,则命令失败,那么规则从1开始编号。
l -L, –list [chain]:列出所选链中的所有规则。如果未选择链,则列出所有链。像其他iptables命令一样,它适用于指定的表(过滤器是默认值),所以NAT规则由iptables -t nat -n -L列出。请注意它通常与-n选项一起使用,以避免长反向DNS查找。指定-Z(零)选项也是合法的,在这种情况下,链将被原子列出并归零。
l -S, –list-rules [chain]:打印所选链中的所有规则。如果没有选择链,则所有链都像iptables-save一样打印。与其他iptables命令一样,它适用于指定的表(过滤器是默认值)。
l -F, –flush [chain]:刷新选定的链,相当于逐个删除所有规则。
l -Z, –zero [chain [rulenum]]:将所有链中的数据包和字节计数器归零,或仅归零给定链,或仅将链中的给定规则归零。同样指定-L, -list(list)选项是合法的,可以在清除之前立即查看计数器。
l -N, –new-chain chain:按给定名称创建新的用户定义链,不能重复。
l -X, –delete-chain [chain]:删除指定的可选用户定义链时,必须是没有对链的引用。如果有,则必须删除或替换相关规则才能删除链。链必须是空的,即不包含任何规则。如果没有给出参数,将尝试删除表中的每个非内置链。
l -P, –policy chain target:将内置(非用户定义)链的策略设置为给定目标。策略目标必须是ACCEPT或DROP。
l -E, –rename-chain old-chain new-chain:将用户指定的链重命名。
l -h:给出命令语法描述。
以下参数构成规则规范:
l -4, –ipv4:该选项对iptables和iptables-restore没有影响。如果使用-4选项的规则插入ip6tables-restore,则该选项将被默认忽略,其他的用途会引发错误。该选项允许将IPv4和IPv6规则放在单个规则文件中,以便与iptables-restore和ip6tables-restore一起使用。
l -6, –ipv6:如果使用-6选项的规则与iptables-restore一起插入,则将被默认忽略,其他用途将会引发错误。该选项允许将IPv4和IPv6规则放在单个规则文件中,以便与iptables-restore和ip6tables-restore一起使用。该选项在ip6tables和ip6tables- restore中无效。
l [!] -p, –protocol protocol:规则或要检查的数据包协议。指定的协议可以是tcp、udp、udplite、icmp、icmpv6、esp、ah、sctp、mh或特殊关键字all之一,也可以是数值,表示这些协议之一或不同的协议,还允许来自/ etc / protocols的协议名称。一个“!”协议反转测试前的参数,数字0等于全部。all将与所有协议匹配,并在省略此选项时作为默认值。
%注意:在ip6tables中,不允许使用除esp之外的IPv6扩展头。esp和ipv6-nonext可以与内核版本2.6.11或更高版本一起使用。数字0等于all意味着用户无法直接测试值为0的协议字段,要匹配HBH表头,即使它是后一个,也不能使用-p 0,但总是需要-m hbh。
l [!] -s, –source address[/mask][,…]:来源规范。地址可以是网络名称、主机名、网络IP地址(带/掩码)或纯IP地址。在将规则提交给内核之前,主机名将仅解析一次。
%注意:使用远程查询(如DNS)指定要解析的任何名称是一个非常糟糕的主意。掩码可以是ipv4网络掩码(用于iptables)或普通数字,指定网络掩码左侧1的数量。因此,iptables掩码24等于255.255.255.0。一个“!”代表取相反的地址。标志–src是此选项的别名。可以指定多个地址,但这将扩展为多个规则,或者将导致删除多个规则。
l [!] -d, –destination address[/mask][,…]:目的地规格。有关语法的详细说明,请参阅-s(source)标志的说明。标志–dst是此选项的别名。
l -m, –match match:指定要使用的匹配项,即测试特定属性的扩展模块。匹配集构成了调用目标的条件。首先按照命令行中的指定评估匹配并以短路方式工作,即如果一个扩展产生错误,则评估将停止。
l -j, –jump target:指定规则的目标,即如果数据包匹配该怎么办。目标可以是用户定义的链(不是此规则所在的链),是立即决定数据包命运的特殊内置目标之一或扩展。
l -g, –goto chain:-g选项将规则重定向到一个用户自定义的链中,与-j选项不同,从自定义链中返回时是返回到调用-g选项上层的那一个-j链中。
l [!] -i, –in-interface name:接收仅适用于进入INPUT、FORWARD和PREROUTING链的数据包的接口名称。当“!”在接口名称之前使用参数,意义是反转的。如果接口名称以“ ”结尾,则以–in-interface name名称开头的任何接口都将匹配。如果省略-i选项,则任何接口名称都将匹配。
l [!] -o, –out-interface name:将通过其发送对于进入FORWARD、OUTPUT和POSTROUTING链的数据包的接口名称。当“!”在接口名称之前使用参数,意义是反转的。如果接口名称以“ ”结尾,则以此名称开头的任何接口都将匹配。如果省略-o选项,则任何接口名称都将匹配。
l [!] -f, –fragment:该规则仅引用分段数据包的第二个和更多IPv4分段。由于无法告知源端口或目标端口这样的数据包或ICMP类型,因此这样的数据包将不匹配任何指定它们的规则。当“!”参数在“-f”标志之前的时候,规则将仅匹配头部片段或未分段的数据包。此选项是特定于IPv4的,在ip6tables中不可用。
l -c, –set-counters packets bytes:使管理员在INSERT、APPEND和REPLACE操作期间能够初始化规则的数据包和字节计数器。
l -v, –verbose:详细的输出。此选项使list命令显示接口名称、规则选项和TOS掩码。还列出了数据包和字节计数器,后缀为K、M或G,分别表示1 000、1 000 000和1 000 000 000个乘数。当附加、插入、删除和替换规则时会打印规则的详细信息。-v可以多次指定,以便可能发出更详细的调试语句。例如:
root@debian:~# iptables -I INPUT -s 1.1.1.1 -j DROP -v
DROP all opt — in * out * 1.1.1.1 -> 0.0.0.0/0
l -w, –wait [seconds]:等待xtables锁定。为了防止程序的多个实例同时运行,将尝试在启动时获得独占锁。默认情况下,如果无法获取锁定,则程序将退出。此选项将使程序等待,直到可以获得独占锁定。
l -W, –wait-interval microseconds:每次迭代等待的间隔。在运行延迟敏感的应用程序时,等待xtables锁定延长的持续时间可能是不可接受的。此选项将使得每次迭代花费指定的时间量,默认间隔为1s。此选项仅与-w一起使用。
l -n, –numeric:数字输出。IP地址和端口号将以数字格式打印。默认情况下,程序将尝试将它们显示为主机名、网络名称或服务。
l -x, –exact:扩大数字。显示数据包和字节计数器的确切值,而不是仅显示K的舍入数(1 000的倍数)M(1 000K的倍数)或G(1 000M的倍数)。此选项仅与-L命令相关。
l [!] –fragment-f:仅匹配第二个或更多片段。
l –set-counters PKTS BYTES:在插入/追加期间设置计数器。
l –line-numbers:当列出规则时,将行号添加到每个规则的开头,对应于该规则在链中的位置。
l –modprobe=command:在链中添加或插入规则时,可以使用命令加载任何必要的模块,如目标、匹配扩展等。
各种错误消息将打印到标准错误,退出代码为0表示正常运行。看似由无效或滥用的命令行参数引起的错误可导致退出代码为2,而其他错误则导致退出代码为1。
1.4.6 显示当前规则
使用以下命令可查看当前规则和匹配数:
root@debian:~# iptables -vnL
Chain INPUT (policy ACCEPT 2003K packets, 1631M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 341K packets, 32M bytes)
pkts bytes target prot opt in out source destination
上面的结果表明还没有配置规则,没有数据包被阻止。在输入中添加–line-numbers选项,可以在列出规则的时候显示行号,这在添加单独的规则时很有用。
评论
还没有评论。