马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
CentOS 7 默认用 firewalld 当防火墙,很多人卡在"服务起不来"或者"规则加完没效果"这两步。这篇把 firewalld 的日常操作按实际运维的顺序整理清楚:服务怎么管、端口怎么开关、怎么只放行指定 IP、rich rule 怎么写、常见命令有哪些坑。所有命令都以 root 或 sudo 执行为前提。
一、先把防火墙服务管明白
1. 切到 root
su root
或者直接全程加 sudo 前缀也行,效果一样。
2. 看状态
先看服务在不在、是不是开机自启:
systemctl status firewalld
systemctl is-enabled firewalld.service
firewall-cmd --state
firewall-cmd --state 会直接回一句 running 或 not running,最省事。
3. 启动 / 重启 / 关闭
systemctl start firewalld # 启动
systemctl restart firewalld # 重启
systemctl reload firewalld # 只重载配置,不断连接
systemctl stop firewalld # 关闭
systemctl enable firewalld # 设为开机自启
systemctl disable firewalld # 取消开机自启
记一个小区别:改配置通常用 firewall-cmd --reload,比 restart 温和——reload 只是重新读规则,已经建立的连接不断开;restart 会短暂中断。生产上优先 reload。
二、端口:开关查三件套
firewall-cmd --list-ports # 已开放的端口
firewall-cmd --list-all # 某 zone 的全部规则(服务、端口、富规则)
firewall-cmd --list-protocols # 允许的协议
firewall-cmd --list-rich-rules # 富规则列表
看端口也可以直接用 netstat 对照(注意 ntlp 里的 p 表示进程,别漏):
netstat -ntlp
开放一个端口的标准写法,关键是加 --permanent 再加 reload,否则重启就丢了:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=998/tcp
firewall-cmd --permanent --add-port=999/tcp
firewall-cmd --reload
查询和删除:
firewall-cmd --query-port=80/tcp # 查是否开放,返回 yes/no
firewall-cmd --permanent --remove-port=999/tcp # 删掉端口
firewall-cmd --reload
几个参数释义:--permanent 永久生效(不加只在当前运行实例里生效);--zone 指定作用域(公网网卡一般是 public);--add-port=80/tcp 格式固定是"端口/协议"。加是 add、删是 remove,记住这一个字就够了。
三、只放行指定 IP:rich rule
比"开一个端口给全世界"更精细的做法是限来源。规则里的关键字:accept 是放行、drop 是拒绝。
1. 允许某个 IP 访问所有流量
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.43.100" accept'
firewall-cmd --reload
2. 只允许某个 IP 访问某个端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="8.8.8.8" port protocol="tcp" port="80" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.168.186.25" port protocol="tcp" port="22" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.168.186.25,10.168.186.211" port protocol="tcp" port="3306" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.168.186.0/24" port protocol="tcp" port="22" accept'
firewall-cmd --reload
这几条覆盖了四种常见形态:单个 IP、多 IP 逗号分隔、CIDR 网段(10.168.186.0/24 就是整个网段)。命令跑完回显 success 才说明写进去了。
3. 按协议限,比如禁 ping
firewall-cmd --permanent --add-rich-rule='rule protocol value="icmp" drop'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="120.12.23.136" protocol value="icmp" accept'
注意顺序:允许某台机器 ping 要通过,就先写总开关 drop、再写这条 accept(firewalld 对同一来源按匹配顺序处理)。真想精准控制,用 --add-icmp-block-inverse 更清晰。
4. 移除规则
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="8.8.8.8" port port="80" protocol="tcp" accept'
firewall-cmd --reload
动手删之前先 firewall-cmd --list-rich-rules 把原文抄下来,去掉 --add- 换成 --remove- 就是删除命令,比自己重新拼一遍省事得多。
四、服务(service)级的开关
firewall-cmd --get-services # 看本机支持哪些服务名
firewall-cmd --add-service=http # 临时放行 http 服务
firewall-cmd --remove-service=http # 临时移除
firewall-cmd --query-service=http # 查状态
firewall-cmd --permanent --add-service=nginx # 永久放行
所谓"服务"其实就是一组预定义好的端口(比如 http 对应 80/tcp),记不住端口时用它比较省心。
五、三个最容易踩的坑
- 加了端口忘 reload:不加
--permanent 或加完不 firewall-cmd --reload,重启服务/机器后全丢,排查时容易误判成"规则没生效"。
- 改完规则不验证:加完一定要用
firewall-cmd --list-all 回看一眼,确认规则真的在里面。
- 在公网 zone 里给全端口放行:端口开放前先想清楚来源,数据库这类端口只给内网或跳板机 IP,别写成
0.0.0.0/0。
六、小结
firewalld 的日常操作就三件事:服务(start/restart/reload/enable)、端口(add-port / remove-port + permanent + reload)、来源限制(rich rule 的 accept / drop)。记住一条主线——所有永久配置都必须带 --permanent,改完必须 --reload,能避开大部分"配置没生效"的坑。另外把 firewalld 和云厂商的安全组当成两层来配,两者都要放行才能真正通。
qidao123.com企服评测-应用市场 编辑提示
本文命令适用于 CentOS 7 / RHEL 7 及使用 firewalld 的系统。修改防火墙规则前请先确认当前连接通道(控制台或已放行的远程通道),避免把自己锁在机器外面。更多服务器运维实践可到 qidao123.com 企服评测-应用市场 查看。
|