iptables 使用与运维指南

本文是一份面向 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 是按顺序匹配的,所以规则顺序很关键。


建议:

  • 先放最通用的允许规则
  • 再放例外拒绝规则
  • 最后设置默认策略

例如:

  1. 允许回环
  2. 允许已建立连接
  3. 放行必要端口
  4. 拒绝其他流量

计数与调试

查看命中计数:

sudo iptables -L -n -v

如果某条规则没有命中,通常检查:

  • 规则顺序
  • 源地址和目标地址
  • 协议和端口
  • 接口名
  • 是否匹配 IPv4 或 IPv6

与 nftables 的关系

Debian 新版本默认更偏向 nftables。


建议:

  • 新项目优先评估 nftables
  • 旧规则和旧脚本可以继续使用 iptables
  • 不要在同一台机器上随意混用两套策略而不理解底层前端

常见问题

1. 改完规则后把自己锁外面了

这是最常见风险。建议:

  • 远程操作前先确认允许 SSH
  • 保留一个回滚会话
  • 先测试小范围规则,再改默认策略

2. 规则重启后丢失

这是因为规则只在内存里,没有持久化。


解决:

  • 使用 iptables-persistent
  • 或者开机脚本恢复

3. iptablesnft 看起来不一致

可能是:

  • 前端不同
  • 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 的关系
本文地址: https://www.vvcms.cn/blog/iptables-guid
版权所有 © admin 未经授权不得转载

相关推荐