恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Linux----防火墙
首页
资讯中心
/
Linux----防火墙
Linux----防火墙
发布时间:2026/8/13 12:32:54
一、网络安全一、iptables 与 Netfilter✅Netfilter内核态框架真正干活的Linux 内核内置的数据包处理框架在网络协议栈设置 5 个钩子 (Hook) 点位数据包途经这些点位时可以被拦截、修改、丢弃、转发提供防火墙、NAT、报文修改底层能力。✅iptables用户态命令工具下发规则的运行在用户空间的命令行程序本身不处理数据包。作用将管理员编写的防火墙规则通过 Netlink 通信下发给内核的 Netfilter 框架执行。通俗比喻 Netfilter 大楼里 5 处安检关卡内核 iptables 前台填表窗口你在这里写安检规则交给关卡执行。二、Netfilter 五大钩子对应 iptables 五条链数据包在 Linux 内核网络通道上有 5 个固定检查站就是这 5 条链数据包按固定顺序路过检查站接受规则检查1. PREROUTING prerouting 链位置数据包刚从网卡进到内核还没做路由判断数据包刚进网卡还没决定往哪送。✅场景别人发数据包到达本机网卡第一站就是这里能干啥DNAT目标地址转换改数据包目标 IP端口映射就在这举例子访问公网 IP:80把流量转发到内网 192.168.1.100:8080在这里改目标 IP2. INPUTinput 链位置路由判断后确定数据包就是发给本机程序的✅场景外部流量访问本机上运行的服务ssh、nginx能干啥控制外部能不能访问本机端口管别人能不能连我这台服务器禁 22 端口举例子禁止外网访问服务器 22 端口就在 INPUT 链写 DROP 规则3. FORWARDforward 链位置路由判断后发现包不是给本机要经过本机转发给别的机器。✅场景Linux 当作路由器 / 网关流量跨网段转发能干啥过滤跨网段转发的流量举例子内网主机能不能访问外网网关防火墙规则写在 FORWARD4. OUTPUToutput 链位置本机内部程序主动向外发包刚生成数据包还没路由✅场景服务器自己主动向外发起请求curl、yum 更新能干啥管控本机向外发起的流量举例子禁止服务器主动访问外部 80 端口5. POSTROUTINGpostrouting 链位置数据包路由完成即将离开网卡前最后一站✅场景所有要从本机网卡发出去的包转发包、本机出站包能干啥SNAT、MASQUERADE源地址转换举例子内网主机共享服务器公网 IP 上网在这里修改数据包源 IP 为公网地址1、两条完整数据流路线对照图路线 A外部主机 → 访问本机服务网卡 →PREROUTING→ 路由查询 →INPUT→ 用户空间程序路线 B外部主机 → 经由 Linux 网关转发到另一台主机网卡 →PREROUTING→ 路由查询 →FORWARD→POSTROUTING→ 网卡发出路线 C本机程序主动向外发包用户程序 →OUTPUT→ 路由查询 →POSTROUTING→ 网卡发出2、超简短记忆版进网卡先PREROUTING包是给本机 →INPUT包要转给别人 →FORWARD本机主动发包 →OUTPUT出网卡最后一关POSTROUTING3、DNAT / SNAT 一句话分清DNAT改目标地址别人找进来的时候用PREROUTING外网用户访问网关公网 IP我把数据包的目标 IP 偷偷换成内网服务器地址流量就拐进内网机器。外网流量拐进内网SNAT改源地址内网机器往外跑的时候用POSTROUTING内网电脑上网出去的时候把数据包源 IP 换成网关公网 IP外网只能看到网关不知道内网机器真实地址。内网机器借用网关公网 IP 上网前置提醒使用 iptables 前关闭并 mask firewalld安装 iptables-servicessystemctl stop firewalldsystemctl disable firewalldsystemctl mask firewalldyum install -y iptables-servicessystemctl start iptablessystemctl enable iptables使用 firewalld 前停止 iptables解除 firewalld 锁定systemctl stop iptablessystemctl disable iptablessystemctl unmask firewalldsystemctl start firewalldsystemctl enable firewalld三、iptables命令命令通用格式iptables [-t 表名] 操作指令 [链名] [匹配条件] -j 动作-t 表名不写默认是filter 表过滤表filter防火墙、nat地址转换、mangle、raw1、核心操作参数参数全称大白话含义重点提醒-Llist列出所有规则搭配-n不解析域名速度快iptables -L -n-vverbose显示详细信息流量统计-Lnv标准查看组合-Aappend追加规则加到链最后一行匹配顺序从上往下越靠后优先级越低-Iinsert插入规则默认放到第一行紧急封禁用这个优先匹配-Ddelete删除一条规则写法要和创建时一模一样或者按行号删-Fflush清空所有规则⚠️谨慎不要随便在远程服务器执行容易断连接--line显示出每条规则在相应链中的序号-Rreplace修改某一条规则iptables -R INPUT 2 xxx修改第 2 条-P设置整条链的默认策略默认策略不属于链内规则iptables -F清空规则不会重置-P默认策略2、匹配条件参数人话解释示例-s ip源 IP数据包是谁发出来的-s 192.168.1.0/24-d ip目标 IP数据包要发给谁-d 203.0.113.10-p tcp/udp/icmp匹配协议-p tcp--dport 端口目标端口别人访问本机的端口--dport 22--sport 端口源端口对方发起连接的端口--sport 80-i 网卡数据包从哪个网卡进来-i eth0-o 网卡数据包从哪个网卡出去-o eth0--to-ports 目标端口跳转目标端口3、-j 动作匹配成功后干什么ACCEPT放行允许数据包通过DROP直接丢掉不回复对方对方一直转圈等待REJECT拒绝返回 “连接拒绝” 提示REDIRECT端口重定向只能在本机内部转发仅在nat表使用DNAT 目标网络地址转换作用修改数据包的【目标 IP / 目标端口】SNAT源网络地址转换作用修改数据包的【源 IP 地址】一般配合 DNAT 使用解决跨机器端口转发回程不通的问题。DNAT 负责去程改目标SNAT 负责去程改源DNAT 和 SNAT 成对使用缺一不可跨机器转发场景REDIRECT 本质可以理解成特殊的 DNAT强制目标为本机不能指定其他 IP人话区分 DROP 与 REJECTDROP 假装没看见包裹直接扔垃圾桶REJECT 收到包裹明确回信告诉你不收。4、常用基础命令1. 查看规则# 查看filter表规则默认表 iptables -L -n -v # 查看nat表规则SNAT/DNAT用 iptables -t nat -L -n -v2. 放行 / 封禁本机端口INPUT 链别人访问本机# 允许所有人访问本机22端口ssh iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 禁止 192.168.1.5 访问本机80端口 iptables -A INPUT -s 192.168.1.5 -p tcp --dport 80 -j DROP # 在最顶部插入规则优先封禁某个IP iptables -I INPUT -s 10.0.0.10 -j DROP3. 本机主动向外访问OUTPUT 链# 禁止本机主动访问外网80端口 iptables -A OUTPUT -p tcp --dport 80 -j DROP参数含义做题口诀-s IP数据包从这个 IP 发出出发 IP 写 - s-d IP数据包要去到这个 IP目标 IP 写 - d--dport 端口接收方的端口被访问端口一律 dport--sport 端口发送方的端口对方自带端口 sport四、iptables 端口转发必须用 nat 表类型表链作用典型命令关键字REDIRECT本机端口转发natPREROUTING本机端口转向本机另一个端口-j REDIRECT --to-portDNAT 端口映射natPREROUTING改目的 IP外网访问内网服务器-j DNAT --to‑destination ip:portSNAT 静态源地址转换natPOSTROUTING改源 IP内网固定 IP 上网-j SNAT --to‑sourceMASQUERADE 地址伪装natPOSTROUTING动态外网 IP 内网上网-j MASQUERADE1、Linux 开启 IPv4 内核转发端口转发前置配置1. 修改配置文件 vim /etc/sysctl.conf 在文件内添加 / 修改这一行net.ipv4.ip_forward 1 ⚠️ 注意如果该行前面有#注释需要删掉# 2. 加载生效配置必须执行 sysctl -p /etc/sysctl.conf 3. 验证是否成功开启 cat /proc/sys/net/ipv4/ip_forward 返回 1 ✅转发已开启截图中就是成功状态 返回 0 ❌转发关闭2、临时生效方案重启失效echo 1 /proc/sys/net/ipv4/ip_forward适合临时测试服务器重启后会重置为 0。前置知识nat表专门处理地址转换分三条核心链PREROUTING数据包刚进网卡、路由判断之前外网 / 别的机器访问本机流量走这里OUTPUT本机自己访问本机产生的数据包POSTROUTING数据包准备离开机器、往外发的时候两大转发模式本地端口转发、远程端口转发跨机器 DNAT3、本地端口转发本机内部端口跳转作用别人访问这台机器的【端口 A】自动转给同一台机器上的【端口 B】例子访问本机:4444→ 转到本机:22① 外部 / 其他机器访问本机 4444走 PREROUTINGiptables-tnat-APREROUTING-ptcp--dport4444-jREDIRECT--to-ports22数据包从外面进来目标端口是 4444直接重定向到本机 22 端口。②本机自己访问本机 4444必须加 OUTPUT 规则大坑iptables-tnat-AOUTPUT-ptcp--dport4444-jREDIRECT--to-ports22⚠️重点 外部机器连本机走PREROUTING本机 curl 127.0.0.1:4444这种流量不走 PREROUTING只走OUTPUT链不加这条本地访问会失效REDIRECT只能用于本机内部端口跳转不能把流量转给另一台服务器。4、远程端口转发跨机器转发 DNAT场景流量到达机器 A (192.168.1.100:5555)转发给内网另一台机器 B (192.168.1.200:80)需要两条配套规则同时生效缺一不可规则 1 DNATPREROUTING改目标地址iptables-tnat-APREROUTING-ptcp--dport5555-jDNAT--to-destination192.168.1.200:80别人访问 192.168.1.100:5555把数据包目标 IP 端口改成 192.168.1.200:80数据包路由发往 B 机器。规则 2 SNATPOSTROUTING改源地址iptables-tnat-APOSTROUTING-ptcp-d192.168.1.200--dport80-jSNAT--to-source192.168.1.100B 机器收到请求后要回包如果不做 SNATB 会直接把响应包发给原始客户端客户端不认这个连接直接断开。 SNAT 强制把请求来源 IP 伪装成转发服务器 A (192.168.1.100)。 B 回复数据只发给 AA 再原路转发给客户端链路闭环。通俗链路全过程客户端 → 【A:5555】A 收到包DNAT目标改成 B:80 → 包发给 BB 收到请求看见来源 IP 是 ASNAT 效果B 把返回数据发给 AA 再把响应传回原始客户端类型使用模块用到链适用场景能不能跨机器本地端口转发REDIRECTPREROUTING OUTPUT同一台机器端口互转❌ 只能本机远程跨机转发DNATSNAT 组合PREROUTING POSTROUTING流量转发到其他服务器✅ 支持跨机器五、firewalld 命令一、九大区域zone优先级 作用firewalld 区域本质一套预设规则模板网卡 / 来源地址绑定区域后就使用该区域策略匹配顺序source 来源 interface 网卡 默认区域。区域安全等级核心用途默认放行服务理解trusted最低信任最宽松全部流量允许内网信任服务器所有流量✅完全不设防谁来都放行只用于百分百可信机器生产慎用home低家庭内网信任其他设备ssh, mdns, samba‑client, dhcpv6‑client家里 WiFi 环境信任家里其他电脑、手机开放较多局域网相关服务internal低内部局域网同 homessh, mdns, samba‑client, dhcpv6‑client公司内网信任内网设备和 home 规则几乎一模一样work中等办公局域网ssh, dhcpv6‑client办公室网络信任办公设备开放服务比 home 少一点public中等系统默认区域公网服务器通用默认模板ssh, dhcpv6‑client系统默认 zone外网环境不信任外网至少保留 ssh 方便远程登录管理机器external较高作为路由器外网网卡开启地址伪装 masqueradesshLinux 充当路由器做 NAT 共享上网内网主机可以通过这台机器访问外网dmz高隔离区外网可访问的堡垒机、对外服务器仅必要端口ssh对外放网站 / 服务的隔离区默认只开 ssh其他全部需要手动放行就算外网访问你的服务也不相信访问者block很高所有入站拒绝返回 icmp 拒绝消息无任何放行别人连你直接收到拒绝报错明确告诉对方不给访问drop最高最严格所有入站直接丢弃不回应无任何放行悄咪咪扔掉数据包不给对方任何回复对方只会一直超时仿佛这台机器不存在重点区域只是模板策略生效前提网卡 / 源地址绑定到该 zone二、区域切换操作网卡归属 zone 修改1. 查询信息# 查看网卡当前所在区域 firewall-cmd --get-zone-of-interfaceens33 # 查看活跃区域网卡绑定在哪哪个就是active firewall-cmd --get-active-zones # 查看系统默认区域不绑定网卡的流量走这里 firewall-cmd --get-default-zone2. 切换网卡所属区域两种方式临时生效重启防火墙丢失 firewall-cmd --zonedmz --change-interfaceens33 永久生效推荐实验 firewall-cmd --permanent --zonedmz --change-interfaceens33 # 重载配置生效 firewall-cmd --reload3. 修改系统全局默认区域firewall-cmd --permanent --set-default-zonepublic firewall-cmd --reload查询 (get)设置 (set)功能--get-default-zone--set-default-zonexxx查询 / 设置全局默认 zone--get‑zone‑of‑interfaceens33--change‑interfaceens33查询 / 修改网卡所属 zone注意这里不用 set--get‑active‑zones—查看当前激活 zone没有 set 版本三、基础规则放行服务 / 端口普通规则语法统一--permanent永久配置 firewall-cmd --reload重载1. 放行预定义服务推荐使用 services 目录 xml预定义服务 xml 模板目录/usr/lib/firewalld/services/。用户自定义存放目录/etc/firewalld/services/。拿系统现成 xml 当模板复制到 /etc/firewalld/services 下面改端口1.复制http模板新建myweb服务cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/myweb.xml2.编辑vim /etc/firewalld/services/myweb.xml?xml version1.0 encodingutf-8?serviceshortmyweb/shortdescription自定义8080服务/descriptionport protocoltcp port8080//service自己写出协议和端口号⚠️坑不要直接修改 /usr/lib 下面的 xml升级软件会把你的修改冲掉。# dmz区域放行http服务临时去掉--permanent firewall-cmd --permanent --zonedmz --add-servicehttp # 删除服务 firewall-cmd --permanent --zonedmz --remove-servicehttp2. 放行自定义端口 / 协议# 放行tcp 8080端口 firewall-cmd --permanent --zonedmz --add-port8080/tcp # 放行端口范围 firewall-cmd --permanent --zonedmz --add-port3000-4000/tcp # 删除端口 firewall-cmd --permanent --zonedmz --remove-port8080/tcp3. 查询区域全部规则firewall-cmd --zonedmz --list-all四、富规则 rich-rule高级规则细粒度控制重点考点普通规则只能全局放行端口无法限制来源 IP富规则可精准控制【源地址、目标地址、端口、协议、动作允许 / 拒绝、日志】通用模板firewall-cmd --permanent --zonedmz --add-rich-rule规则内容参数含义firewall-cmdfirewalld 防火墙管理工具--permanent永久配置写入配置文件不立即生效需要执行firewall‑cmd --reload重载才会真正启用不加此参数只在内存临时生效服务重启丢失--zonedmz这条富规则作用于dmz 区域只对归属 dmz 的网卡流量生效你机器 ens33 就在 dmz--add-rich-rulexxx添加一条富规则rich‑rule。富规则可以实现更精细控制普通--add‑service做不到按源 IP 限制单引号包裹完整规则内容高频实验示例示例 1仅允许 192.168.42.0/24 访问 ssh (22 端口)其他 IP 禁止 sshfirewall-cmd -permanent --zonedmz --add-rich-rulerule familyipv4 source address192.168.42.0/24 service namessh accept片段解释rule富规则的起始关键字代表定义一条规则familyipv4协议族作用于IPv4 流量写ipv6就匹配 ipv6 数据包source address192.168.42.0/24源地址只匹配来自192.168.42.0/24网段的数据包/24子网掩码 255.255.255.0service namessh匹配 ssh 服务对应 22 端口也可以用port protocoltcp port22写法accept动作允许通过其他动作reject拒绝回复报错、drop丢弃不回复示例 2拒绝指定 IP 访问 80 端口firewall-cmd --permanent --zonedmz --add-rich-rulerule familyipv4 source address10.0.0.5 port protocoltcp port80 reject片段含义rule富规则起始标记代表定义一条规则familyipv4匹配 IPv4 协议的数据包source address10.0.0.5源 IP 地址只匹配来自主机10.0.0.5的流量port protocoltcp port80匹配目标端口TCP 协议的 80 端口httpreject动作拒绝返回错误应答包给对方。对比drop直接丢弃数据包不给任何回应示例 3允许单个 IP 访问 3306 数据库端口firewall-cmd --permanent --zonedmz --add-rich-rulerule familyipv4 source address192.168.42.100 port protocoltcp port3306 accept示例 4带日志记录访问行为firewall-cmd --permanent --zonedmz --add-rich-rulerule familyipv4 source address192.168.1.0/24 port port8080 protocoltcp log prefixhttp-access: accept片段含义rule富规则开始标记定义一条规则familyipv4只匹配 IPv4 数据包source address192.168.1.0/24源网段来自192.168.1.0/24整个网段的主机port port8080 protocoltcp匹配本机目标端口TCP 8080log prefixhttp-access:日志记录匹配该规则的数据包写入系统日志日志行开头打上标记http-access:方便过滤查看日志accept动作允许数据包通过防火墙五、富规则管理# 列出zone内所有富规则 firewall-cmd --zonedmz --list-rich-rules # 删除富规则复制完整规则字符串替换 firewall-cmd --permanent --zonedmz --remove-rich-rule完整规则文本 # 重载生效 firewall-cmd --reload实验必背操作流程总结查看防火墙状态systemctl status firewalld确认网卡所在 zonefirewall-cmd --get-active-zones将网卡切换至目标区域 dmz永久添加基础放行规则 / 编写富规则限制来源 IPfirewall-cmd --reload重载配置--list-all校验规则常见排错点添加规则忘记加--permanent重启丢失未指定--zone操作默认 public网卡在 dmz 导致规则无效你截图报错场景添加规则后没有执行 reload富规则引号外层单引号内部参数双引号符号不能写错。firewall‑cmd 常用参数总表提示带--permanent写入配置需--reload才生效不带为内存临时规则重启丢失分类参数功能说明全局基础--permanent设置为永久配置写入配置文件不立即生效--reload重载防火墙加载永久配置已有连接不中断--complete‑reload完全重启防火墙断开全部现有连接--get‑zones列出 firewalld 全部 9 个区域--get‑active‑zones查看活跃区域绑定网卡的 zone--get‑default‑zone查询系统全局默认区域--set‑default‑zonezone设置系统全局默认区域网卡接口--get‑zone‑of‑interfaceens33查询指定网卡所属 zone--change‑interfaceens33 --zonezone修改网卡归属 zone自动从旧 zone 移出区域查看需配合--zonexxx--list‑all输出该 zone 完整配置服务、端口、富规则等--list‑services查看 zone 放行的预定义服务--list‑ports查看 zone 放行端口--list‑rich‑rules查看 zone 下所有富规则预定义服务--add‑service服务名 --zonezone在指定 zone 放行某服务--remove‑service服务名 --zonezone移除 zone 的服务放行规则--get‑services列出全部可用预定义服务端口操作--add‑port端口/协议 --zonezone放行指定端口例80/tcp--remove‑port端口/协议 --zonezone删除端口放行规则富规则 rich‑rule--add‑rich-rule规则内容 --zonezone添加精细控制富规则--remove‑rich-rule规则内容 --zonezone删除富规则规则字符串必须与添加完全一致NAT / 转发--add‑masquerade --zonezone开启地址伪装SNAT 共享上网--remove‑masquerade --zonezone关闭地址伪装--add‑forward‑portport80:prototcp:toaddrIP:toportxxx --zonezone配置端口转发高频考点备注--change‑interface自动解绑网卡旧区域无需单独执行移出命令。--set‑default‑zone仅修改全局默认不会改变已经绑定网卡的 zone。删除富规则引号内部文本必须一字不差否则删除失败。NAT 转发功能内核net.ipv4.ip_forward1必须开启否则转发无效。六、firewalld IP 转发、limit 限流、云安全组1、IP 转发开启转发值为 yesLinux 内核 IP 转发开关必须开启才能做 NAT / 端口转发临时开启内存重启失效 echo 1 /proc/sys/net/ipv4/ip_forward 永久开启 编辑 /etc/sysctl.conf ----- net.ipv4.ip_forward 1 生效命令sysctl -p ✅验证是否开启 sysctl net.ipv4.ip_forward #输出 net.ipv4.ip_forward 1 → yes转发已激活 注意firewalld 做 SNAT、DNAT、端口转发内核 ip_forward 必须打开否则转发不工作。类比家里路由器得开启转发手机的流量才能经过路由器上网。firewall-cmd端口转发语法模板--add-forward-portport外部端口:proto协议:[toaddr目标IP:toport目标端口]不写toaddr→本机端口转发REDIRECT写上toaddr→DNAT 端口映射转发到别的机器永久配置--permanent执行完必须firewall‑cmd --reload① 本机端口转发访问本机 8080 → 本机 80# 添加 firewall-cmd --permanent --add-forward-portport8080:prototcp:toport80 firewall-cmd --reload # 删除 firewall-cmd --permanent --remove-forward-portport8080:prototcp:toport80 firewall-cmd --reload② DNAT 端口映射访问本机 9000 → 内网 192.168.184.100:80# 添加 firewall-cmd --permanent --add-forward-portport9000:prototcp:toaddr192.168.184.100:toport80 firewall-cmd --reload # 删除 firewall-cmd --permanent --remove-forward-portport9000:prototcp:toaddr192.168.184.100:toport80 firewall-cmd --reload查看端口转发规则firewall-cmd --list-forward-ports知识点总结port本机对外监听端口proto协议 tcp /udptoport目标端口toaddr目标 IP省略 toaddr 就是本机端口重定向 REDIRECT端口转发同时会自动放行对外端口不需要额外--add‑port对比 iptables无 toaddr → iptables-j REDIRECT --to‑port有 toaddr → iptables-j DNAT --to‑destination IP:port2、limit 模块 限流策略防范恶意刷量、低频攻击firewalld 富规则可以使用limit做连接频率限制限制每秒 / 每分钟请求次数抵御扫描、恶意刷访问。#允许ssh最多3次/分钟超出拒绝 firewall-cmd --permanent --zonedmz --add-rich-rulerule familyipv4 service namessh limit value3/m accept firewall-cmd --reloadlimit value3/mmminute 分钟ssecond 秒hhour 小时10/s每秒最多 10 个新连接20/m每分钟最多 20 个新连接逻辑匹配的流量在频率限额内 accept 放行超过频率则不匹配本条规则交由 zone 默认策略处理一般拒绝。 作用防暴力破解、恶意刷量、低频扫描攻击。类比门禁一分钟最多允许 3 个人刷卡再来的人直接拦在门外。3、云服务器防火墙注意点安全组云服务器阿里云 / 华为云等存在两层防火墙系统内部防火墙firewalld /iptables操作系统层面云平台安全组云防火墙云厂商外网网关层面在实例外面⚠️关键考点 即使 Linux 系统 firewalld 已经放行端口如果云平台安全组没有开放对应端口外部依然访问不到服务。入方向开放外部进来的端口80、22、8080 等出方向控制服务器向外访问排查思路外部访问不通依次检查 ①云安全组是否放行端口 → ②系统 firewalld 是否放行 → ③服务本身是否监听 0.0.0.0不是 127.0.0.1类比你家房门打开了但是小区大门锁死外人还是进不来。简答版IP 转发内核参数net.ipv4.ip_forward1值为 1 (yes) 代表 IP 转发开启NAT、端口转发依赖该功能。修改/etc/sysctl.confsysctl -p永久生效。IP 转发 路由器功能不开就不能转发数据包。limit 限流模块在 rich‑rule 富规则中配置limit value次数/单位限制新连接频率防范暴力破解、恶意刷量攻击。limit 限流 限速短时间访问次数太多直接拦住防恶意攻击。云服务器双防火墙除操作系统 firewalld还有云平台安全组只有安全组与系统防火墙同时放行端口外部才能正常访问服务。云服务器安全组 系统防火墙两个都要放端口外部才能连上。