文章路线
默认规则≠安全:5步把 Linux 防火墙配到“该挡就挡”
很多人装好系统就以为默认防火墙“自带安全”。其实默认只给了个底线。要想把服务稳稳护住,理解并亲手配置防火墙是必修课。
- 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/tcp、80/tcp、443/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 种坑)
- 连不上服务?
sudo firewall-cmd --list-ports
sudo iptables -L -n -v
核对端口是否放行、是否命中更高优先级规则。
- 重启后规则丢了?
-
firewalld:用
--permanent+--reload。 -
iptables:用
iptables-save / iptables-persistent持久化。
- 把自己锁在门外了?
用云厂商控制台/带外/救援模式,停防火墙服务或回滚最近更改。线上修改前先开第二个会话验证!
进阶方向(知道有这些就够)
-
nftables:统一/更高效的包过滤框架,建议新环境优先。
-
SELinux / AppArmor:与防火墙配合,做强制访问控制(MAC)。
-
Rich Rules(firewalld):更细的多条件匹配。
-
日志体系:
rsyslog / journalctl抓丢包日志 + 可视化。
最佳实践清单(打印贴墙)
-
默认拒绝(in/forward),只放必需端口
-
出站白名单,限制服务器外联
-
按角色建规则(Web/DB/Jump/Cache)
-
变更前开第二个会话验证,避免自锁
-
规则持久化并纳入 Git 版本控制
-
日志接入并设告警阈值
-
与云安全组/边界防火墙叠加(纵深防御)
-
定期用
nmap自扫,确认外露端口与预期一致
结语:工具不难,难的是“守纪律”
不论你选 firewalld 还是 iptables,原则是一样的:
先收紧,再按需放行;先验证,再持久化;能写进流程的,别留在脑子里。
把这篇收藏起来,按照“配方 + 清单”一步一步做,你的 Linux 主机很快就会“该通的通、该挡的挡”。
