iptables
iptables 是 Linux 内核中用于管理网络包过滤的工具,通过定义规则(rules)控制网络流量。它是 Linux 防火墙体系的核心组件之一,广泛用于网络安全防护、端口转发、流量控制等场景。
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
+
|
v
+-------------+ +------------------+
|table: filter| <---+ | table: nat |
|chain: INPUT | | | chain: PREROUTING|
+-----+-------+ | +--------+---------+
| | |
v | v
[local process] | **************** +--------------+
| +---------+ Routing decision +------> |table: filter |
v **************** |chain: FORWARD|
**************** +------+-------+
Routing decision |
**************** |
| |
v **************** |
+-------------+ +------> Routing decision <---------------+
|table: nat | | ****************
|chain: OUTPUT| | +
+-----+-------+ | |
| | v
v | +-------------------+
+--------------+ | | table: nat |
|table: filter | +----+ | chain: POSTROUTING|
|chain: OUTPUT | +--------+----------+
+--------------+ |
v
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
一、iptables 的基本概念
1. iptables 的组成结构
iptables 的规则系统由 表(tables)、链(chains)、规则(rules) 三部分组成:
二、iptables 的表(Tables)
iptables 支持四种主要表,每种表对应不同的网络处理阶段:
三、iptables 的链(Chains)
每个表中预定义了若干链,用于处理特定类型的流量:
1. filter 表中的链
2. nat 表中的链
3. mangle 表中的链
四、iptables 的规则结构
每条规则由 匹配条件(match) 和 目标动作(target) 组成:
iptables -A 链名 [匹配条件] -j [目标动作]
1. 匹配条件(match)
基本匹配:IP 地址、端口、协议(如
-p tcp
)状态匹配:
--state ESTABLISHED
(已建立的连接)扩展匹配:使用
-m
指定模块(如-m limit
限制速率)连接跟踪:
--syn
(SYN 报文)、--connlimit
(连接数限制)
2. 目标动作(target)
ACCEPT:允许数据包通过
DROP:丢弃数据包(无响应)
REJECT:拒绝数据包并返回错误(如 TCP RST)
REDIRECT:将数据包重定向到本机其他端口(用于端口转发)
MASQUERADE:动态地址转换(SNAT 的简化形式)
DNAT:目标地址转换(用于端口映射)
SNAT:源地址转换(用于多宿主主机)
五、iptables 的常用命令
1. 查看规则
# 查看所有规则(数字格式 + 详细信息)
iptables -L -n -v
# 查看 nat 表的规则
iptables -L -t nat
2. 添加规则
# 允许 80 端口入站
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 拒绝所有非 ESTABLISHED 的连接
iptables -A INPUT -m state --state ! ESTABLISHED -j DROP
3. 删除规则
# 通过匹配条件删除规则
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
# 通过编号删除规则
iptables -D INPUT 1 # 删除 INPUT 链的第 1 条规则
4. 保存和恢复规则
# 保存规则(不同发行版可能不同)
iptables-save > /etc/iptables/rules.v4
# 恢复规则
iptables-restore < /etc/iptables/rules.v4
六、iptables 的进阶用法
1. NAT 配置(端口转发)
# 将外部访问 8080 端口的流量转发到本地 80 端口
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80
2. 限制连接数
# 限制每个 IP 只能建立 5 个 SSH 连接
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 5 -j DROP
3. 日志记录
# 记录所有被 DROP 的数据包
iptables -A INPUT -j LOG --log-prefix "DROPPED: " --log-level 4
4. 伪装源地址(MASQUERADE)
# 用于多宿主主机的 SNAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
七、iptables 的性能优化
1. 规则顺序优化
将常用的允许规则(如 ESTABLISHED)放在最前面
将拒绝规则(DROP)放在最后
2. 避免使用通配符
避免使用
--match anything
,使用具体匹配条件(如 IP、端口)
3. 使用扩展模块
使用
limit
模块限制速率,避免 DoS 攻击使用
conntrack
模块优化连接跟踪
八、iptables 与 nftables 的比较
注意:iptables 是 nftables 的兼容层,未来可能被完全取代。
九、iptables 的安全实践
设置默认策略
iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP
防御 DoS 攻击
# 限制每秒连接数 iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s -j ACCEPT
使用状态检测
# 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
十、常见问题与解决方案
1. 规则生效后无法访问网络
检查
OUTPUT
链是否允许流量确保
POSTROUTING
链的 SNAT 配置正确
2. 端口转发无效
检查
PREROUTING
和POSTROUTING
链的规则确保目标主机监听了对应端口
3. 规则未持久化
确认规则保存到
/etc/iptables/rules.v4
启用 iptables 服务(如
systemctl enable iptables
)
十一、总结
iptables 是 Linux 网络防火墙的核心工具,通过灵活的规则配置可以实现强大的网络控制。掌握其表、链、规则的结构,结合实际场景(如端口转发、流量限制、安全防护),可以有效提升系统的安全性与稳定性。对于现代 Linux 系统,建议逐步过渡到 nftables 以获得更好的性能和功能支持。
Comment