iptables 规则详解:Linux 防火墙完全指南

iptables 规则详解:Linux 防火墙完全指南

概述

iptables 是 Linux 系统中最经典、功能最强大的防火墙工具之一。它基于 Netfilter 框架,提供了包过滤、网络地址转换(NAT)和端口转发等核心功能。本文将深入讲解 iptables 规则的配置方法、最佳实践和常见应用场景。

iptables 基础架构

四大表(Tables)

iptables 包含四个内置表,每个表负责不同的功能:

表名 功能描述
filter 默认表,负责数据包过滤(ACCEPT/DROP/REJECT)
nat 网络地址转换,用于修改源/目标地址
mangle 修改数据包服务质量(TOS)和标记
raw 用于配置数据包跟踪,实现不跟踪特定流量

五大连链(Chains)

每个表包含不同的链,数据包流经的顺序如下:

PREROUTING → INPUT → FORWARD → OUTPUT → POSTROUTING
     ↓          ↓           ↓          ↓
   NAT       本地进程    转发流量    本地发出
  • PREROUTING:数据包进入时首先处理的链(DNAT在此)
  • INPUT:目标为本机的数据包
  • FORWARD:需要转发的数据包
  • OUTPUT:本机发出的数据包
  • POSTROUTING:数据包离开前最后处理的链(SNAT/MASQUERADE在此)

常用命令语法

基本操作

# 查看规则
iptables -L -n -v          # 列出所有规则(数字格式,显示计数)
iptables -L INPUT -n       # 查看INPUT链规则
iptables -t nat -L -n      # 查看NAT表规则

# 清空规则
iptables -F                # 清空所有链的规则
iptables -X                # 删除所有用户自定义链
iptables -Z                # 清零计数器

# 设置默认策略
iptables -P INPUT DROP     # INPUT链默认拒绝
iptables -P FORWARD DROP   # FORWARD链默认拒绝
iptables -P OUTPUT ACCEPT  # OUTPUT链默认允许

规则匹配条件

参数 说明
-p 协议(tcp/udp/icmp)
-s 源IP地址
-d 目标IP地址
--sport 源端口
--dport 目标端口
-i 输入接口(eth0/wlan0)
-o 输出接口
-m state --state 连接状态(NEW/ESTABLISHED/RELATED)

目标动作

动作 说明
ACCEPT 接受数据包
DROP 直接丢弃(不通知发送方)
REJECT 拒绝并返回错误响应
LOG 记录日志
SNAT 源地址转换
DNAT 目标地址转换

实战场景

1. 基础防护规则集

# 清空现有规则
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(端口22)
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

# 允许ICMP(ping)
iptables -A INPUT -p icmp -j ACCEPT

# 记录被拒绝的连接(可选)
iptables -A INPUT -j LOG --log-prefix "DROPPED: "

2. 端口范围匹配

# 允许端口范围 10000-20000
iptables -A INPUT -p tcp --dport 10000:20000 -j ACCEPT

# 使用 multiport 模块匹配多个离散端口
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

3. IP地址限制

# 只允许特定IP访问SSH
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

# 允许整个网段
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# 拒绝特定IP
iptables -A INPUT -s 10.0.0.5 -j DROP

4. 速率限制(防DDoS)

# 限制SSH连接速率:每秒最多3个新连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW 
         -m recent --set --name SSH

iptables -A INPUT -p tcp --dport 22 -m state --state NEW 
         -m recent --update --seconds 60 --hitcount 4 
         --name SSH -j DROP

# 限制ICMP速率
iptables -A INPUT -p icmp --icmp-type echo-request 
         -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

5. NAT 配置

SNAT(源地址转换)

# 内网主机访问外网时修改源地址
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT 
         --to-source 203.0.113.50

MASQUERADE(动态SNAT)

# 适用于动态IP(如PPPoE拨号)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

DNAT(端口转发)

# 将外部访问的8080端口转发到内网服务器80端口
iptables -t nat -A PREROUTING -p tcp --dport 8080 
         -j DNAT --to-destination 192.168.1.10:80

# 同时需要允许转发
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT

6. 自定义链

# 创建自定义链
iptables -N WEB_SERVER

# 在自定义链中添加规则
iptables -A WEB_SERVER -p tcp --dport 80 -j ACCEPT
iptables -A WEB_SERVER -p tcp --dport 443 -j ACCEPT

# 从主链跳转到自定义链
iptables -A INPUT -j WEB_SERVER

规则持久化

iptables 规则默认重启后失效,需要持久化保存:

Ubuntu/Debian

apt install iptables-persistent
netfilter-persistent save

CentOS/RHEL

yum install iptables-services
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables

通用方法

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

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

调试技巧

# 启用内核日志
echo 1 > /proc/sys/net/netfilter/nf_log_all_netbios_names

# 查看内核日志
dmesg | grep -i "DROPPED"
journalctl -k | grep "iptables"

# 使用 tcpdump 抓包分析
tcpdump -i eth0 -n port 22

# 查看连接跟踪
cat /proc/net/nf_conntrack

最佳实践

  1. 默认拒绝原则:先设置默认DROP,再逐步添加允许规则
  2. 规则顺序很重要:iptables 从上到下匹配,第一条匹配的规则生效
  3. 使用连接状态跟踪:优先使用 -m state --state ESTABLISHED,RELATED
  4. 限制管理端口:SSH等管理端口应限制源IP
  5. 定期审计规则:使用 iptables -L -n -v 检查规则计数
  6. 备份规则集:修改前务必备份当前规则

常见问题排查

问题 可能原因 解决方案
无法SSH连接 INPUT链规则错误 检查SSH端口是否被允许
网页无法访问 FORWARD链未配置 检查转发规则
NAT不生效 未开启IP转发 sysctl -w net.ipv4.ip_forward=1
规则不生效 规则顺序错误 使用 -I 插入到链头

总结

iptables 虽然学习曲线较陡,但功能强大且灵活。掌握其核心概念(表、链、规则匹配)后,可以应对绝大多数网络安全需求。对于更复杂的需求,可以考虑升级到 nftables(iptables 的继任者),但 iptables 在现有系统中仍然广泛使用。


提示:修改 iptables 规则时,建议先通过 SSH 测试新规则,或设置定时恢复脚本,防止锁死服务器。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容