返回

iptables详解:从入门到实战,轻松掌握Linux防火墙

看似复杂的iptables,不过是纸老虎罢了 iptables作为Linux系统中最经典的防火墙工具,是每个运维人员和技术爱好者必须掌握的技能。即使在firewalld和ufw等新工具流行的今天,iptables依然在容器网络、端口转发等场景中发挥着不可替代的作用。

什么是iptables?

iptables是Linux内核提供的防火墙解决方案,工作在网络层和传输层,通过对数据包进行过滤、转发和地址转换来保护系统安全。它实际上是用户空间的一个工具,用于配置内核中的netfilter框架。

为什么还要学习iptables? 虽然现代Linux系统默认使用firewalld(RedHat系列)或ufw(Ubuntu),但iptables仍然是许多高级网络功能的基础。Docker等容器技术直接使用iptables规则实现网络隔离和端口映射,了解iptables能让你更深入理解系统网络安全原理。

核心概念:四表五链

理解iptables的关键在于掌握其"四表五链"架构。

四个表(功能分类)

表名主要功能优先级
filter数据包过滤(ACCEPT/DROP)
nat网络地址转换(SNAT/DDNAT)
mangle修改数据包内容(TTL、TOS等)
raw连接跟踪处理最高

五个链(规则挂载点)

链名触发时机可用表
PREROUTING数据包进入路由决策前raw, mangle, nat
INPUT目标为本机的数据包mangle, filter
FORWARD需要转发的数据包mangle, filter
OUTPUT本机产生的数据包raw, mangle, nat, filter
POSTROUTING数据包离开路由决策后mangle, nat

数据包流向流程

数据包 → PREROUTING → 路由判断 → 目标为本机?→ INPUT → 本机应用
    ↓ 目标为其他机器?
    └─ FORWARD → POSTROUTING → 出口

iptables基本语法

iptables命令的基本格式为:

Bash
iptables [-t 表名] 命令选项 [链名] [匹配条件] [-j 目标动作]

常用命令选项

命令说明示例
-A在链尾追加规则iptables -A INPUT -p tcp --dport 80 -j ACCEPT
-I在链首或指定位置插入规则iptables -I INPUT 2 -s 192.168.1.0/24 -j ACCEPT
-D删除规则iptables -D INPUT 3(按序号)
-L查看规则iptables -L -n -v
-F清空规则iptables -F INPUT
-P设置默认策略iptables -P INPUT DROP
-R替换规则iptables -R INPUT 1 -p tcp --dport 22 -j ACCEPT

常用匹配条件

  • -p:协议(tcp、udp、icmp等)
  • -s:源IP地址或网段
  • -d:目标IP地址或网段
  • --sport/--dport:源端口/目标端口
  • -i/-o:输入/输出网络接口

常用处理动作(-j)

  • ACCEPT:允许数据包通过
  • DROP:丢弃数据包(无响应)
  • REJECT:拒绝数据包(返回错误信息)
  • SNAT:源地址转换
  • DNAT:目标地址转换
  • LOG:记录日志(不处理数据包)

实战配置示例

1. 基础防火墙配置

配置一个安全的服务器防火墙,遵循"默认拒绝,按需开放"原则:

Bash
# 设置默认策略(谨慎操作,先确保SSH连接不会断开)
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),限制来源IP更安全
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 开放Web服务端口
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 8 -j ACCEPT

2. 精准访问控制

Bash
# 只允许特定网段访问SSH
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

# 拒绝特定IP访问
iptables -A INPUT -s 10.0.0.100 -j DROP

# 开放端口范围
iptables -A INPUT -p tcp --dport 8000:9000 -j ACCEPT

# 多端口开放(SSH、HTTP、HTTPS)
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT

3. NAT和端口转发

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

# 共享上网(SNAT)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# 端口映射(DNAT):将公网IP的8080端口映射到内网服务器的80端口
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

4. 安全加固与防攻击

Bash
# 限制SSH连接频率(防暴力破解)
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 3 -j ACCEPT

# 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT

# 记录异常连接尝试
iptables -A INPUT -p tcp --dport 22 -m limit --limit 1/s -j LOG --log-prefix "SSH attempt: "

规则管理技巧

查看规则技巧

Bash
# 查看规则并显示行号(便于删除)
iptables -L -n --line-numbers

# 查看特定表的规则
iptables -t nat -L -n -v

# 查看详细信息和计数器
iptables -L -n -v

规则保存与恢复

CentOS/RHEL系统:

Bash
# 保存规则
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables

# 重启后自动加载
chkconfig iptables on

Ubuntu/Debian系统:

Bash
# 安装持久化工具
apt-get install iptables-persistent

# 保存规则
netfilter-persistent save
# 或
iptables-save > /etc/iptables/rules.v4

常见问题与注意事项

  1. 规则顺序很重要:iptables从上到下匹配,第一条匹配的规则生效。建议将具体规则放在前面,通用规则放在后面。
  2. 谨慎设置默认DROP:设置iptables -P INPUT DROP前,务必先放行SSH连接,否则可能导致无法远程连接服务器。
  3. 保存规则:使用service iptables save或iptables-save保存规则,否则重启后配置会丢失。
  4. 连接状态跟踪:合理使用-m state --state ESTABLISHED,RELATED可以大大简化规则配置,提高安全性。
  5. 测试规则:在生产环境修改规则前,先准备好恢复方案,比如准备一条定时恢复的脚本,防止被锁在服务器外。

进阶功能

自定义链管理

Bash
# 创建自定义链
iptables -N MY_CHAIN

# 向自定义链添加规则
iptables -A MY_CHAIN -s 192.168.1.0/24 -j ACCEPT

# 从默认链跳转到自定义链
iptables -A INPUT -j MY_CHAIN

# 删除自定义链(需先清空规则)
iptables -X MY_CHAIN

日志记录与分析

Bash
# 记录HTTP访问日志
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP: " --log-level 4

# 查看日志
tail -f /var/log/messages | grep 'HTTP: '

总结

iptables虽然学习曲线较陡,但一旦掌握其核心概念和基本操作,就能灵活应对各种网络安全管理需求。关键是要理解四表五链的架构数据包流向,记住规则匹配的顺序性,并养成及时保存规则的好习惯。

对于新系统,可以考虑使用nftables作为iptables的替代方案,但掌握iptables仍是理解Linux网络安全的基石。

首页分类标签