iptables防火墙简介,原理,规则编写,做网络防火墙,常见案例
1|0防火墙简述
防火墙(firewall)一词本是建筑用于,本意是为了保护建筑物不受火灾侵害的。被借鉴到了在网络通信领域中,表示保护局域网或主机不受网络攻击的侵害。
防火墙: 工作在主机或者网络边缘,对于进出的数据报文按照事先定义好的规则进行检查,监控,一旦符合标准,我们就按照事先定义好的规则处理动作的一套机制组件叫做(网络)(主机)防火墙
目前市面上比较常见的有3,4层的防火墙,叫做网络层防火墙,还有七层的防火墙,其实是代理层的网关.
对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测,但是对于七层的防火墙,不管你是源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查. 所以对于设计原理来讲,七层防火墙更加安全, 但是这却带来了效率更低, 所以市面上通常的防火墙方案,都是两者结合的. 而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能访问数据多少的一个最重要的控制,配置的不好甚至可能成为流量的瓶颈.
根据防范的方式和侧重点的不通分为很多种类型, 但总体来讲可分为包过滤防火墙和代理服务器两种类型.
2|0防火墙分类
2|1主机防火墙
工作在某个主机边缘,主要对进出本主机
报文的分层识别,都是在系统内核级别实现的,故防火墙也工作在单台主机内核空间中[TCP/IP协议栈上],其只能作用于单台主机
2|2网络防火墙
网络中的防火墙设备,可分为三种:代理防火墙、包过滤防火墙、状态监测防火墙。
代理防火墙
代理防火墙是代理内网主机上网的设备,可以是路由器,也可以是一台主机两块网卡,一连内网、一连公网,以代替内网主机访问公网资源,又被称为nat(网络地址转换服务器、或nat堡垒服务器);
工作原理
在应用层实现防火墙功能, 提供部分和传输有关的状态,能完全提供与应用相关的状态和部分传输的信息,他还能处理和管理信息.
包过滤防火墙
包过滤防火墙是检测所通过数据包,可监测到数据包中源ip、目的ip、源端口、目的端口、标记位等信息,并根据事先制定的通信规则决定数据包是否转发;
工作原理
在网络层对数据包进行选择过滤,采用访问控制列表(Access control table -ACL)检查数据流的源地址,目的地址,源和目的端口,IP等信息.
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数Linux软件一样, 这个包过滤防火墙是免费的, 他可以替代昂贵的商业防火墙解决方案,完成封包过滤,封包重定向和网络地址转换(NAT)等功能.
状态监测防火墙
状态监测防火墙除了可以监测数据包中的内容外,还可以跟踪每个客户的每次通信,当有攻击数据在开始时伪装成正常访问,之后突然开始做攻击时,会被状态监测防火墙监测到并加以屏蔽。
在Linux系统中,防火墙工具使用的是iptables,可实现代理防火墙、包(数据报文)过滤防火墙,nat,mangle等规则的功能,而状态监测防火墙一般是企业购买专用的防火墙设备完成的。
2|3软件防火墙
软件逻辑实现
软件防火墙由工作在通用计算机[即x86系列cpu]上的系统内核通过调用底层通用cpu指令集实现;
2|4硬件防火墙
硬件和软件逻辑组合实现,为某种特殊功能设计和实现,灵活性差
硬件防火墙使用专业的CPU,其在CPU的硬件级别就能完成对于报文的拆封操作;其只能实现防火墙数据流控制的相关功能;
性能很好[因为其在CPU的指令级别就已经实现了相对复杂的功能,其不用在逻辑层进行复杂的指令组合即可完成对应功能
2|5数据流向
2|6报文流向
2|7netfilter路由功能发生时刻
2|8Linux内核通信逻辑
通信是进程之间进行的, 客户端和服务端的程序通过建立tcp连接, 通过套接字进行数据传输.
将所有端口开放给所有内部主机,以保证通信的正常进行, 而防火墙为了保证安全, 在所有端口之外进行了限制, 只有某些规定允许的端口才能开放给外部主机进行访问使用
Linux防火墙的发展:
3|0Iptables工作原理(四表五链)
3|1五链
五个钩子函数(hook functionns),也叫五个规则(rules)链(chains) (数据包传播的路径)
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过五个链中的其中一个链
防火墙策略一般分为两种, 一种叫"通"策略,一种叫"堵"策略:
3|2表的概念
我们再想想另外一个问题,我们对每个"链"上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起呢,必须能的。
我们把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围,所以,学习iptables之前,我们必须先搞明白每种表 的作用.
iptables为我们提供了如下规则的分类,或者说,iptables为我们提供了如下"表"
Filter
filter实现包过滤,定义允许或者不允许的[ 只能做在3个链上: INPUT表(进入的包), FORWORD(转发的包), OUTPUT(处理本地生成的包), filter表只能对包进行接收和丢弃的操作.
NAT
nat网络地址转换(只能做在3个链上: Prerouting(修改即将到来的数据包), output(修改在路由之前本地生成的数据包), Postrouting(修改即将出去的数据包)
Mangle
mangle包重构(修改), 修改报文原数据就是来修改TTL的, 能够实现将数据包的元数据拆开, 在里面做标记/修改内容的. 而防火墙标记, 其实就是靠mangle来实现的. 五个链都可以做.
raw
数据跟踪处理
3|3Iptables传输数据包过程
1. 当一个数据包进入网卡时, 他首先进入prerouting链, 内核根据数据包目的IP判断是否传送出去.
2. 如果数据包进入本机, 他就会沿着图向下移动, 到达input链, 数据包到了input链后,任何进程都会收到他,本机上运行的程序可以发送数据包, 这些数据包会经过output链, 然后到达postrouting链输出
3. 如果数据包要转发出去,且内核允许转发,数据包就会如图所示向右移动,经过Forward链, 然后到达Postrouting链输出
iptables/netfilter(这款软件)是工作在用户空间的,他可以让规则进行生效的,本身不是一种服务, 而且规则是立即生效的, 而我们iptables现在被做成了一个服务, 可以进行启动,停止的, 启动,则将规则直接生效, 停止,则将规则撤销.
自定义链
iptables还支持自己自定义链, 但是自己自定义的链, 必须是跟某种特定的链关联起来的, 在一个关卡设定, 指定当有数据的时候专门去找某个特定的链来处理, 当那个链处理完之后, 再返回,接着在特定的链中继续检查.只有在被调用时才能发挥作用, 而且如果没有自定义链中的
注意: 规则的次序非常关键,检查规则是按照从上往下的方式进行检查的
3|4表链关系
但是我们需要注意的是,某些"链"中注定不会包含"某类规则",就像某些"关卡"天生就不具备某些功能一样,比如,A"关卡"只负责打击陆地敌人,没有防空能力,B"关卡"只负责打击空中敌人,没有防御步兵的能力,C"关卡"可能比较NB,既能防空,也能防御陆地敌人,D"关卡"最屌,海陆空都能防。
那让我们来看看,每个"关卡"都有哪些能力,或者说,让我们看看每个"链"上的规则都存在于哪些"表"中。
我们还是以图为例,先看看prerouting"链"上的规则都存在于哪些表中。
这幅图是什么意思呢?它的意思是说,prerouting"链"只拥有nat表、raw表和mangle表所对应的功能,所以,prerouting中的规则只能存放于nat表、raw表和mangle表中。
我们总结一下,每个关卡都拥有什么功能
但是,我们在实际的使用过程中,往往是通过"表"作为操作入口,对规则进行定义的,之所以按照上述过程介绍iptables,是因为从"关卡"的角度更容易从入门的角度理解,但是为了以便在实际使用的时候,更加顺畅的理解它们,此处我们还要将各"表"与"链"的关系罗列出来,
表(功能) <--> 链(钩子)
其实我们还需要注意一点,因为数据包经过一个"链"的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同功能类型的规则会汇聚在一张"表"中,那么,哪些"表"中的规则会放在"链"的最前面执行呢,这时候就需要有一个优先级的问题
iptables为我们定义了四张表, 当他们处于同一张链时, 执行的优先级如下
但是我们前面说过,某些链天生就不能使用某些表中的规则,所以,4张表中的规则处于同一条链的目前只有output链,它就是传说中海陆空都能防守的关卡。
为了更方便的管理,我们还可以在某个表里面创建自定义链,将针对某个应用程序所设置的规则放置在这个自定义链中,但是自定义链接不能直接使用,只能被某个默认的链当做动作去调用才能起作用,我们可以这样想象,自定义链就是一段比较"短"的链子,这条"短"链子上的规则都是针对某个应用程序制定的,但是这条短的链子并不能直接使用,而是需要"焊接"在iptables默认定义链子上,才能被IPtables使用,这就是为什么默认定义的"链"需要把"自定义链"当做"动作"去引用的原因。这是后话,后面再聊,在实际使用时我们即可更加的明白。
结合上述所有的描述,我们可以将数据包通过防火墙的流程总结为下:
我们在写Iptables规则的时候,要时刻牢记这张路由次序,灵活配置规则。
我们将经常用到的对应关系重新写在此处,方便对应图例查看。
链的规则存放于哪些表中(从链到表的对应关系):
4|0iptables规则写法
4|1规则的概念
规则
根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
那么我们来通俗的解释一下什么是iptables的规则,之前打过一个比方,每条"链"都是一个"关卡",每个通过这个"关卡"的报文都要匹配这个关卡上的规则,如果匹配,则对报文进行对应的处理,比如说,你我二人此刻就好像两个"报文",你我二人此刻都要入关,可是城主有命,只有器宇轩昂的人才能入关,不符合此条件的人不能入关,于是守关将士按照城主制定的"规则",开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,因为你符合"器宇轩昂"的标准,所以把你"放行"了,而我不符合标准,所以没有被放行,其实,"器宇轩昂"就是一种"匹配条件","放行"就是一种"动作","匹配条件"与"动作"组成了规则。
规则由匹配条件和处理动作组成
匹配条件
处理动作
处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作.
4|2语法构成
4|3规则编写逻辑
4|4规则command(增删)
Example
4|5链管理
4|6保存生效规则
5|0常用案例
5|1iptables禁止某IP访问
在CentOS下封停IP,有封杀网段和封杀单个IP两种形式。一般来说,现在的攻击者不会使用一个网段的IP来攻击(太招摇了),IP一般都是散列的。于是下面就详细说明一下封杀单个IP的命令,和解封单个IP的命令。
在CentOS下,使用ipteables来维护IP规则表。要封停或者是解封IP,其实就是在IP规则表中对入站部分的规则进行添加操作。
要封停一个IP,使用下面这条命令:
要解封一个IP,使用下面这条命令
参数-I是表示Insert(添加),-D表示Delete(删除)。后面跟的是规则,INPUT表示入站,...表示要封停的IP,DROP表示放弃连接。
此外,还可以使用下面的命令来查看当前的IP规则表:
比如现在要将123.44.55.66这个IP封杀,就输入:
要解封则将-I换成-D即可,前提是iptables已经有这条记录。如果要想清空封掉的IP地址,可以输入:
要添加IP段到封停列表中,使用下面的命令:
其实也就是将单个IP封停的IP部分换成了Linux的IP段表达式。关于IP段表达式网上有很多详细解说的,这里就不提了。
5|2仅允许指定网络的ssh连接
5|3允许http和https的连接请求
5|4使用multiport将多个规则
允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示: 例:允许所有ssh,http,https的流量访问
5|5允许从本地发起的ssh
5|6仅允许从本地发起一个指定网络域的ssh请求
5|7允许从本地发起的https连接请求
5|8负载均衡传入的网络流量
5|9允许内部主机ping通内部主机
5|10允许内部主机ping外部主机
5|11允许回环访问
5|12允许内部网络与外部网络通信
防火墙服务器上的其中一个网卡连接到外部,另一个网卡连接到内部服务器,使用以下规则允许内部网络与外部网络的通信。此例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。
5|13允许出站的DNS连接
5|14允许NIS连接
如果你使用NIS管理用户帐户,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使SSH连接请求已被允许,用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo –p来知道端口号,此例中为853和850端口。 rpcinfo -p | grep ypbind 例:允许来自111端口以及ypbind使用端口的连接请求
5|15允许指定网络的rsync连接请求
允许来自网络192.168.101.0/24的rsync连接请求
5|16允许来自指定网络的Mysql请求
很多情况下,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:
5|17允许Sendmail,PostFix邮件服务
Sendmail和postfix都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。
5|18允许IMAP和IMAPS
5|19允许POP3 和POP3S
5|20防止Dos攻击
5|21端口转发
将来自422端口的流量全部转到22端口。 这意味着我们既能通过422端口又能通过22端口进行ssh连接
6|0iptables常用扩展模块
6|1iprangne
6|2connlimit
6|3string
限定用户访问字符串
6|4Log
6|5recent
利用iptables的recent模块抵御DOS攻击
记录日志
7|0NAT表
7|1主要功能
1、为了隐藏主机;
2、解决了ip地址短缺的问题;
问题:
当内外网将开启路由转发的Linux作为网关进行通信时,Linux对数据包并不会做任何改变,故内网主机的IP会暴露;黑客主机可以通过扫描工具对此内网主机ip进行扫描,并渗透;
解决:
nat表的功能可以实现,将经过自身的数据包进行改变,将其中的源地址修改为自身的ip,以此实现隐藏内网主机ip的功能;
nat表在修改数据包ip的同时,会将相关记录在内核内存中的连接追踪表中,当回应数据包到达自身时,其又会将数据包目的ip修改为内网主机ip,从而实现内网主机的正常通信
只需要关注请求的数据报文封装信息,因为响应的数据报文是由nat表的内建工作机制控制的,一般情况下无需人为干预(连接追踪机制)
被nat表所匹配到的数据报文,内核会修改报文的ip和端口,为了让转发机能在接收到返回报文后知道将此报文发送至何处,需要开启连接追踪机制;所谓连接追踪机制就是在内核内存空间中,开辟一块空间用于存放连接追踪表;转发机在修改报文ip和端口的同时,会在追踪表中进行记录,信息包括:请求的源地址,源端口,目标地址,目标端口,及报文序列号等;当响应报文到达时,转发机会根据响应报文中的源地址和端口查看此表,将相应转发到对应的服务器;
7|2NAT类型(SNAT)
源地址转换
过程
内网主机网关指向NAT转发主机的内网IP, 当内网主机访问外网时,数据包经NAT转发主机, NAT转发主机开启内核转发机制, 并且在NAT表上设置相关规则, 同时打开链接追踪机制,由NAT转发主机的内核对数据包的源IP进行修改, 将其改为自身的IP, 并发送至请求的目标主机. 当响应报文返回时, 其目标ip为nat转发主机ip,nat转发主机收到后,根据内核中记录的连接追踪表,将此数据包转发给对应的内网主机,从而实现内网主机的nat通信.
特点
应用场景
7|3NAT类型(DNAT)
目标地址转换
服务器通过nat转发主机,向外网提供服务,对外提供的服务ip是nat网关的IP,客户端向nat网关发起请求,由nat网关根据请求的端口,以及自身规则,将数据包的目标ip地址转换为内网真实服务器ip;真实服务器的网关指向nat网关,当真实服务器回复响应数据包时,其目标ip地址是客户端的ip,而其源地址是自身ip,当通过nat网关时,由nat网关根据自身记录的连接追踪表,将源地址改为自身ip,发送给客户端,如此可以实现对内网服务器的隐藏;
特点
7|4PAT[端口地址转换]
过程
在DNAT的基础上,对port也进行修改, 访问nat网关某个port的请求, 会被映射到后端真实服务器的真实port,返回时,再将目标端口修改为自身端口.
特点
7|5与数据包过滤结合
SNAT
SNAT和DNAT都会经过FORWARD,在FORWARD上配置iptables规则能实现包的过滤功能:
DNAT
[一般只开放有限协议的有限端口] --> PAT是DNAT的一种延伸,可以对端口进行修改
8|0Linux作为网络防火墙
当Linux作为网络防火墙时,目标不是本机的报文,将会在内核中被分配到对应的网卡接口;
其所依赖的规则为路由表:
在路由器中,数据包的流向通过路由表来决定,不同的目标ip将会从对应的网卡上被分发出去;
路由表的生成:
8|1数据流经过程
8|2Example
环境
配置Linux网络交换机
配置模拟内网机器
外网主机
8|3SNAT_Example
8|4DNAT_Example
编写DNAT规则
Commond
8|5或者通过host.allow限制特定IP来访
__EOF__

本文链接:https://www.cnblogs.com/you-men/p/13945153.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类