0%

防火墙

Linux 防火墙 iptables 全解析:从基础到实战配置

iptables 是 Linux 系统中基于 netfilter 内核框架的包过滤防火墙工具,用于控制网络数据包的流入、流出和转发。本文将详细解析 iptables 的核心构成、规则语法及常用配置,帮助你掌握防火墙的搭建与管理。

iptables 的核心构成

iptables 的工作机制基于 “表(Table)- 链(Chain)- 规则(Rule)” 三层结构,每层负责不同的数据包处理逻辑。

表(Table):功能分类

iptables 包含 4 张核心表,每张表专注于一类网络功能:

表名 功能描述 包含的链(Chain)
filter 核心表,负责数据包的过滤(允许 / 拒绝),是最常用的表。 INPUT(入站)、OUTPUT(出站)、FORWARD(转发)
nat 网络地址转换表,用于修改数据包的源 / 目的 IP 或端口(如端口映射、IP 伪装)。 PREROUTING、POSTROUTING、OUTPUT
mangle 用于修改数据包的标记(如 TOS 字段),辅助过滤或路由决策。 PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
raw 用于关闭数据包的连接跟踪(针对特定场景优化性能)。 PREROUTING、OUTPUT

默认表:若未指定表(-t 参数),默认操作 filter 表。

链(Chain):数据包流向

链是表中预设的数据包处理节点,按数据包的流向划分:

链名 所属表 触发时机
INPUT filter/mangle 数据包进入本机(目标 IP 是本机)时触发。
OUTPUT filter/mangle/nat 本机产生的数据包出站时触发。
FORWARD filter/mangle 数据包穿过本机(转发给其他主机)时触发(需开启内核转发)。
PREROUTING nat/mangle/raw 数据包到达本机后,路由决策前触发(常用于 DNAT 目的地址转换)。
POSTROUTING nat/mangle 数据包路由决策后,离开本机前触发(常用于 SNAT 源地址转换)。

规则(Rule):匹配与动作

规则是链中的具体指令,由匹配条件目标动作组成:

  • 匹配条件:如协议(TCP/UDP/ICMP)、源 / 目的 IP、端口、网卡等。
  • 目标动作:满足条件时的处理方式(如允许、拒绝、转发等)。

iptables 基本操作命令

服务管理

iptables 规则默认在系统重启后失效,需通过服务命令管理规则的保存与加载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动 iptables 服务
service iptables start

# 停止 iptables 服务(清空规则)
service iptables stop

# 重启 iptables 服务(重新加载规则)
service iptables restart

# 保存当前规则到配置文件(/etc/sysconfig/iptables)
service iptables save

# 查看 iptables 服务状态
service iptables status

规则查看

1
2
3
4
5
6
7
8
9
10
11
# 查看默认表(filter)的所有链和规则
iptables -L

# 查看指定表(如 nat)的规则
iptables -t nat -L

# 查看规则的详细信息(包含接口、IP、端口等)
iptables -nvL # -n:IP 不解析为域名;-v:详细输出

# 查看指定链(如 INPUT)的规则
iptables -nvL INPUT

规则清空与默认策略

1
2
3
4
5
6
7
8
9
10
11
# 清空指定表的所有规则(默认 filter 表)
iptables -F # 等价于 iptables -t filter -F

# 清空 nat 表的所有规则
iptables -t nat -F

# 设置链的默认策略(未匹配任何规则时的动作)
# 格式:iptables [-t 表] -P 链名 动作
iptables -P INPUT DROP # INPUT 链默认拒绝所有数据包
iptables -P OUTPUT ACCEPT # OUTPUT 链默认允许所有数据包
iptables -P FORWARD DROP # 禁止转发(默认安全设置)

注意:默认策略建议设置为 DROP(拒绝),仅开放必要的端口 / 服务,提升安全性。

规则配置语法与示例

基本语法

1
iptables [-t 表名] <操作> <链名> [匹配条件] [-j 目标动作]
操作选项(常用):
  • -A:在链的末尾追加一条规则。
  • -I:在链的开头插入一条规则(可指定位置,如 -I INPUT 1 插入到第 1 位)。
  • -D:删除链中的一条规则(如 -D INPUT 1 删除第 1 条规则)。
  • -R:替换链中的一条规则(如 -R INPUT 1 ... 替换第 1 条规则)。
