本文系统讲解Linux iptables防火墙的工作原理、四表五链、规则配置,以及生产环境最佳实践。

前言

服务器暴露在公网上,每时每刻都在被扫描、被攻击。防火墙是服务器安全的第一道防线。

iptables是Linux系统最经典的防火墙工具,虽然现在有了nftables和firewalld,但iptables的概念和用法依然是基础中的基础。

今天我们来彻底搞懂它。


一、iptables工作原理

1.1 Netfilter框架

iptables只是一个用户态的管理工具,真正干活的是内核中的Netfilter框架。

┌─────────────────────────────────────────────────────────┐
│                      用户空间                           │
│    ┌─────────────────────────────────────────────┐     │
│    │              iptables命令                    │     │
│    └─────────────────────┬───────────────────────┘     │
└──────────────────────────┼──────────────────────────────┘
                           │ Netlink
┌──────────────────────────┼──────────────────────────────┐
│                          ↓         内核空间             │
│    ┌─────────────────────────────────────────────┐     │
│    │              Netfilter框架                   │     │
│    │   ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐  │     │
│    │   │PRERT│→│INPUT│ │FORWD│ │OUTPT│→│POSTRT│ │     │
│    │   └─────┘ └─────┘ └─────┘ └─────┘ └─────┘  │     │
│    └─────────────────────────────────────────────┘     │
└─────────────────────────────────────────────────────────┘

1.2 四表五链

五条链(Chain)- 数据包流经的检查点:

作用 触发时机
PREROUTING 路由前处理 数据包刚进入,还没决定去向
INPUT 入站处理 数据包目标是本机
FORWARD 转发处理 数据包需要转发到其他主机
OUTPUT 出站处理 本机产生的数据包
POSTROUTING 路由后处理 数据包即将离开

四张表(Table)- 不同的功能分类:

作用 包含的链
raw 连接跟踪豁免 PREROUTING, OUTPUT
mangle 修改数据包 全部五条链
nat 地址转换 PREROUTING, INPUT, OUTPUT, POSTROUTING
filter 过滤数据包 INPUT, FORWARD, OUTPUT

优先级:raw → mangle → nat → filter

1.3 数据包流向

                              ┌─────────────┐
                              │   本机进程   │
                              └──────┬──────┘
                                     │
                           ┌─────────┴─────────┐
                           ↓                   ↑
                        INPUT               OUTPUT
                           ↑                   │
                           │                   ↓
    ┌──────┐        ┌──────┴──────┐     ┌─────┴─────┐        ┌──────┐
    │ 入站 │───────→│   路由决策   │     │  路由决策  │←──────│ 出站 │
    │      │        └──────┬──────┘     └─────┬─────┘        │      │
    └──────┘               │                  │              └──────┘
        ↑                  ↓                  ↓                  │
    PREROUTING          FORWARD          POSTROUTING             │
        │                  │                  │                  │
        │                  └─────────────────→│                  │
        │                                     ↓                  │
        └────────────────────────────────────────────────────────┘

二、iptables基本语法

2.1 命令格式

iptables [-t 表名] 命令 链名 [匹配条件] [-j 动作]

2.2 常用命令

# 查看规则
iptables -L                    # 查看filter表
iptables -L -n -v              # 详细信息,不解析域名
iptables -t nat -L             # 查看nat表
iptables -L --line-numbers     # 显示规则编号

# 添加规则
iptables -A INPUT ...          # 追加到末尾
iptables -I INPUT 1 ...        # 插入到第1条

# 删除规则
iptables -D INPUT 3            # 删除第3条
iptables -D INPUT -s 1.2.3.4 -j DROP  # 删除匹配的规则

# 清空规则
iptables -F                    # 清空所有规则
iptables -F INPUT              # 清空INPUT链

# 设置默认策略
iptables -P INPUT DROP         # 默认拒绝入站
iptables -P OUTPUT ACCEPT      # 默认允许出站

2.3 匹配条件

# 源/目标地址
-s 192.168.1.0/24              # 源地址
-d 10.0.0.1                    # 目标地址

# 协议
-p tcp                         # TCP协议
-p udp                         # UDP协议
-p icmp                        # ICMP协议

# 端口(需配合-p使用)
--dport 80                     # 目标端口
--sport 1024:65535             # 源端口范围
-m multiport --dports 80,443   # 多个端口

# 网卡
-i eth0                        # 入站网卡
-o eth1                        # 出站网卡

