我们来详细讲解一下 Linux 系统中最常用的防火墙工具 iptables 和它的现代化替代品 nftables 的配置规则。
目前,大多数主流发行版(如 Ubuntu 20.04+, RHEL/CentOS 8+, Debian 10+)已经逐渐从 iptables 转向 nftables 作为底层的防火墙后端。但 iptables 命令依然被广泛使用,其概念是理解防火墙的基础。
1. iptables 基础
iptables 通过一系列规则(Rules)来控制网络流量,这些规则被组织在不同的链(Chains)中,而链又存在于不同的表(Tables)中。
核心概念:
- 表(Tables):定义规则的目的。
filter:默认表,用于过滤数据包(允许或拒绝)。nat:用于网络地址转换(端口转发、IP伪装)。mangle:用于修改数据包头(如 TTL)。raw:用于连接跟踪前的数据包处理。
- 链(Chains):规则被应用的时机。
INPUT:处理发往本机的数据包。OUTPUT:处理本机发出的数据包。FORWARD:处理经过本机路由的数据包。PREROUTING(nat表):数据包到达时立即修改(目标地址转换 DNAT)。POSTROUTING(nat表):数据包发出前修改(源地址转换 SNAT)。
- 规则(Rules):具体的匹配条件和动作。
- 动作(Targets):
ACCEPT:允许数据包通过。DROP:丢弃数据包(无响应,更安全)。REJECT:拒绝数据包,并返回错误信息(如connection refused)。LOG:记录日志,然后继续处理下一条规则。MASQUERADE:一种特殊的 SNAT,用于动态 IP(如拨号上网)。
常用命令选项:
-A(--append):在链的末尾添加规则。-I(--insert):在链的指定位置插入规则(默认为开头)。-D(--delete):从链中删除规则。-L(--list):列出链中的规则。-F(--flush):清空链中的所有规则。-P(--policy):设置链的默认策略(ACCEPT,DROP)。-p(--protocol):指定协议(如tcp,udp,icmp,all)。-s(--source):指定源 IP 地址或网段。-d(--destination):指定目标 IP 地址或网段。--sport/--dport:指定源端口或目标端口(必须与-p tcp或-p udp连用)。-i(--in-interface):指定数据进入的网络接口(如eth0)。-o(--out-interface):指定数据发出的网络接口。-j(--jump):指定规则匹配后的动作(ACCEPT,DROP等)。-m(--match):加载扩展模块(如state,conntrack)。
状态模块(非常重要):
-m state --state 或 -m conntrack --ctstate
NEW:新的连接请求。ESTABLISHED:已建立的连接。RELATED:与已建立连接相关的连接(如 FTP 的数据连接)。INVALID:无效的数据包。
允许已建立的连接和相关的连接返回的数据通过,是保证通信正常的关键。
2. iptables 配置示例
场景:配置一个简单的 Web 服务器防火墙
默认策略设置为 DROP 是最安全的,但配置不当可能导致自己被锁在外面(特别是通过 SSH 远程管理时)。
# 1. 清空所有现有规则
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F
# 2. 设置默认策略(谨慎操作!如果是远程服务器,先设置INPUT为ACCEPT或配置SSH规则)
sudo iptables -P INPUT DROP # 默认拒绝所有入站流量
sudo iptables -P FORWARD DROP # 默认拒绝所有转发流量
sudo iptables -P OUTPUT ACCEPT # 默认允许所有出站流量(通常这样设置)
# 3. 允许本地回环接口(lo)的通信
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# 4. 允许已建立的和相关连接的数据包进入(至关重要!)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 5. 允许SSH连接(端口22)。如果是远程服务器,这条规则必须在设置默认DROP前添加!
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 6. 允许HTTP(80)和HTTPS(443)流量
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 7. 允许Ping(ICMP)
sudo iptables -A INPUT -p icmp -j ACCEPT
# 8. 记录被拒绝的输入数据包(可选,用于调试)
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "
# 查看配置的规则
sudo iptables -L -v
保存规则(非常重要!)
iptables 规则是临时的,重启后失效。必须使用工具保存。
- Debian/Ubuntu:
sudo apt install iptables-persistent sudo netfilter-persistent save - RHEL/CentOS 7:
sudo yum install iptables-services sudo service iptables save
3. nftables 简介
nftables 取代了 iptables、ip6tables、ebtables 等,提供了更统一的语法和更好的性能。
核心概念:
- 表(Tables):与
iptables类似。 - 链(Chains):与
iptables类似。 - 规则(Rules):由表达式和语句组成,语法更简洁强大。
nftables 配置示例(实现同上功能)
创建一个配置文件,例如 /etc/nftables.conf。
#!/usr/sbin/nft -f
# 清空旧规则
flush ruleset
# 定义一个新表,家族为 ip(IPv4)
table inet filter {
# 定义三个链
chain input {
# 设置链的默认策略
type filter hook input priority 0; policy drop;
# 允许本地回环
iif "lo" accept
# 允许已建立/相关的连接
ct state established,related accept
# 允许SSH
tcp dport 22 accept
# 允许HTTP/HTTPS
tcp dport {80, 443} accept
# 允许ICMP (ping)
ip protocol icmp accept
# 记录被拒绝的包
log prefix "nftables-Dropped: " group 0
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
启用并保存 nftables 规则:
# 检查语法是否正确
sudo nft -c -f /etc/nftables.conf
# 加载配置文件
sudo nft -f /etc/nftables.conf
# 查看当前规则集
sudo nft list ruleset
# 设置开机自启(Systemd系统)
sudo systemctl enable nftables --now
4. 前端工具:UFW (Uncomplicated Firewall)
如果你觉得 iptables 或 nftables 太复杂,Debian/Ubuntu 系统提供了非常简单的命令行工具 ufw。
# 安装(通常已预装)
sudo apt install ufw
# 启用
sudo ufw enable
# 允许SSH(非常重要!否则可能失去连接)
sudo ufw allow ssh
# 或者直接指定端口
sudo ufw allow 22/tcp
# 允许HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 拒绝来自特定IP的访问
sudo ufw deny from 192.168.1.100
# 查看状态
sudo ufw status verbose
# 禁用
sudo ufw disable
总结与建议
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
iptables | 历史悠久,资料丰富,几乎所有系统都支持 | 语法相对复杂,规则多时难以管理 | 需要精细控制的老系统或学习基础 |
nftables | 现代,语法简洁统一,性能更好,是未来趋势 | 较新,学习资料相对较少 | 新系统首选,需要更强大的功能 |
ufw | 极其简单易用,零学习成本 | 功能相对有限,不够灵活 | 桌面用户或简单服务器配置 |
最佳实践:
- 谨慎设置默认策略:在远程服务器上,设置
INPUT DROP前,务必先允许 SSH。 - 使用状态规则:总是允许
ESTABLISHED, RELATED状态,这是双向通信能成功的关键。 - 最小权限原则:只开放必要的端口和服务。
- 及时保存规则:配置测试无误后,立即保存以防重启后丢失。
- 做好备份:在修改生产环境的防火墙之前,备份现有规则。

32

被折叠的 条评论
为什么被折叠?



