微信优化

weixinyouhua

linux如何查看防火墙配置?linux防火墙配置查看命令

2026-09-14 11:45:27

Linux查看防火墙配置没有一条通用命令,得先确认当前系统用的哪套防火墙CentOS/RHEL 7以上默认是firewalld,Ubuntu和大部分旧版本走的是iptables或ufw,确认方式就是一条systemctl status firewalld。

先把工具认清楚,再上手查。

先分清firewalld和iptables,别查错对象

firewalld和iptables有什么区别?一个是管理工具,一个是内核模块的配置接口,很多人查配置时栽跟头就栽在没分清这俩。

  • firewalld是基于iptables的上层封装,服务于CentOS 7、RHEL 7以上系统,用firewall-cmd操作动态规则。
  • iptables是Linux内核netfilter框架的标准客户端,绝大多数发行版都支持,规则写在内存里,也可持久化到文件。
  • 另外Ubuntu的默认方案是ufw,底层同样是iptables,但命令风格完全不同。

行业共识认为,不少生产环境故障排查,卡在第一步你根本不确定系统里跑了几个防火墙服务,Linux允许同时安装firewalld和iptables,但它们会互相影响,先跑下面这条查状态,最稳:

systemctl list-unit-files | grep -E 'firewalld|iptables|ufw'

看到哪个是enabled,基本就知道系统默认用的是哪个,然后针对性地执行命令,这一步属于常见的linux查看防火墙配置命令挑错环节,哪怕干了多年的运维也偶尔会忘。

linux查看防火墙配置命令:firewalld实操

服务器是CentOS 7或8,系统默认用的是firewalld,那就用下面这组操作来centos查看防火墙配置。

检查firewalld运行状态

systemctl status firewalld

返回active (running)说明在运行,inactive (dead)说明没起来,想只看极简结果,可以用:

systemctl is-active firewalld

查看当前生效的zone和完整规则

firewalld按zone管理规则,默认zone是public,执行以下命令查看默认zone允许的所有服务和端口:

firewall-cmd --list-all

输出包含:

  • interfaces:绑定到该zone的网络接口名。
  • services:已放行的服务,比如ssh、http、https。
  • ports:手动放行的端口,格式如8080/tcp。
  • masquerade

    linux如何查看防火墙配置?linux防火墙配置查看命令

    :是否开启NAT伪装(虚拟机和Docker环境经常查这个)。

  • forward-ports:端口转发规则,查映射用这个字段。

想查指定zone的规则,比如internal,加个--zone=internal参数:

firewall-cmd --zone=internal --list-all

查看开放端口和服务列表

linux查看防火墙开放端口,就两条命令:

firewall-cmd --list-ports
firewall-cmd --list-services

第一条输出所有放行的端口,第二条输出所有放行的服务名,注意services里的http意味着80端口放行,这是firewalld的封装逻辑,看规则时别只盯着数字端口。

看配置文件

firewalld的持久化配置文件在/etc/firewalld/目录下,分两块:

  • /etc/firewalld/zones/:存放zone定义,里面的xml文件就是对应zone的规则集合。
  • /etc/firewalld/firewalld.conf:防火墙主配置,默认zone、允许的服务都在这。

直接查看默认zone的落地规则:

cat /etc/firewalld/zones/public.xml

配置文件里能看到详细的服务和端口定义,比命令行输出更直观,适合做配置审计和备份对比。

linux怎么查看防火墙规则:iptables与配置文件

换个场景:Ubuntu 18.04,或者CentOS 6的遗留服务器,这些系统直接跑iptables,适用linux怎么查看防火墙规则的思路。

查看当前内存中的规则

iptables规则默认保存在内核内存中,执行的每一条命令即时生效,查看全部规则:

iptables -L -n --line-numbers

输出解读:

  • 三个默认链:INPUT(入站)、FORWARD(转发)、OUTPUT(出站)。
  • -n参数不让命令做DNS反解,速度快,这是排查业务的标配。
  • --line-numbers显示规则序号,删除规则时要用。

只查某一条链,比如INPUT链:

iptables -L INPUT -n

查看规则文件是否持久化

内存里的规则重启后大概率丢失,系统重启后加载的规则在配置文件里,不同发行版文件路径不同:

linux如何查看防火墙配置?linux防火墙配置查看命令

