iptables 防火墙详解与实用配置指南
iptables 防火墙详解与实用配置指南
iptables 是 Linux 系统上功能强大的防火墙工具,基于内核的 netfilter 框架实现,用于过滤网络数据包、配置网络地址转换(NAT)和端口转发等。本文将详细介绍 iptables 的基本概念、常用命令和实用配置示例。
一、iptables 基础概念
1. 表(Tables)
iptables 包含 5 种内置表,每种表用于不同的网络功能:
- filter 表:默认表,用于数据包过滤(最常用)
- nat 表:用于网络地址转换(端口转发、IP 伪装等)
- mangle 表:用于修改数据包的服务类型、TTL 等标记
- raw 表:用于处理未被连接跟踪的数据包
- security 表:用于强制访问控制(MAC)网络规则
2. 链(Chains)
每个表包含若干预设的链(数据包处理流程):
- filter 表:INPUT(入站)、OUTPUT(出站)、FORWARD(转发)
- nat 表:PREROUTING(路由前)、POSTROUTING(路由后)、OUTPUT(出站)
- 其他表:包含与 filter 表类似的链结构
3. 规则(Rules)
规则是链中的具体指令,包含:
- 匹配条件:如源 IP、目标端口、协议类型等
- 目标动作:如 ACCEPT(允许)、DROP(丢弃)、REJECT(拒绝并回复)等
二、基本操作命令
1. 查看规则
# 查看默认 filter 表的所有规则
iptables -L# 查看规则并显示 IP 地址和端口的数字形式(不解析域名)
iptables -L -n# 查看规则并显示详细信息(包括数据包计数)
iptables -L -n -v# 查看指定表(如 nat 表)的规则
iptables -t nat -L -n# 查看指定链(如 INPUT 链)的规则
iptables -L INPUT -n -v
2. 清除规则
# 清除所有表的所有规则
iptables -F# 清除指定表(如 nat 表)的规则
iptables -t nat -F# 清除指定链(如 INPUT 链)的规则
iptables -F INPUT# 重置数据包计数器
iptables -Z
iptables -t nat -Z
3. 添加规则
# 基本语法
iptables [-t 表名] -A 链名 [匹配条件] -j 目标动作# 示例:允许来自 192.168.1.100 的所有流量
iptables -A INPUT -s 192.168.1.100 -j ACCEPT# 示例:允许 SSH 连接(22 端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 示例:允许 HTTP(80)和 HTTPS(443)连接
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 -m state --state ESTABLISHED,RELATED -j ACCEPT
4. 删除规则
# 方法 1:按规则序号删除(先使用 --line-numbers 查看序号)
iptables -L INPUT --line-numbers
iptables -D INPUT 2 # 删除 INPUT 链中序号为 2 的规则# 方法 2:按规则内容删除(与添加规则的格式相同,将 -A 改为 -D)
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
5. 设置默认策略
# 设置 INPUT 链默认策略为 DROP(拒绝所有未匹配的入站流量)
iptables -P INPUT DROP# 设置 FORWARD 链默认策略为 DROP(不允许转发)
iptables -P FORWARD DROP# 设置 OUTPUT 链默认策略为 ACCEPT(允许所有出站流量)
iptables -P OUTPUT ACCEPT
三、常用匹配条件
1. 基本匹配条件
-s 192.168.1.0/24 # 源 IP 地址或网段
-d 10.0.0.5 # 目标 IP 地址
-p tcp # 协议类型(tcp/udp/icmp)
--sport 1024:65535 # 源端口(可以指定范围)
--dport 80 # 目标端口
-i eth0 # 入站接口
-o eth0 # 出站接口
2. 扩展匹配条件(需要 -m 模块)
# 状态匹配(state 模块)
-m state --state ESTABLISHED,RELATED# 多端口匹配(multiport 模块)
-m multiport --dports 80,443,22# IP 范围匹配(iprange 模块)
-m iprange --src-range 192.168.1.100-192.168.1.200# 速率限制(limit 模块)
-m limit --limit 10/min --limit-burst 20
四、实用配置示例
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 连接
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 --icmp-type echo-request -j ACCEPT
2. 端口转发配置(nat 表)
# 允许内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward# 将本机 8080 端口转发到 192.168.1.100 的 80 端口
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80# 配置源地址转换(SNAT),使内部服务能正常响应
iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 80 -j SNAT --to-source 本机公网IP
3. 限制连接速率(防止 DoS 攻击)
# 限制 SSH 连接速率(每分钟最多 10 个新连接)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \-m limit --limit 10/min --limit-burst 3 -j ACCEPT# 超过限制的连接直接丢弃
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP
4. IP 伪装(共享上网)
# 允许内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward# 配置 IP 伪装(将内网 IP 转换为外网接口 IP)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
五、规则的保存与恢复
1. 保存规则
# Debian/Ubuntu 系统
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6# CentOS/RHEL 系统
service iptables save
2. 恢复规则
# Debian/Ubuntu 系统
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6# CentOS/RHEL 系统
service iptables restart
3. 设置开机自动加载
# Debian/Ubuntu 系统:安装 iptables-persistent
sudo apt-get install iptables-persistent# CentOS/RHEL 系统:确保 iptables 服务开机启动
sudo chkconfig iptables on
六、常见问题解决
-
配置后无法 SSH 连接
# 紧急情况下清除所有规则恢复连接 iptables -F iptables -P INPUT ACCEPT
-
允许特定 IP 访问所有端口
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
-
查看规则计数器(判断规则是否生效)
iptables -L -n -v
-
删除自定义链
iptables -X 链名
iptables 是一个非常强大的工具,掌握它需要一定的网络知识和实践经验。建议在配置防火墙时先在测试环境验证,再应用到生产系统,避免因规则配置不当导致网络中断。