Reading Mode

默认规则≠安全:5步把 Linux 防火墙配到“该挡就挡”

很多人装好系统就以为默认防火墙“自带安全”。其实默认只给了个底线。要想把服务稳稳护住,理解并亲手配置防火墙是必修课。

发布日期

2025/11/03

更新时间

尚未更新

难度

入门

预估阅读

约 10 分钟

作者

SecLab安全实验室

前置知识

  • Linux

很多人装好系统就以为默认防火墙“自带安全”。其实默认只给了个底线。
要想把服务稳稳护住,理解并亲手配置防火墙是必修课。


为什么还要折腾防火墙?

  • 组件可定制:Linux 什么都能换,防火墙也不例外。
  • 命令行友好:CLI 让你能精确到“只放行这台主机的这个端口”。
  • 无处不在:Linux 扛着云、服务器、路由器、物联网——配不好就等于暴露面扩大。

先弄清:什么是防火墙?

一句话:按规则放行或拒绝“进出”的网络流量。
规则可以按 IP / 端口 / 协议 / 区域 等匹配。

常见工具:

  • firewalld:动态、基于“区域(zone)”的管理器(RHEL / Fedora / CentOS 7+ 默认)。
  • iptables:经典的数据包过滤框架,脚本化强。
  • nftables:iptables 的现代替代品,越来越多发行版默认。
  • UFW:Ubuntu 默认的“简化”前端(底层用 iptables/nftables)。

firewalld:把网络按“区域”分层管理

核心概念

  • Zone(区域):代表不同信任级别,如 public / home / internal
  • Service(服务):内置了常见端口集合(如 SSH/HTTP/HTTPS)。
  • Runtime vs Permanent:临时规则(重启失效)vs 永久规则(--permanent + --reload 生效)。

常用命令(拷走就能用)

# 1) 查看状态 / 启用自启  
sudo systemctl status firewalld  
sudo systemctl enable --now firewalld  
  
# 2) 看当前激活的区域  
sudo firewall-cmd --get-active-zones  
  
# 3) 查看 public 区域的放行项  
sudo firewall-cmd --zone=public --list-all  
  
# 4) 放行 HTTP(临时)  
sudo firewall-cmd --zone=public --add-service=http  
  
# 5) 持久放行并重载  
sudo firewall-cmd --zone=public --add-service=http --permanent  
sudo firewall-cmd --reload

常见场景

# 放行 SSH(永久)  
sudo firewall-cmd --zone=public --add-service=ssh --permanent  
  
# 放行自定义端口 8080(永久)  
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent  
  
# 拒绝某个来源 IP  
sudo firewall-cmd --permanent --zone=public \  
  --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'  
sudo firewall-cmd --reload

小技巧:用 firewall-cmd --list-all-zones 快速审计各个区域放行了什么。


iptables:粒度最细、脚本最爽的“老刀”

工作方式

  • 表(tables):filter / nat / mangle / raw / security
  • 链(chains):INPUT(进)/ OUTPUT(出)/ FORWARD(转发)
  • 动作:ACCEPT / DROP / REJECT 等。

语法骨架

sudo iptables -[A|I|D] CHAIN -p PROTO --dport PORT -j ACTION  
# -A 追加 / -I 插入 / -D 删除

必备规则示例

# 允许 ICMP(ping)  
sudo iptables -A INPUT -p icmp -j ACCEPT  
  
# 只允许 192.168.0.10 SSH 进来  
sudo iptables -A INPUT -s 192.168.0.10 -p tcp --dport 22 -j ACCEPT  
  
# 拒绝来自某 IP  
sudo iptables -A INPUT -s 203.0.113.5 -j DROP  
  
# 清空当前规则(谨慎)  
sudo iptables -F

保存规则

# Debian/Ubuntu  
sudo sh -c 'iptables-save > /etc/iptables/rules.v4'  
  
# RHEL/CentOS(老版本)  
sudo service iptables save

我该用哪个?

  • 想要简单、动态分区 → 选 firewalld。
  • 要极致可控、批量脚本 → 选 iptables(或直接上 nftables)。
  • Ubuntu 新手 → 先用 UFW 起步,稳了再进阶。

新项目或较新内核:优先考虑 nftables,语法更清晰、性能也更好。


一套能直接抄的“加固配方”

1) 设定默认策略:先拒绝再放行

iptables:

# 默认拒绝进入与转发,放行已建立会话  
sudo iptables -P INPUT DROP  
sudo iptables -P FORWARD DROP  
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

firewalld: 使用更小的信任 zone(如 public),只向其中添加必须的服务/端口。

2) 最小放行(按角色贴规则)

  • Web 服务器:22/tcp80/tcp443/tcp
  • 数据库仅本机访问(PostgreSQL 示例):
# firewalld 只允许 127.0.0.1 访问 5432  
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" \  
  source address="127.0.0.1" port port="5432" protocol="tcp" accept' --permanent  
sudo firewall-cmd --reload

3) 别忘了“出站控制”(Egress)

默认放行外联很危险。尽量白名单 outbound(DNS/HTTP/HTTPS 等必需端口):

# 以 UFW 为例(概念同理)  
ufw default deny outgoing  
ufw allow out 53    # DNS  
ufw allow out 80    # HTTP  
ufw allow out 443   # HTTPS

4) 防爆破(以 UFW 举例)

ufw limit 22/tcp

5) 打开日志并接入监控

  • firewalld:journalctl -u firewalld
  • UFW:/var/log/ufw.log
    把日志转到 ELK / Loki / Wazuh / SIEM,对“异常扫描/暴力尝试/出站异常”设告警。

故障排查(最常见的 3 种坑)

  1. 连不上服务?
sudo firewall-cmd --list-ports  
sudo iptables -L -n -v

核对端口是否放行、是否命中更高优先级规则。

  1. 重启后规则丢了?
  • firewalld:用 --permanent + --reload
  • iptables:用 iptables-save / iptables-persistent 持久化。
  1. 把自己锁在门外了?
    用云厂商控制台/带外/救援模式,停防火墙服务或回滚最近更改。线上修改前先开第二个会话验证!

进阶方向(知道有这些就够)

  • nftables:统一/更高效的包过滤框架,建议新环境优先。
  • SELinux / AppArmor:与防火墙配合,做强制访问控制(MAC)。
  • Rich Rules(firewalld):更细的多条件匹配。
  • 日志体系:rsyslog / journalctl 抓丢包日志 + 可视化。

最佳实践清单(打印贴墙)

  • 默认拒绝(in/forward),只放必需端口
  • 出站白名单,限制服务器外联
  • 按角色建规则(Web/DB/Jump/Cache)
  • 变更前开第二个会话验证,避免自锁
  • 规则持久化并纳入 Git 版本控制
  • 日志接入并设告警阈值
  • 与云安全组/边界防火墙叠加(纵深防御)
  • 定期用 nmap 自扫,确认外露端口与预期一致

结语:工具不难,难的是“守纪律”

不论你选 firewalld 还是 iptables,原则是一样的:

先收紧,再按需放行;先验证,再持久化;能写进流程的,别留在脑子里。

把这篇收藏起来,按照“配方 + 清单”一步一步做,你的 Linux 主机很快就会“该通的通、该挡的挡”。

关注我们的公众号,并给本文点赞,点个推荐支持一下吧!您的每一个小红心,都是我坚持创作优质内容的最大动力

Linux防火墙ufwiptables