iptablesLinux 系统中极其强大且经典的防火墙工具。它实际上是一个用户态的命令行工具,用于配置 Linux 内核中的 Netfilter 数据包过滤框架。

一、 核心概念:四表五链

  1. 五个规则链 (Chains)
    链对应数据包在内核中流经的不同阶段:
  • INPUT:处理进入本机的数据包。
  • OUTPUT:处理从本机发出的数据包。
  • FORWARD:处理经过本机转发的数据包(本机作为路由器时)。
  • PREROUTING:数据包进入路由表之前(常用于目的地址转换 DNAT)。
  • POSTROUTING:数据包离开路由表之后(常用于源地址转换 SNAT/伪装)。
  1. 四个表 (Tables)
    表决定了规则的功能:
  • filter 表(默认):用于包过滤(放行或阻断)。包含 INPUT, FORWARD, OUTPUT。[1][2][3][10]
  • nat 表:用于网络地址转换(修改源/目IP或端口)。包含 PREROUTING, OUTPUT, POSTROUTING。[1][2][10]
  • mangle 表:用于修改数据包的服务类型、TTL、标记等。[2]
  • raw 表:用于决定数据包是否被状态跟踪机制处理,提高性能。[2]

二、 基本语法

1
iptables [-t 表名] 命令选项 [链名] [匹配条件] [-j 目标动作]
  1. 常用命令选项:

    • -L:列出规则。
    • -A:在链的末尾追加(Append)规则。
    • -I:在链的开头插入(Insert)规则。
    • -D:删除(Delete)规则。
    • -F:清空(Flush)规则。
    • -P:设置默认策略(Policy)。
    • -n:以数字形式显示(不解析域名/端口名,速度快)。
  2. 常见目标动作 (-j):

    • ACCEPT:允许通过。
    • DROP:直接丢弃,不给回应(对方会超时)。
    • REJECT:拒绝,并给对方回一个错误信息。
    • SNAT/DNAT:地址转换。
    • LOG:记录日志。

三、 常用实战案例

  1. 查看现有规则
1
2
3
iptables -L -n -v --line-numbers
# -v 显示详细流量统计,--line-numbers 显示行号以便删除

  1. 基础安全设置(白名单思路)
    建议先放行 SSH,否则可能导致自己无法连接服务器。
1
2
3
4
5
6
7
8
9
10
11
12
# 1. 允许回环口(127.0.0.1)通信
iptables -A INPUT -i lo -j ACCEPT

# 2. 允许已建立的连接继续通信(非常重要,否则发出的请求回不来)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 3. 开启 SSH 端口(默认 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 4. 设置默认策略为 DROP(谨慎:必须先完成上述步骤)
iptables -P INPUT DROP

  1. 封禁/开放指定 IP 或端口
1
2
3
4
5
6
# 屏蔽 IP 为 192.168.1.100 的访问
iptables -I INPUT -s 192.168.1.100 -j DROP

# 开放 80 (HTTP) 和 443 (HTTPS) 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  1. 端口转发 (NAT 示例)
1
2
3
#将访问本机 8080 端口的流量转发到本地 80 端口:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80

四、 规则的持久化

iptables 的规则在重启后会失效。要永久保存:

1
2
3
4
5
6
# CentOS/RHEL:
service iptables save # 存入 /etc/sysconfig/iptables

#Ubuntu/Debian:
apt install iptables-persistent
netfilter-persistent save