SecRoadmap.Club

SecLab安全实验室

文章路线

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

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

发布日期

2025/11/03

更新时间

尚未更新

难度

入门

预估阅读

约 10 分钟

前置知识

  • 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) 打开日志并接入监控

  • firewalldjournalctl -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防火墙