发行版 配置文件路径
CentOS 6/RHEL 6 /etc/sysconfig/iptables
Ubuntu /etc/iptables/rules.v4
Debian /etc/iptables/rules.v4

用cat或less都行,

cat /etc/sysconfig/iptables

规则文件的顺序和格式,跟iptables -L -n的输出基本一致,一眼就能对照出问题。

查看IPv6规则

很多服务器忽略了IPv6防火墙,导致出现诡异的端口问题,查看IPv6规则单独执行:

ip6tables -L -n

这台服务器如果开了IPv6,而IPv6的规则没放行对应端口,就会出现“端口开了,但外网访问不通”的怪现象。

规则顺序的意义

iptables规则按从上往下顺序匹配,一旦命中就停止,所以iptables -L -n里的排序决定了最终放行还是拦截,前面是DROP,后面写ACCEPT也没用,排查时要完整看完整个链的规则,别只盯着最后一行看有没有放行规则。

生产环境实战:查配置的三种典型场景

配置查多了,会发现实际遇到的问题就集中在几种模式上,这里拆开聊。

服务起不来,怀疑防火墙拦截

新装的服务端口没放行,最典型,先用ss -lntp确认进程监听正常,再查防火墙:

ss -lntp | grep 8080
firewall-cmd --list-ports

两边一对照,如果进程在听但防火墙没放行8080,基本就是它了,临时放行:

firewall-cmd --add-port=8080/tcp

防火墙配置改了,但规则没生效

firewalld的规则有两种状态:runtime(运行时)和permanent(持久化)。firewall-cmd --add-port=8080/tcp只改了运行时,重启后规则就没了,要让centos查看防火墙配置看到的规则长期有效,必须加--permanent参数:

firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

iptables同理,临时加规则后不保存,重启即丢,CentOS 6用service iptables save,Ubuntu用netfilter-persistent save。

docker和防火墙的端口冲突

Docker会自动往iptables的DOCKER链里写规则,而firewalld管不到这块,排查时如果发现

linux如何查看防火墙配置?linux防火墙配置查看命令

firewall-cmd --list-all显示的端口都正常,但容器端口仍不通,要加看Docker链:

iptables -L DOCKER -n

这种场景在云服务器和自建机房都很常见,属于linux查看防火墙配置命令里最容易忽略的隐藏层。

一次查出完整配置的合并建议

综合上面的操作,给出一套比较完整的排查命令流,适合接到服务器第一时间摸清防火墙全貌:

systemctl list-unit-files | grep -E 'firewalld|iptables|ufw'
systemctl status firewalld
firewall-cmd --list-all
iptables -L -n --line-numbers
ip6tables -L -n
cat /etc/firewalld/zones/public.xml

前两条判断系统用哪套防火墙,中间三条查实际生效规则,最后一条看持久化配置,执行完这组命令,整个防火墙的现状和配置落地方向基本都清楚了。

Q&A:linux查看防火墙配置常见疑问

查防火墙配置需要root权限吗?

需要,普通用户跑systemctl status firewalld和iptables -L虽然能看到部分信息,但很多细节命令(比如查看zone配置和状态)没有root权限会直接被拒绝,生产环境建议用sudo执行,避免切换root账号带来其他风险。

firewalld和iptables的规则冲突怎么办?

不能同时开着两套防火墙,如果firewalld在跑,iptables命令添加的规则会与firewalld的动态管理产生覆盖和冲突,要么停掉firewalld改用iptables,要么就用firewall-cmd管理规则,二选一,生产环境的通用做法是:CentOS 7以上用firewalld,老旧系统保持iptables不动。

为什么firewall-cmd –list-all看不到端口转发规则?

firewall-cmd --list-all输出的是当前zone的完整配置,包含forward-ports字段,看不到可能有三个原因:查的zone不对,转发规则配置在另一个zone里;规则是runtime状态但没加--permanent,reload后被清除;规则写在iptables层而非firewalld层,这就要回到iptables命令去查看,据Linux手册页说明,firewalld的动态规则与iptables静态规则不属于同一管理平面,分开排查才能定位问题。

Linux查看防火墙配置的本质是先定位防火墙类型,再按对应工具查看运行时状态和持久化配置,掌握了这套逻辑,任何发行版都能快速上手。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待