Linux防火墙
安全技术和防火墙
入侵检测系统IDS(intrusion detection systems);特点是不阻断任何网络访问,量·化,定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类似于监控系统一般采用旁路部署方式
入侵防御系统(intrusion prevention system):以透明模式工作,分析数据包的内容如:溢出攻击,拒绝服务攻击,木马,蠕虫,系统漏洞等进行准备的分析判断,在判定为攻击后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式
防火墙(firewall):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ(demilitarized zone)网络中
防水墙(waterwall):与防水墙相似,是一种防止内部信息泄露的安全产品,网络,外设接口,存储介质和打印机构成信息泄露的全部途径,防水墙针对这四种泄露途径,在事前,事中,事后进行安全维护,其与防病毒产品,外部安全设备一起构成完整的网络安全体系
防火墙的分类
按保护范围分类:
主机防火墙:服务范围为当前一台主机
网络防火墙:服务范围为防火墙一侧的局域网
按实现方式划分:
硬件防火墙:在专用硬件级别实现部分功能的防火墙,另一部分功能基于软件实现,如华为,山石,天融信,启明星辰,绿盟,深信服,cisco
软件防火墙:运行于通用硬件平台之上的防火墙,windows防火墙ISA
按网络协议划分:
网络层防火墙:OSI模型下四层,又称为包过滤防火墙
应用层防火墙/代理服务器:proxy代理网关,OSI模型七层
包过滤防火墙:
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用地址,所用端口和协议状态等因素,或他们的组合来确定是否允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等
提示:现实生产环境中所使用的防火墙一般都是两者结合体,即先检查网络数据,通过之后在送到应用层去检查
linux防火墙的基本认识(netfilter)
linux防火墙是由netfiler组件提供的,netfilter工作在内核空间,集成在linux内核中
netfilter是linux2.4.x之后新一代的linux防火墙机制,是linux内核的一个子系统, netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架,netfilter与IP协议栈是无缝契合,并允许对数据报进行过虑,地址切换,处理等操作
防火墙工具介绍iptables
由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
firewalld
从centos7版开始引入了新的前端管理工具
软件包:firewalld,firewalld-config
管理工具:
firewalld-cmd 命令行工具
firewalld-config 图形工具
nftables
此软件是centos8新特性,nftables最初在法国巴黎的netfilter workshop2008上发表,然后由长期的netfilter核心团队成员和项目负责人patrick mchardy于2009年3月发布,它在2013年末合并到linux内核中,自2014年以来已在内核3.13中可用
它重用了netfilter框架的许多部分,例如连接跟踪NAT功能,他还保留了命名法则和基本iptables设计的几个部分,例如表,链和规则,就像iptables一样,表充当链的容器,并且链包含单独的规则,这些规则可以执行操作,例如丢弃数据包,移至下一个规则或跳至新链
从用户角度来看,nftables添加了一个名为nft的新工具,该工具替代了iptables,arptables和ebtables中的所有其他工具,从体系结构的角度来看,它还替换了内核中处理数据包过滤规则集运行时评估的哪些部分。
netfilter中5个勾子函数和报文流向
netfilter在内核中选取五个位置放了五个勾子hook函数function(INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组在链上
提示:从linux kernel4.2版以后,netfilter在prerouting前加了一个ingress勾子函数,可以使用这个新的入口挂钩来过滤来自第二层的流量,这个新挂钩比prerouting要早,基本上时tc命令(流量控制工具)的替代品
三种报文流向
流入本机:prerouting -----》 input------》用户空间进程
流出本机:用户空间进程----》output-------》postrouting
转发:prerouting------》forward-----》postrouting
iptables的组成
iptables由五个table和五个chain以及一些规则组成
链chain:
内置链:每个内置链对应一个勾子函数
自定义链:用于对内置链进行扩展和补充,可实现更灵活的规则组织管理机制,只有hook勾子函数调用自定义链时,才生效
五个内置链:
INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
五个表table:filter,nat,mangle,raw,security
filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
nat:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由linux安全模块实现
优先级:security-----> raw------->mangle------>nat------->filter
内核中数据包的传输过程
当一个数据包进入网卡时,数据包首先进入prerouting链,内核根数据包目的IP判断是否需要转送出去
如果数据包是进入本机的,数据包就会沿着图向下移动,到达input链,数据包到达input链后,任何进程都会收到它,本机上运行的程序可以发送数据包,这些数据包经过output链,然后到达postrouting链输出
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过forward链,然后到达postrouting链输出
iptables规则说明
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据定义的处理动作做出处理,规则在链接上的次序即为其检查时的生效次序
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的flages(SYN,ACK等)
扩展匹配:通过复杂高级功能匹配
处理动作:称为target,跳转目标
内建处理动作:ACCEPT,DROP,REJECT,DNAT,MASQUERADE,MARK,LOG
自定义处理动作:自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效,添加在自定义上不会自动生效
白名单:只有指定的特定主机可以访问,其它全拒绝
黑名单:只有指定的特定主机拒绝访问,其他全允许,默认方式
-L:list,列出指定键上的所有规则,选项必须置后
-n:numberic,以数字格式显示地址和端口号
-v:详细信息
-vv:更详细
--line-numbers:显示规则的序号
-S:selected,以iptables-save命令格式显示链上规则
规则管理类:
-A:append 追加
-I:insert:插入,要指明规则编号,默认为第一条
-D:delete:删除
-R:replace:替换指定链上的指定规则编号
-F:flush:清空指定的规则链
-Z:zero,置零,iptables的每条规则都有两个计数器(1)匹配到的报文的个数(2)匹配到的所有报文的大小之和
匹配条件:通用的,PARAMETERS
扩展:需加载模块,MATCH EXTENTIONS
处理动作:
简单动作:ACCEPT,DROP
扩展动作:
REJECT,--reject-with:icmp-port-unreachable默认
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志,dmesg
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
自定义链
iptables基本匹配条件
-s,--source address[/mask][...] 源IP地址或者不连续的IP地址
-d,--destination address[/mask][...] 目标地址或者不连续的IP地址
-p,--protocol:指定协议
-i,--in-interface name:报文流入的接口,只能应用于数据报文流入环节,只应用于INPUT,RORWARD,PREROUTING链
-o,--out-interface name:报文流出的接口,只能应用于数据报文流出的环节,只应用于FORWARD,OUTPUT,POSTROUTING链
iptables扩展匹配条件
扩展匹配条件:需要加载扩展模块(/usr/bin/xtables/*.so),方可生效
扩展模块的查看帮助:man iptables-extensions
扩展匹配条件:隐士扩展,显示扩展
隐士扩展:
iptables在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制
tcp协议的扩展选项
--source-port --sport 匹配报文源端口,可为端口连续范围
--destination-port --dport 匹配报文目标端口,可为连续范围
--tcp-flags mask comp
mask 需检查的标志位列表,用,分割,例如SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分割tcp协议的扩展选项
--tcp-flags SYN,ACK,RST,FIN SYN表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0,第一次握手
--tcp-flags SYN,ACK,FIN,RST SYN,ACK 第二次握手
错误包
--tcp-flags ALL ALL
--tcp-flags ALL NONE
--syn:用于匹配第一次握手,相当于:--tcp-flags SYN,ACK,FIN,RST SYN
UDP协议扩展选项
--source-port --sport port 匹配报文的源端口或端口范围
--destination-port --dport port 匹配报文的目标端口或端口范围
ICMP协议的扩展选项
--icmp-type {type/code}
0/0 echo-reply icmp应答
0/8 echo-request icmp请求
显示扩展及相关模块
显示扩展必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块
扩展模块的使用帮助:
centos7,8:man iptables-extensions
multiport扩展
以离散的方式多端口匹配,最多指定15个端口
--source-ports,--sports port
--destination-ports,--dports port
多个源或者目标端口
--ports port
iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
--src-range 源ip地址范围
--dst-range 目标ip地址范围欸
mac扩展
mac模块可以指明源MAC地址,适用于:PREROUTING,FORWARD,INPUT chains
--mac-source
string扩展
对报文的应用层做字符串模式匹配检测
--algo {bm|kmp}字符串匹配检测算法
bm:boyer-moore
kmp:knuth-Pratt-morris
--from offset 开始偏移
--to offset 结束偏移
--string pattern 要检测的字符串模式
--hex-string pattern 要检测字符串模块,16进制格式
time扩展
centos8此模块有问题
根据将报文到达的时间与指定的时间进行匹配
--datestart yyyy-mm-dd-mm-ss 日期
--datestop yyyy-mm-dd-hh-mm-ss
--timestate hh-mm:ss
--timestop hh-mm:ss
--monthday 每个月的几号
--weekdays day 星期几,1-7分别表示星期一到星期日
--kerneltz:内核时区(当地时间)centos7以后默认使用utc
connlimit扩展
根据客户端IP做并发连接数数量匹配
可防止Dos(denial of service,拒绝服务)攻击
--connlimit-upto N 连接的数量小于等于N时匹配
--connlimit-above N 连接的数量大于N时匹配
limit扩展
基于收发报文的速率做匹配,令牌通过滤器
--limit-burst number 前多少个包不限制
--limit #【/second/minute/hour/day】
state扩展
state扩展模块,可以根据“连接追踪机制”去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系
状态类型:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHD:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所有进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
已经追踪到的并记录下来连接信息库
说明:
连接追踪,需要加载模块:modprobe nf_conntrack_ipv4
当服务器连接多于最大连接数时dmesg可以观察到:kernel:ip_conntrack:table full,deopping packet错误,并且导致建立TCP连接很慢
各种状态的超时后,连接会从表中删除
连接数过多的解决办法:
(1).在 /etc/sysctl.conf 添加:net.nf_conntrack_max = value
net.netfilter.ng_conntrack_max = value
(2).降低nf_conntrack timeout时间
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait =120
target
target包括一下类型:
自定义链:ACCEPT,DROP,REJECT,RETURN,LOG,SNAT,DNAT,REDIRECT,MASQUERADE
LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前,并将日志记录在/var/log/messages系统日志中
--log-level level 级别:debug,info,notice,warning,error,crit,alert,emerg
--log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
规则优化最佳实践
1.安全放行所有入站和出战的状态未ESTABLISHED状态连接,建议放在第一条,效率更高
2.谨慎放行入站的请求
3.有特殊目的的限制访问功能,要在放行规则之前加以拒绝
4.同类规则(访问同一应用,比如:http),匹配范围小的放在前面,用于特殊处理
5.不同类的规则(访问不同应用,一个是http,另一个是mysql),匹配范围大的放在前面,效率高
6.应该将那些可由一条规则能够描述清楚的多个规则合并为一条,减少规则数量,提高检查效率
7.设置默认策略,建议白名单(只放行特定连接)
8.iptables -P 不建议,容易出现“自杀现象”
规则的最后定义规则做为默认策略,推荐使用,放在最后一条
iptables规则保存
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
iptabls-save > /PATH
iptables-restore < /PATH
iptables-restore 选项
-n --noflush 不清楚原有规则
-t --test 仅分析生成规则集,但不提交
开机自动重载规则
用脚本保存各个iptables命令:让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径/path
用规则文件保存各个规则,开机时自动载入此规则文件中的规则
/etc/rc.d/rc.local文件添加
定义unit file,centos7,8可以安装iptables-services实现iptables.service
网络防火墙
iptables/netfilter利用filter表的FORWARD链,可以充当网络防火墙
注意的问题:
1.请求-响应报文均会经由FORWARD链,要注意规则的方向性
2.如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行
NAT表
NAT:network address translation,支持PREROUTING,INPUT,OUTPUT,POSTROUTING匹配四个链
请求报文:修改源/目标IP,由定义如何修改
响应报文:修改源/目标IP,根据跟踪机制自动实现
NAT的实现为下面类型:
SNAT:source NAT,支持POSTROUTING,INPUT,让本地网络中的主机通过某一特定的地址连接外部网络,实现地址伪装请求报文,修改源IP
DNAT:destinationNAT支持PREROUTING,OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问,(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
PNAT:port nat,端口和IP都进行修改
SNAT
注意:需要开启ip_forward
SNAT:基于nat表的target,适用于固定的公网IP
SNAT选项:
--to-source ipaddr
--random
MASQUERADE:基于nat表的target,适用于动态的公网IP,如:拨号
MASQUERADE选项:
--to-ports
--random
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)