本文是一份面向 Debian / Ubuntu 的 iptables 实战指南,重点讲清楚链、表、规则、默认策略、NAT、保存与恢复、以及与 nftables 的关系。它适合需要维护老系统、防火墙脚本、服务器访问控制和端口转发的场景。
适用场景
- 管理 Linux 主机防火墙
- 控制入站、出站和转发流量
- 做端口放行、拒绝和 NAT
- 维护旧脚本或旧环境中的防火墙规则
- 从 iptables 迁移到 nftables 之前做过渡
先说结论
在现代 Debian 中,nftables 是默认方向,但 iptables 仍然广泛存在,特别是在:
- 旧系统
- 旧脚本
- 某些兼容工具链
- 需要沿用现成规则集的环境
如果你现在要写新系统的长期策略,应该先确认是否更适合直接用 nftables。如果你当前环境已经大量使用 iptables,这份文档适合你把它用稳、用清楚。
iptables 是什么
iptables 是 Netfilter 的用户态管理工具,用来配置 Linux 内核里的包过滤和 NAT 规则。
它常用于:
- 防火墙
- 端口允许/拒绝
- 连接跟踪
- 地址转换(NAT)
- 转发控制
基本概念
表(table)
iptables 有多个表,用于不同类型的处理:
- filter:最常用,包过滤
- nat:地址转换
- mangle:修改报文
- raw:更早阶段的处理
- security:安全标记相关
链(chain)
常见内置链:
- INPUT:进入本机的流量
- OUTPUT:本机发出的流量
- FORWARD:经过本机转发的流量
规则(rule)
链里按顺序匹配规则,命中后执行对应动作。
默认策略(policy)
如果没有规则命中,就按链的默认策略处理,常见是:
- ACCEPT
- DROP
- REJECT
Debian 上的现状
Debian 10 以后,iptables 可能通过 iptables-nft 作为前端,底层实际走 nftables。这意味着:
- 你可能写的是 iptables 语法
- 底层执行的是 nftables 兼容层
查看当前版本:
iptables --version
ip6tables --version查看 alternatives:
update-alternatives --display iptables如果你明确要 legacy 版本,也可以通过 update-alternatives 切换。
安装 iptables
在 Debian / Ubuntu 上通常直接安装:
sudo apt update
sudo apt install -y iptables如果你需要持久化规则,可以安装:
sudo apt install -y iptables-persistent查看当前规则
列出规则:
sudo iptables -L -n -v显示更接近导出格式:
sudo iptables -S查看指定表:
sudo iptables -t nat -L -n -v查看 IPv6 规则:
sudo ip6tables -L -n -v最小可用防火墙思路
很多服务器的基础思路是:
- 默认拒绝入站
- 允许已建立连接
- 允许本机回环
- 显式放行 SSH、HTTP、HTTPS
示例逻辑:
- 允许 lo
- 允许 ESTABLISHED,RELATED
- 放行 22
- 放行 80
- 放行 443
- 其他拒绝
常用命令
添加规则
追加到链尾:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT插入到链头:
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT删除规则
按规则内容删除:
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT按行号删除:
sudo iptables -L INPUT --line-numbers
sudo iptables -D INPUT 3设置默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT清空规则
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -X注意:
- -F 是清空链规则
- -X 是删除自定义链
- 生产环境执行前务必确认远程连接不会被断掉
常见放行规则
允许本机回环
sudo iptables -A INPUT -i lo -j ACCEPT允许已建立连接
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT允许 SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT允许 HTTP / HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT常见拒绝规则
拒绝某个 IP
sudo iptables -A INPUT -s 1.2.3.4 -j DROP拒绝某个网段
sudo iptables -A INPUT -s 10.0.0.0/8 -j DROP显式拒绝并返回错误
sudo iptables -A INPUT -p tcp --dport 23 -j REJECT说明:
- DROP:直接丢弃,不回应
- REJECT:明确拒绝,客户端更快得到反馈
NAT 基础
iptables 也常用于 NAT。
端口转发示例
把外部 8080 转到内网 80:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80源地址伪装
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE适合:
- 共享上网
- 网关服务器
- 容器或虚拟机 NAT
转发与路由
如果你要让 Linux 机器充当路由器或网关,需要:
- 打开内核转发
- 放行 FORWARD
- 配置 NAT
开启转发:
sudo sysctl -w net.ipv4.ip_forward=1永久配置可写到:
/etc/sysctl.conf查看与保存规则
导出规则
sudo iptables-save导入规则
sudo iptables-restore < rules.v4保存到文件
sudo iptables-save > /etc/iptables/rules.v4如果安装了 iptables-persistent,它会帮助你在启动时恢复规则。
IPv6
不要只管 IPv4,很多系统还有 IPv6。
常用工具:
sudo ip6tables -L -n -v
sudo ip6tables-save如果你的服务对外开放,IPv4 和 IPv6 的规则都要确认。
规则顺序
iptables 是按顺序匹配的,所以规则顺序很关键。
建议:
- 先放最通用的允许规则
- 再放例外拒绝规则
- 最后设置默认策略
例如:
- 允许回环
- 允许已建立连接
- 放行必要端口
- 拒绝其他流量
计数与调试
查看命中计数:
sudo iptables -L -n -v如果某条规则没有命中,通常检查:
- 规则顺序
- 源地址和目标地址
- 协议和端口
- 接口名
- 是否匹配 IPv4 或 IPv6
与 nftables 的关系
Debian 新版本默认更偏向 nftables。
建议:
- 新项目优先评估 nftables
- 旧规则和旧脚本可以继续使用 iptables
- 不要在同一台机器上随意混用两套策略而不理解底层前端
常见问题
1. 改完规则后把自己锁外面了
这是最常见风险。建议:
- 远程操作前先确认允许 SSH
- 保留一个回滚会话
- 先测试小范围规则,再改默认策略
2. 规则重启后丢失
这是因为规则只在内存里,没有持久化。
解决:
- 使用 iptables-persistent
- 或者开机脚本恢复
3. iptables 和 nft 看起来不一致
可能是:
- 前端不同
- alternatives 指向不同实现
- 你查看的是不同工具链输出
4. IPv6 还能访问
说明你只配了 IPv4,没配 IPv6。
5. 端口已经开了还是访问不到
检查:
- 服务本身是否监听
- 目标端口是否正确
- 云安全组是否放行
- 防火墙是否还有别的链阻挡
最小可用规则集
下面是一套很基础的服务器入站规则思路:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
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
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT如果你远程管理机器,请先确认 SSH 已放行,再改默认策略。
结论
iptables 的核心是:
- 理解表、链、规则、默认策略
- 清楚规则顺序
- 同时考虑 IPv4 和 IPv6
- 会保存和恢复规则
- 知道它和 nftables 的关系