linux 关闭防火墙端口,主流分为两种场景,一种是 firewalld 体系下移除已经放行的端口规则,另一种是传统 iptables 体系删除放行规则,并不是直接把整个防火墙全部关掉,很多新手会混淆关闭单个端口和停用整个防火墙服务,生产环境优先推荐单独关闭指定端口,不建议直接停用防火墙,否则会把主机暴露在公网增加安全风险。linux 防火墙本质是内核 netfilter 框架,规则负责控制进出主机的数据包,之前添加的放行端口规则会长期保存在规则集里面,就算服务重启,永久规则依旧生效,所以只删除临时规则,重启之后端口又会重新开放,这也是经常踩坑的点。学习 linux 关闭防火墙端口,要先确认当前系统使用的是 firewalld 还是 iptables,centos7 之后默认 firewalld,老版本 centos6 默认 iptables,还要区分临时规则和永久规则,掌握查询规则删除规则重载保存规则整套流程,同时理解云服务器还要额外检查云平台安全组,系统防火墙关闭端口之后,安全组仍然拦截的话端口还是不通,下面分模块深度讲解。
一 确认防火墙类型与服务状态
执行 linux 关闭防火墙端口之前,第一步必须确认系统当前启用的防火墙服务,避免操作工具不对,规则修改无效。
| 系统版本 | 默认防火墙 | 查看服务命令 |
|---|---|---|
| centos7 8 9 rhel | firewalld | systemctl status firewalld |
| centos6 | iptables | service iptables status |
| ubuntu debian | ufw 或者 iptables | systemctl status ufw |
实操步骤,第一步终端执行 systemctl status firewalld,如果服务是 active 运行状态,就说明是 firewalld,第二步如果 firewalld 没有运行,再检查 iptables 规则是否存在,第三步确认之后,再执行对应的 linux 关闭防火墙端口操作。
二 firewalld 关闭指定端口
firewalld 使用 zone 区域概念,不同区域有独立规则,默认一般是 public 区域,添加放行端口的时候如果指定了其他 zone,关闭的时候也要在同一个 zone 操作,否则找不到规则。
| 命令 | 作用 |
|---|---|
| firewall cmd list all | 查看全部放行端口和规则 |
| firewall cmd remove port 端口号 tcp | 临时移除 tcp 端口 |
| firewall cmd permanent remove port 端口号 tcp | 永久移除 tcp 端口 |
| firewall cmd reload | 重载防火墙,让永久规则生效 |
实操步骤,第一步执行 firewall cmd list all,查询当前已经放行的端口,确认目标端口和协议是 tcp 还是 udp,第二步如果只需要临时关闭,执行 firewall cmd remove port 8080 tcp,重启防火墙之后规则会恢复,第三步如果需要永久关闭,加上 permanent 参数执行永久移除命令,第四步执行 firewall cmd reload 重载规则,第五步再次执行 list all 验证端口已经从放行列表消失。
深度说明,firewalld 的 permanent 规则默认不会立刻生效,必须 reload 或者重启 firewalld 服务才会加载,很多新手只执行 permanent 删除,忘记 reload,还以为端口没有关闭成功。如果之前是通过服务名称放行,不是端口号放行,就需要使用 remove service 的方式关闭,和端口放行是两套规则。
三 iptables 关闭指定端口
传统 iptables 是命令行直接操作内核规则,规则分为临时内存规则和保存后的永久规则,centos6 体系需要保存规则,重启之后才不会丢失。
| 命令 | 作用 |
|---|---|
| iptables L n | 列出全部 iptables 规则 |
| iptables L n line numbers | 带行号列出规则 |
| iptables D INPUT 行号 | 根据行号删除 INPUT 链放行端口规则 |
实操步骤,第一步执行 iptables L n line numbers,找到放行目标端口对应的那一条规则,记下行号,第二步执行 iptables D INPUT 行号删除这条规则,第三步如果是 centos6,执行 service iptables save 把修改保存到配置文件,第四步再次执行 iptables L n 确认规则已经删除。
深度说明,iptables 删除规则有两种方式,一种按行号删除,一种匹配规则内容删除,按行号删除的时候,删除前面一行之后,后面行号会自动变化,所以不能一次性连续删除多行,要重新查询行号,否则容易删错规则。
四 ufw 关闭指定端口
ubuntu debian 很多系统使用 ufw,属于 iptables 上层简易管理工具,同样可以完成 linux 关闭防火墙端口操作。
| 命令 | 作用 |
|---|---|
| ufw status numbered | 带行号查看放行规则 |
| ufw delete 行号 | 删除对应放行端口规则 |
| ufw delete allow 端口 /tcp | 按规则内容删除放行端口 |
实操步骤,第一步执行 ufw status numbered 查看规则,第二步选择按行号或者按端口规则删除,第三步执行 ufw status 确认端口不再放行。
五 常见误区和补充要点
1 区分关闭防火墙端口和停止防火墙服务,systemctl stop firewalld 是停用整个防火墙,所有端口全部放行,安全风险很高,不推荐作为常规方案
2 云服务器额外安全组,就算系统里面 linux 关闭防火墙端口完成,云厂商安全组如果仍然拦截,外部依旧无法访问,需要登录云控制台同步修改安全组
3 协议要匹配,端口分 tcp 和 udp,关闭的时候协议选错,原来的放行规则仍然保留
4 端口关闭之后,如果业务本身服务还在监听端口,只是防火墙不再放行,本机内部依旧可以访问这个端口,外部访问会被拦截
5 规则重载之后一定要二次校验,确认规则真的移除,避免因为 zone 不对,删除的是别的区域规则
【常见问题】
问题 1 linux 关闭防火墙端口使用 firewalld 加 permanent 之后为什么还是能访问
回答 1 linux 关闭防火墙端口执行 permanent 删除之后,永久规则默认不会立即生效,必须执行 firewall cmd reload 重载防火墙,重载完成之后规则才会真正加载,如果没有重载,原来的放行规则还在内存里面,外部依旧可以访问端口。
问题 2 linux 关闭防火墙端口,查询的时候 public 区域找不到端口规则怎么办
回答 1 linux 关闭防火墙端口的时候,如果 public 区域查不到目标端口,说明当初放行端口的时候是添加到其他 zone 区域,需要切换对应的 zone 参数查询,在对应的 zone 里面执行移除命令,否则无法完成 linux 关闭防火墙端口操作。
问题 3 linux 关闭防火墙端口,iptables 按行号删除规则为什么删错
回答 1 linux 关闭防火墙端口使用 iptables 按行号删除的时候,删除一条规则之后,后续所有规则行号会自动向前移位,如果没有重新查询行号继续删除下一条,就会选错行号删除错误规则,每次删除之后都要重新执行带行号查询命令。
问题 4 linux 关闭防火墙端口之后本机还能访问端口是不是操作失败
回答 1 linux 关闭防火墙端口只是防火墙不再放行外部数据包,业务服务本身仍然监听这个端口,本机回环访问不受防火墙拦截,所以本机可以正常访问不代表 linux 关闭防火墙端口操作失败,要从外部主机测试连通性来验证。
【免责申明】
本文介绍 linux 关闭防火墙端口相关内容仅作为技术学习参考,防火墙规则调整会改变主机网络访问策略,错误删除规则可能影响业务正常访问,也不要随意停用整机防火墙造成安全隐患,生产环境操作前确认业务影响范围,本文不对误操作带来的业务中断安全风险承担责任。