匹配条件(常用):
  • -p 协议:指定协议(tcp/udp/icmp/all)。
  • -s 源IP:指定源 IP 或网段(如 -s 192.168.1.100-s 192.168.1.0/24)。
  • -d 目标IP:指定目标 IP 或网段。
  • --sport 源端口:指定源端口(仅 TCP/UDP,如 --sport 22)。
  • --dport 目标端口:指定目标端口(如 --dport 80)。
  • -i 网卡:指定入站网卡(如 -i eth0)。
  • -o 网卡:指定出站网卡(如 -o eth0)。
目标动作(常用):
  • ACCEPT:允许数据包通过。
  • DROP:丢弃数据包(不返回任何响应)。
  • REJECT:拒绝数据包,并返回错误响应(如 icmp-port-unreachable)。
  • LOG:将数据包信息记录到日志(/var/log/messages),需配合其他动作使用。
  • SNAT:源地址转换(如 --to-source 公网IP,用于内网访问外网)。
  • DNAT:目的地址转换(如 --to-destination 内网IP:端口,用于端口映射)。
  • MASQUERADE:动态 IP 伪装(适用于 ADSL 等动态公网 IP 场景)。

常用规则示例

(1)filter 表:基础过滤规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 允许本机回环地址(lo)的所有通信(必需,否则影响本地服务)
iptables -A INPUT -i lo -j ACCEPT

# 2. 允许已建立的连接和相关连接(如 FTP 数据连接)
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 3. 允许 SSH 连接(端口 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 4. 允许 HTTP(80)和 HTTPS(443)访问
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 5. 允许 ICMP 协议(ping 命令)
iptables -A INPUT -p icmp -j ACCEPT

# 6. 拒绝所有未匹配的入站数据包(需设置为默认策略,或最后追加)
iptables -A INPUT -j DROP
(2)nat 表:地址转换规则
1
2
3
4
5
6
7
8
# 1. 内网(192.168.1.0/24)通过公网 IP(10.0.0.1)访问外网(SNAT)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.0.0.1

# 2. 动态公网 IP 场景(如 ADSL),用 MASQUERADE 代替 SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

# 3. 端口映射:将公网 IP(10.0.0.1)的 8080 端口映射到内网 192.168.1.100 的 80 端口
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
(3)日志记录规则
1
2
3
# 记录被拒绝的入站数据包(日志前缀为 "iptables-drop: ")
iptables -A INPUT -j LOG --log-prefix "iptables-drop: " --log-level 6
iptables -A INPUT -j DROP # 记录后丢弃

日志查看:tail -f /var/log/messages | grep "iptables-drop"

规则的保存与生效

  1. 临时生效:通过 iptables 命令添加的规则立即生效,但重启后丢失。

  2. 永久生效:

    1
    2
    3
    4
    5
    # 保存规则到配置文件
    service iptables save # 规则保存到 /etc/sysconfig/iptables

    # 验证配置文件
    cat /etc/sysconfig/iptables

实战:构建安全的防火墙规则

以下是一个典型的服务器防火墙配置(仅开放必要服务,拒绝其他所有连接):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 清空现有规则
iptables -F
iptables -t nat -F

# 2. 设置默认策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# 3. 允许回环地址
iptables -A INPUT -i lo -j ACCEPT

# 4. 允许已建立的连接
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 5. 开放 SSH(22)、HTTP(80)、HTTPS(443)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 6. 保存规则
service iptables save

常见问题与排查

  1. 规则不生效
    • 检查规则顺序:-A 追加的规则可能被前面的规则覆盖,建议用 -I 插入到链的开头。
    • 检查默认策略:若默认策略为 ACCEPT,未匹配的规则会被允许,需设置为 DROP
  2. 日志查看
    • LOG 动作记录的日志在 /var/log/messages/var/log/secure 中。
    • dmesg 命令可查看内核级别的 iptables 日志。
  3. 端口映射失败
    • 确保内核转发已开启:echo 1 > /proc/sys/net/ipv4/ip_forward(永久生效需修改 /etc/sysctl.conf)。
    • 检查 nat 表规则是否正确,尤其是 PREROUTINGPOSTROUTING 链的顺序。

欢迎关注我的其它发布渠道