# 状态匹配
-m state --state NEW,ESTABLISHED,RELATED

# 连接数限制
-m connlimit --connlimit-above 10

# 速率限制
-m limit --limit 10/s --limit-burst 20

2.4 动作(Target)

动作 说明
ACCEPT 允许通过
DROP 丢弃,不响应
REJECT 拒绝,返回错误
LOG 记录日志
SNAT 源地址转换
DNAT 目标地址转换
MASQUERADE 动态源地址转换
REDIRECT 端口重定向

三、实战配置案例

3.1 基础服务器防护

#!/bin/bash
# 服务器基础防火墙配置

# 清空现有规则
iptables -F
iptables -X
iptables -Z

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

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

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

# 允许SSH(限制来源IP更安全)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许ping(可选)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 记录被丢弃的包(调试用)
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4

# 保存规则
iptables-save > /etc/iptables.rules

3.2 NAT网关配置

# 场景:服务器作为内网网关,内网机器通过它上网

# 开启IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# SNAT:内网出去时替换源IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# 允许转发
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

3.3 端口转发

# 将外网80端口转发到内网服务器的8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.100:8080
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 8080 -j ACCEPT

# 本机端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

3.4 防止DDoS攻击

# 限制新连接速率
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# 限制单IP连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP

# 防止SYN洪水
iptables -A INPUT -p tcp --syn -m recent --name syn_flood --set
iptables -A INPUT -p tcp --syn -m recent --name syn_flood --update --seconds 1 --hitcount 20 -j DROP

四、规则持久化

4.1 保存与恢复

# 保存当前规则
iptables-save > /etc/iptables.rules

# 恢复规则
iptables-restore < /etc/iptables.rules

4.2 开机自动加载

方法1:systemd服务

# /etc/systemd/system/iptables-restore.service
[Unit]
Description=Restore iptables rules
Before=network-pre.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables.rules

[Install]
WantedBy=multi-user.target
systemctl enable iptables-restore

方法2:使用iptables-persistent(Debian/Ubuntu)

apt install iptables-persistent
# 安装时会询问是否保存当前规则

# 之后保存规则
netfilter-persistent save

五、与组网软件的配合

当使用组网软件(如星空组网)建立虚拟局域网后,会创建虚拟网卡,需要配置相应的防火墙规则:

# 假设组网软件创建的虚拟网卡是tun0,虚拟网段是10.10.0.0/24

# 允许组网虚拟网卡的流量
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT

# 如果需要通过组网访问内网其他服务
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT

# 针对组网IP开放特定服务
iptables -A INPUT -s 10.10.0.0/24 -p tcp --dport 22 -j ACCEPT

这样配置后,只有通过组网连接的设备才能访问SSH,公网无法直接连接,安全性更高。


六、调试与排错

6.1 查看连接跟踪

# 查看当前连接
cat /proc/net/nf_conntrack
conntrack -L

# 清除连接跟踪
conntrack -F

6.2 查看计数器

iptables -L -v -n
# 查看每条规则匹配了多少包/字节

# 清零计数器
iptables -Z

6.3 日志分析

# 添加日志规则
iptables -A INPUT -j LOG --log-prefix "IPT: " --log-level 4

# 查看日志
tail -f /var/log/kern.log | grep "IPT:"
# 或
dmesg | grep "IPT:"

七、nftables简介

iptables的继任者是nftables,语法更现代化:

# nftables等价配置示例
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input iif lo accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input tcp dport 22 accept

新系统建议使用nftables,但iptables的概念是相通的。


八、总结

iptables核心知识点:

  1. 四表五链:理解数据包流向是基础
  2. 匹配+动作:规则的核心结构
  3. 顺序重要:规则从上到下匹配,先匹配先生效
  4. 默认策略:生产环境建议默认DROP
  5. 状态匹配:ESTABLISHED,RELATED提高效率
  6. 持久化:规则要保存,不然重启就没了

安全建议

  • 只开放必要的端口
  • SSH建议限制来源IP或使用组网访问
  • 定期审查规则
  • 配合fail2ban等工具

参考资料

  1. Linux man pages: iptables(8)
  2. Netfilter官方文档
  3. 《Linux防火墙》- Steve Suehring

💡 实践建议:先在测试环境练习,规则写错可能把自己锁在外面。建议保留一个后门(比如通过组网软件访问),以防万一。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