iptables 防火墙配置指南
目录
- [1. 防火墙概述](#1. 防火墙概述 "#1-%E9%98%B2%E7%81%AB%E5%A2%99%E6%A6%82%E8%BF%B0")
- [2. iptables 核心概念](#2. iptables 核心概念 "#2-iptables-%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5")
- [3. 环境准备](#3. 环境准备 "#3-%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87")
- [4. filter表规则配置](#4. filter表规则配置 "#4-filter%E8%A1%A8%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE")
- [5. nat表配置](#5. nat表配置 "#5-nat%E8%A1%A8%E9%85%8D%E7%BD%AE")
- [6. 规则保存与恢复](#6. 规则保存与恢复 "#6-%E8%A7%84%E5%88%99%E4%BF%9D%E5%AD%98%E4%B8%8E%E6%81%A2%E5%A4%8D")
- [7. 实战案例](#7. 实战案例 "#7-%E5%AE%9E%E6%88%98%E6%A1%88%E4%BE%8B")
1. 防火墙概述
1.1 防火墙种类
硬件防火墙
- 适用场景:整个企业入口
- 厂商 :
- 三层路由:H3C、华为、Cisco(思科)
- 深信服
- Juniper
软件防火墙
- 适用场景:开源软件、网站内部、封IP
- 类型 :
- iptables:写入Linux内核,服务于Docker
- firewalld:CentOS 7 默认
云防火墙
- 阿里云:安全组
- 腾讯云:安全组
- AWS:Security Groups
1.2 核心概念理解
| 概念层级 | 名称 | 比喻 | 说明 |
|---|---|---|---|
| Netfilter | 容器 | 一栋楼 | Linux内核网络框架 |
| 表(tables) | 存放链的容器 | 楼里的房子 | 不同功能分类 |
| 链(chains) | 存放规则的容器 | 房子里的柜子 | 数据包处理流程 |
| 规则(Policy) | 准许或拒绝规则 | 柜子里衣服的摆放规则 | 具体的过滤条件 |
2. iptables 核心概念
2.1 四表五链架构
四个表(Tables)
1. filter 表(默认表)
- 功能:主机防火墙,过滤流入流出数据包
- 应用场景:主机防火墙
| 链名称 | 功能说明 |
|---|---|
| INPUT | 过滤进入主机的数据包 |
| FORWARD | 转发流经主机的数据包(路由转发) |
| OUTPUT | 处理从主机发出的数据包 |
2. nat 表
- 功能:网络地址转换
- 应用场景 :
- 共享上网(POSTROUTING)
- IP映射(PREROUTING)
- 端口映射(PREROUTING)
| 链名称 | 功能说明 | 典型应用 |
|---|---|---|
| PREROUTING | 路由前处理,改变目标地址/端口 | 端口映射、IP映射 |
| POSTROUTING | 路由后处理,改变源地址/端口 | 共享上网(SNAT) |
| OUTPUT | 改变本机发出数据包的目标地址 | 本机数据包NAT |
3. raw 表
- 功能:决定数据包是否被状态跟踪机制处理
4. mangle 表
- 功能:修改数据包的服务类型、TTL等
五条链(Chains)
- INPUT:入站数据包处理
- OUTPUT:出站数据包处理
- FORWARD:转发数据包处理
- PREROUTING:路由前处理
- POSTROUTING:路由后处理
3. 环境准备
3.1 停止firewalld服务
bash
systemctl stop firewalld
systemctl disable firewalld
3.2 安装iptables服务
bash
# 安装iptables服务
yum install -y iptables-services
# 验证安装
rpm -qa | grep iptable
3.3 加载相关内核模块
bash
# 临时加载模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
# 写入配置文件永久生效
cat >> /etc/rc.local << EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
chmod +x /etc/rc.d/rc.local
# 验证模块加载
lsmod | egrep 'filter|nat|ipt'
3.4 启动服务
bash
# 启动并设置开机自启
systemctl enable iptables.service --now
# 检查服务状态
systemctl status iptables.service
# 查看默认规则
iptables -nL
3.5 常用参数详解
基础参数
| 参数 | 含义 | 示例 |
|---|---|---|
| -L | 显示表中的所有规则 | iptables -L |
| -n | 不反向解析IP和端口为名字 | iptables -nL |
| -t | 指定表,默认filter表 | iptables -t nat -L |
| --line-numbers | 显示规则行号 | iptables -nL --line-numbers |
操作参数
| 参数 | 含义 | 应用场景 |
|---|---|---|
| -A | append,追加规则到末尾 | 允许类规则 |
| -I | insert,插入规则到开头 | 拒绝类规则 |
| -D | delete,删除规则 | iptables -D INPUT 1 |
| -F | flush,清空所有规则 | 重置配置 |
| -P | policy,设置链的默认策略 | iptables -P INPUT DROP |
匹配条件参数
| 参数 | 含义 | 示例 |
|---|---|---|
| -p | 指定协议(tcp/udp/icmp/all) | -p tcp |
| --dport | 目标端口 | --dport 80 |
| --sport | 源端口 | --sport 1024:65535 |
| -s | 源IP地址 | -s 192.168.1.100 |
| -d | 目标IP地址 | -d 10.0.0.1 |
| -i | 进入的网卡接口 | -i eth0 |
| -o | 输出的网卡接口 | -o eth1 |
| -m | 指定扩展模块 | -m multiport |
动作参数
| 参数 | 含义 | 区别 |
|---|---|---|
| -j ACCEPT | 接受数据包 | 允许通过 |
| -j DROP | 丢弃数据包 | 静默拒绝,不返回信息 |
| -j REJECT | 拒绝数据包 | 返回拒绝信息给发送方 |
4. filter表规则配置
4.1 基础端口控制
封禁特定端口
bash
# 禁止SSH端口22
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
# 禁止HTTP端口80和HTTPS端口443
iptables -t filter -I INPUT -p tcp --dport 80 -j DROP
iptables -t filter -I INPUT -p tcp --dport 443 -j DROP
查看当前规则
bash
# 查看所有规则(带行号)
iptables -nL --line-numbers
# 查看指定表规则
iptables -t filter -nL --line-numbers
4.2 删除规则
方法一:按行号删除
bash
# 查看规则行号
iptables -nL --line-numbers
# 删除第1条规则
iptables -D INPUT 1
方法二:按规则内容删除
bash
# 添加规则
iptables -I INPUT -p tcp --dport 80 -j DROP
# 删除相同的规则
iptables -D INPUT -p tcp --dport 80 -j DROP
4.3 IP地址控制
封禁单个IP
bash
# 禁止特定IP访问
iptables -I INPUT -s 192.168.1.100 -j DROP
封禁网段
bash
# 禁止整个网段访问特定端口
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j DROP
白名单配置
方法一:使用排除符号!
bash
# 只允许特定网段访问,其他全部拒绝
iptables -I INPUT ! -s 192.168.1.0/24 -j DROP
方法二:修改默认策略
bash
# 设置允许规则
iptables -I INPUT -s 192.168.1.100 -j ACCEPT
# 修改默认策略为拒绝
iptables -P INPUT DROP
# 注意:操作完成后记得改回ACCEPT,避免锁定自己
iptables -P INPUT ACCEPT
4.4 多端口配置
连续端口范围
bash
# 禁止端口范围10000-20000
iptables -I INPUT -p tcp --dport 10000:20000 -j DROP
不连续多端口(multiport模块)
bash
# 禁止多个不连续端口
iptables -I INPUT -p tcp -m multiport --dport 80,443,8080 -j DROP
4.5 ICMP控制
了解ICMP类型
- 类型0:回显应答(ping响应)
- 类型8:回显请求(被ping)
控制ping功能
bash
# 禁止别人ping自己(禁止类型8)
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
# 检查效果
ping 目标IP # 自己仍能ping别人
系统层面控制ping
bash
# 查看当前设置
cat /proc/sys/net/ipv4/icmp_echo_ignore_all
# 永久禁止被ping
echo 'net.ipv4.icmp_echo_ignore_all=1' >> /etc/sysctl.conf
sysctl -p
4.6 连接状态匹配
bash
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
状态说明:
- NEW:新连接
- ESTABLISHED:已建立的连接
- RELATED:相关连接
- INVALID:无效连接
4.7 速率限制
bash
# ICMP速率限制示例
iptables -F
iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
参数说明:
--limit 10/minute:每分钟允许10个数据包--limit-burst 5:初始令牌桶大小为5
4.8 企业级防火墙配置模板
安全配置示例
bash
#!/bin/bash
# 企业级iptables配置脚本
# 清空现有规则
iptables -F
# 允许SSH连接(修改为实际SSH端口)
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许HTTP和HTTPS
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
# 允许内网网段
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -s 172.16.0.0/12 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
5. nat表配置
5.1 共享上网配置(SNAT)
网络环境设置
bash
# 在网关服务器上开启IP转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
配置SNAT规则
bash
# 固定公网IP的SNAT配置
iptables -t nat -I POSTROUTING -s 172.16.1.8 -j SNAT --to-source 192.168.121.7
# 动态IP的SNAT配置(如ADSL拨号)
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
客户端网络配置
bash
# 设置网关和DNS
nmcli connection modify ens36 ipv4.gateway 172.16.1.7 ipv4.dns 114.114.114.114
nmcli connection reload
nmcli connection up ens36
# 测试网络连接
ping www.baidu.com
5.2 端口转发配置(DNAT)
端口映射示例
bash
# 将公网IP的9000端口映射到内网服务器的22端口
iptables -t nat -I PREROUTING -d 192.168.121.7 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.8:22
# 查看NAT规则
iptables -t nat -nL --line-numbers
测试端口转发
bash
# 从外部连接映射端口
ssh root@192.168.121.7 -p 9000
# 实际会连接到172.16.1.8的22端口
5.3 IP映射配置
一对一IP映射
bash
# 将公网IP完全映射到内网服务器
iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
# 查看配置
iptables -t nat -nL
6. 规则保存与恢复
6.1 保存规则
bash
# 保存当前规则到文件
iptables-save > /etc/sysconfig/iptables
# 或者保存到自定义文件
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules
6.2 恢复规则
bash
# 从文件恢复规则
iptables-restore < /etc/sysconfig/iptables
# 从备份文件恢复
iptables-restore < /root/iptables-backup-20250114.rules
6.3 自动化脚本
bash
#!/bin/bash
# iptables规则管理脚本
BACKUP_DIR="/etc/iptables-backup"
DATE=$(date +%Y%m%d_%H%M%S)
case "$1" in
save)
mkdir -p $BACKUP_DIR
iptables-save > $BACKUP_DIR/iptables-$DATE.rules
echo "规则已保存到: $BACKUP_DIR/iptables-$DATE.rules"
;;
restore)
if [ -f "$2" ]; then
iptables-restore < "$2"
echo "规则已从 $2 恢复"
else
echo "文件不存在: $2"
fi
;;
*)
echo "使用方法: $0 {save|restore <文件路径>}"
;;
esac
7. 实战案例
7.1 Web服务器防火墙配置
bash
#!/bin/bash
# Web服务器安全配置
# 基础配置
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许loopback
iptables -I INPUT -i lo -j ACCEPT
# 允许已建立连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH访问(限制来源)
iptables -A INPUT -s 管理IP -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
# 防暴力破解(限制SSH连接频率)
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --set -j ACCEPT
# 保存配置
iptables-save > /etc/sysconfig/iptables
7.2 企业网关配置
bash
#!/bin/bash
# 企业网关iptables配置
# 清空规则
iptables -F
iptables -t nat -F
# 开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# NAT配置(共享上网)
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE
# 端口转发(内网服务发布)
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443
# 安全策略
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/16 -j ACCEPT
iptables -P FORWARD DROP
# 保存配置
service iptables save
7.3 数据库服务器配置
bash
#!/bin/bash
# 数据库服务器防火墙配置
iptables -F
# 默认策略
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 -s 管理网段 -p tcp --dport 22 -j ACCEPT
# 数据库服务(只允许应用服务器访问)
iptables -A INPUT -s 应用服务器IP1 -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -s 应用服务器IP2 -p tcp --dport 3306 -j ACCEPT
# 监控服务
iptables -A INPUT -s 监控服务器IP -p tcp --dport 10050 -j ACCEPT
# 保存规则
iptables-save > /etc/sysconfig/iptables
8. 故障排查与最佳实践
8.1 常见问题
问题1:配置规则后无法连接
解决方案:
bash
# 检查规则顺序
iptables -nL --line-numbers
# 检查默认策略
iptables -P INPUT ACCEPT # 临时解决
# 添加详细日志
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: "
问题2:规则重启后丢失
解决方案:
bash
# 确保服务开机启动
systemctl enable iptables
# 保存规则
iptables-save > /etc/sysconfig/iptables
8.2 最佳实践
- 规则顺序很重要:更具体的规则放在前面
- 先配置允许规则:再设置默认拒绝策略
- 测试前保留管理连接:避免锁定自己
- 及时保存规则:避免重启丢失
- 使用脚本管理:便于批量部署和维护
- 定期备份规则:便于快速恢复
8.3 性能优化建议
- 将常用规则放在前面减少匹配时间
- 避免过度复杂的规则匹配
- 合理使用连接状态匹配
- 定期清理无用规则
9. 相关命令速查
常用命令组合
bash
# 查看规则
iptables -nL --line-numbers
iptables -t nat -nL
# 添加规则
iptables -I INPUT -s IP地址 -j DROP # 封IP
iptables -A INPUT -p tcp --dport 端口 -j ACCEPT # 开放端口
# 删除规则
iptables -D INPUT 行号
iptables -F # 清空所有规则
# NAT配置
iptables -t nat -A POSTROUTING -s 内网网段 -j MASQUERADE # 共享上网
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 外部端口 -j DNAT --to-destination 内网IP:内部端口
# 规则管理
iptables-save > /etc/sysconfig/iptables # 保存
iptables-restore < /etc/sysconfig/iptables # 恢复
参考文档编写时间:2025年1月14日
原始文档来源: www.cnblogs.com/xuruizhao/p...
本文档基于实际生产环境经验编写,涵盖了iptables的核心功能和常见应用场景。建议在生产环境使用前,先在测试环境充分验证。