在 Debian 系统中,防火墙管理主要依赖 iptables(传统方案)或 nftables(新一代方案),同时推荐使用 ufw(简单前端)或 firewalld(动态管理)简化操作。以下是详细的管理方法:
| 工具 | 特点 | 适用场景 |
|---|---|---|
| iptables | 传统防火墙工具,基于内核 netfilter,规则直接操作内核表/链 | 熟悉底层规则、复杂场景 |
| nftables | 替代 iptables 的新一代工具,语法更简洁,性能更好,支持动态更新 | Debian 10+ 推荐,现代系统 |
| ufw | 基于 iptables/nftables 的简单前端,命令直观,适合新手 | 桌面/简单服务器 |
| firewalld | 动态防火墙管理,支持 zone 概念,规则可动态生效(无需重启服务) | 服务器、需要灵活 zone 管理 |
ufw(Uncomplicated Firewall)是 Debian 默认的简化防火墙工具,默认可能未安装,需先安装:
sudo apt update
sudo apt install ufw
启用/禁用 ufw
sudo ufw enable # 启用(重启后自动生效)
sudo ufw disable # 禁用
查看状态
sudo ufw status # 简洁状态
sudo ufw status verbose # 详细状态(含规则、默认策略)
设置默认策略
默认拒绝入站,允许出站(安全策略):
sudo ufw default deny incoming # 拒绝所有入站连接
sudo ufw default allow outgoing # 允许所有出站连接
允许/拒绝端口/服务
sudo ufw allow 22/tcp # 允许 TCP 22 端口(SSH)
# 或直接用服务名(需 /etc/services 存在对应条目)
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 3306/tcp
允许特定 IP 访问
例如允许 IP 192.168.1.100 访问所有端口:
sudo ufw allow from 192.168.1.100
允许特定 IP 访问特定端口(如 192.168.1.100 访问 SSH):
sudo ufw allow from 192.168.1.100 to any port 22
删除规则
先查看规则编号:
sudo ufw status numbered
再删除编号对应的规则(如删除第 2 条):
sudo ufw delete 2
重置 ufw
清除所有规则并禁用:
sudo ufw reset
nftables 是 Debian 10(Buster)及以后版本的默认防火墙后端,替代了 iptables。
sudo apt install nftables
启动并设置开机自启
sudo systemctl start nftables
sudo systemctl enable nftables
查看当前规则
sudo nft list ruleset # 列出所有规则集
创建简单规则
例如:允许 SSH(22)、HTTP(80)、HTTPS(443),拒绝其他入站:
# 添加表(ip 协议,表名 filter)
sudo nft add table ip filter
# 添加链(input 链,类型为 filter,优先级 0,policy drop 拒绝默认入站)
sudo nft add chain ip filter input { type filter hook input priority 0 \; policy drop \; }
# 允许本地回环(lo 接口)
sudo nft add rule ip filter input iif lo accept
# 允许已建立/相关的连接(如出站请求的回应)
sudo nft add rule ip filter input ct state established,related accept
# 允许 SSH(22/tcp)
sudo nft add rule ip filter input tcp dport 22 accept
# 允许 HTTP(80/tcp)和 HTTPS(443/tcp)
sudo nft add rule ip filter input tcp dport { 80, 443 } accept
保存规则(持久化)
nftables 规则默认不持久化,需手动保存到配置文件:
sudo nft list ruleset > /etc/nftables.conf
编辑 /etc/nftables.conf 确保开机加载(Debian 默认已配置 systemd 服务读取该文件)。
清除规则
sudo nft flush ruleset # 清除所有规则
iptables 是老牌工具,Debian 仍支持,但建议优先用 nftables 或 ufw。
sudo apt install iptables iptables-persistent
iptables-persistent 用于持久化规则(重启不丢失)。
查看规则
sudo iptables -L -n -v # 列出所有规则(-n 不解析域名,-v 详细)
设置默认策略
sudo iptables -P INPUT DROP # 入站默认拒绝
sudo iptables -P FORWARD DROP # 转发默认拒绝
sudo iptables -P OUTPUT ACCEPT # 出站默认允许
添加规则
允许 SSH、HTTP、HTTPS:
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 22 -j ACCEPT # SSH
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
持久化规则
使用 iptables-persistent 保存:
sudo netfilter-persistent save # 保存当前规则到 /etc/iptables/rules.v4(IPv4)
sudo netfilter-persistent reload # 重新加载规则
firewalld 是红帽系常用的动态防火墙,Debian 也可安装,适合需要 zone 划分的场景。
sudo apt install firewalld
启动并设置开机自启
sudo systemctl start firewalld
sudo systemctl enable firewalld
查看状态与 zone
sudo firewall-cmd --state # 查看服务状态
sudo firewall-cmd --get-zones # 列出所有 zone
sudo firewall-cmd --get-active-zones # 查看活跃 zone
管理 zone 规则
默认 zone 是 public,可添加服务/端口:
# 允许 SSH 服务(永久生效,需 reload)
sudo firewall-cmd --zone=public --add-service=ssh --permanent
# 允许 HTTP 端口(临时生效,重启后丢失)
sudo firewall-cmd --zone=public --add-port=80/tcp
# 重新加载规则(使永久规则生效)
sudo firewall-cmd --reload
删除规则
sudo firewall-cmd --zone=public --remove-service=ssh --permanent
sudo firewall-cmd --reload
iptables-persistent 或手动保存配置;ufw/firewalld 会自动处理持久化。根据你的需求选择工具:新手用 ufw,现代系统用 nftables,需要动态 zone 用 firewalld。