2.5.2 iptables基本原理与规则结构
iptables基本原理与规则结构#
iptables概述与工作方式#
iptables 是 Linux 内核 Netfilter 的用户态管理工具,通过规则匹配对数据包进行过滤、修改与转发。其工作流程基于“表(table)—链(chain)—规则(rule)”模型,数据包在进入、转发、输出等路径上依次经过指定的链。
原理草图(包路径与表/链)
安装与服务检查(以 RHEL/CentOS 7 为例)#
iptables 不是服务,而是命令工具;旧版本系统需要安装 iptables-services。
# 安装 iptables 工具及持久化服务(CentOS 7)
sudo yum install -y iptables-services
# 停用 firewalld(避免冲突)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 启用 iptables 服务(提供规则持久化)
sudo systemctl enable iptables
sudo systemctl start iptables
# 查看当前规则
sudo iptables -L -n -v
命令解释
- iptables -L -n -v:-L 列表,-n 不解析域名,-v 显示命中计数与接口。
表与链的对应关系#
常见表类型与用途:
- filter:默认表,用于包过滤(ACCEPT/DROP/REJECT)
- nat:地址转换(SNAT/DNAT/MASQUERADE)
- mangle:修改数据包标记与字段
- raw:连接跟踪前处理(NOTRACK)
常用内置链:
- INPUT:进入本机的数据包
- OUTPUT:从本机发出的数据包
- FORWARD:经过本机转发的数据包
- PREROUTING:路由决策前处理
- POSTROUTING:路由决策后处理
示例:查看 NAT 表与 PREROUTING 链
sudo iptables -t nat -L PREROUTING -n -v
-t nat:指定表PREROUTING:指定链
规则结构与匹配流程#
规则由匹配条件与动作组成,按照链内顺序从上到下匹配:
- 匹配条件:源/目的IP、端口、协议、接口、状态等
- 动作(target):ACCEPT、DROP、REJECT、LOG、DNAT、SNAT等
示例:放行 SSH 与已建立连接
# 1) 允许已建立/关联连接返回流量
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 2) 允许来自管理网段的 SSH
sudo iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# 3) 其他入站全部拒绝
sudo iptables -P INPUT DROP
# 4) 查看规则命中
sudo iptables -L INPUT -n -v --line-numbers
命令解释
- -A INPUT:追加规则到 INPUT 链尾
- -p tcp:匹配 TCP 协议
- --dport 22:匹配目的端口
- -m conntrack --ctstate:连接跟踪模块与状态匹配
- -P INPUT DROP:设置链默认策略
连接跟踪与状态匹配#
常见状态:
- NEW:新连接
- ESTABLISHED:已建立连接
- RELATED:关联连接(如 FTP 数据通道)
- INVALID:无效连接
示例:拒绝无效包并记录日志
# 记录无效包(限速避免日志风暴)
sudo iptables -A INPUT -m conntrack --ctstate INVALID -m limit --limit 5/min -j LOG --log-prefix "IPT INVALID: "
# 丢弃无效包
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
规则管理、持久化与查看要点#
常用查看方式:
- iptables -L -n -v:查看规则与命中计数
- iptables -t nat -L -n:查看 NAT 表规则
规则备份与恢复(iptables-services)
# 备份当前规则
sudo iptables-save > /etc/sysconfig/iptables
# 恢复规则
sudo iptables-restore < /etc/sysconfig/iptables
# 重启服务加载规则
sudo systemctl restart iptables
规则排序示例:允许优先,拒绝兜底
# 插入到第1条(高优先级)
sudo iptables -I INPUT 1 -p icmp -j ACCEPT
# 查看序号
sudo iptables -L INPUT -n --line-numbers
综合示例:最小可用防火墙规则(Web 服务器)#
目标:允许本机 SSH、HTTP/HTTPS、已建立连接,其他拒绝。
# 清空旧规则
sudo iptables -F
sudo iptables -t nat -F
# 默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 允许回包
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT
# 允许管理网段 SSH
sudo iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# 允许 Web
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
# 查看
sudo iptables -L -n -v
# 持久化
sudo iptables-save > /etc/sysconfig/iptables
常见排错方法#
1) 规则生效但访问失败
# 查看命中计数与顺序
sudo iptables -L INPUT -n -v --line-numbers
# 临时放行测试(插入高优先级)
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
排查要点:规则顺序、默认策略、连接状态、是否被更前面的规则拦截。
2) SSH 被误封恢复
# 从控制台登录后清空 INPUT 链
sudo iptables -F INPUT
# 或将默认策略改为 ACCEPT
sudo iptables -P INPUT ACCEPT
3) NAT 未生效
# 检查 IP 转发
sysctl net.ipv4.ip_forward
sudo sysctl -w net.ipv4.ip_forward=1
# 查看 NAT 表
sudo iptables -t nat -L -n -v
练习#
1) 编写一组规则,只允许 10.0.0.0/24 访问 22 端口,其他来源全部拒绝。
2) 配置一条规则对访问 80 端口的包进行日志记录(限速)。
3) 写出一条 DNAT 规则,将外网 8080 转发到内网 192.168.1.10:80,并验证命中计数变化。