13- 防火墙配置(nftables / ufw / iptables) 🔥
前提条件 ✅
- 已完成 SSH 端口改为 2222、公钥认证、fail2ban、AppArmor、内核参数加固
- 以 ops 用户登录(具有 sudo 权限)
- 系统运行在 Debian 12 Bookworm
- 虚拟机环境:VMware Workstation Pro(建议桥接网络,便于外部测试)
详细步骤 🛠️
- Debian 12 防火墙现状
- 默认:nftables(内核 5.10+ 原生支持,取代 iptables)
- iptables-nft 作为兼容层存在
- ufw:用户友好前端,默认未启用,但最易上手
推荐生产路径: - 小型/学习环境 → ufw(简单、直观) - 中大型/需要精细控制 → nftables 直接编写规则 - 迁移旧 iptables 规则 → iptables-nft
- 方案一:ufw(强烈推荐入门与中小型服务器)
安装并初始化:
sudo apt update
sudo apt install -y ufw
配置基本规则(全局约定:只开 SSH 2222):
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment 'SSH custom port'
# 可选:允许内网管理
# sudo ufw allow from 192.168.1.0/24 to any port 2222
# 启用 ufw(--force 跳过交互确认)
sudo ufw --force enable
常用命令:
sudo ufw status verbose
sudo ufw status numbered # 带编号,便于删除
sudo ufw delete 3 # 删除第 3 条规则
sudo ufw reload
sudo ufw disable # 临时关闭(生产慎用)
- 方案二:nftables(现代原生方式,推荐生产精细控制)
确认 nftables 可用:
sudo nft list ruleset
sudo systemctl status nftables
创建简单配置文件(推荐方式):
sudo nano /etc/nftables.conf
生产级最小化配置示例:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# 允许 loopback
iif lo accept
# 允许已建立/相关连接
ct state { established, related } accept
# 允许 ICMP(ping 等)
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# SSH 只允许 2222 端口
tcp dport 2222 ct state new accept
# 可选:允许内网所有
# ip saddr 192.168.1.0/24 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
加载并启用:
sudo nft -c -f /etc/nftables.conf # 先检查语法
sudo nft -f /etc/nftables.conf
sudo systemctl enable nftables
sudo systemctl restart nftables
sudo nft list ruleset
- 方案三:iptables-nft(兼容旧规则)
如果已有 iptables 脚本,可直接使用:sudo apt install -y iptables sudo iptables -L -v -n
示例快速规则:
sudo iptables -P INPUT DROP
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4
- 最终验证(所有方案通用)
sudo ss -tuln | grep 2222 nc -zv 127.0.0.1 2222 # 从外部机器测试 # ssh -p 2222 ops@192.168.1.100 sudo nft list ruleset # 或 sudo ufw status
实践任务 🎯
- 使用 ufw 配置只允许 2222/tcp 入站,其他全部拒绝,启用后验证 status
- (进阶)切换到 nftables,创建 /etc/nftables.conf 文件,加载上述示例规则
- 从宿主机尝试连接其他端口(例如 80、22),确认被阻断;连接 2222 端口确认正常
- 查看防火墙日志(journalctl -u nftables 或 /var/log/syslog | grep ufw)
自测问题 ❓
- ufw 和 nftables 的主要区别是什么?生产环境更推荐哪种?
ct state { established, related } accept这条规则的作用是什么?- 如何在 ufw 中快速删除一条规则(两种方式)?
- 如果防火墙启用后 SSH 断开,最快速的恢复方法是什么(VMware 控制台)?
总结 📌
防火墙是服务器网络边界的最后一道防线。
ufw 适合快速部署与管理,nftables 提供最高灵活性与性能。
本章建立的“默认拒绝 + 只开必要端口”原则,是后续 Web、数据库、容器等服务暴露时的安全基石。